zoukankan      html  css  js  c++  java
  • day26-2 基于TCP协议的套接字编程

    基于TCP协议的套接字编程

    套接字

    套接字有两种,分别是基于文件型和基于网络型

    • 基于文件类型的套接字家族:AF_UNIX,unix一切皆文件,基于文件的套接字调用的就是底层的文件系统来取数据,两个套接字进程运行在同一机器,可以通过访问同一文件系统间接完成通信
    • 基于网络类型的套接字家族:AF_INET

    套接字工作流程

    服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待用户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接

    基于TCP协议的套接字编程(简单)

    服务端

    import socket
    
    
    # 创建符合TCP协议的服务端
    server = socket.socket(socket.AF_INET,
                           socket.SOCK_STREAM)  # TCP协议称为流失协议,UDP称为数据报协议SOCK_DGRAM
    
    # 绑定端口
    server.bind(('127.0.0.1', 8000))  # 127.0.0.1代表本地
    
    # 对端口进行监听
    server.listen(5)  # 半连接池,限制的是请求书
    
    # 等待客户端连接
    print('start....')
    conn, client_addr = server.accept()
    print('conn: ', conn)
    print('client_addr: ', client_addr)
    
    # 收到消息
    data = conn.recv(1024)  # 限制最大接收的字节数
    print('来自客户端的数据: ', data)
    
    # 回消息
    conn.send(data.upper())  # 将数据变大写
    
    # 关闭连接
    conn.close()
    
    # 关闭服务器
    server.close()
    

    客户端

    import socket
    
    # 创建符合TCP协议的客户端
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    # 连接服务端端口
    client.connect(('127.0.0.1', 8000))
    
    # 发送消息
    client.send('hello'.encode('utf8'))
    
    # 接收服务端返回的消息
    data = client.recv(1024)
    print('来自服务端的数据:', data)
    
    # 关闭客户端
    client.close()
    

    基于TCP协议的套接字编程(循环)

    服务端

    import socket
    
    # 创建符合TCP协议的服务端
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    # 绑定端口
    server.bind(('127.0.0.1', 8000))
    
    # 对端口进行监听
    server.listen(5)
    
    # 等待客户端连接
    print('start...')
    
    # 链接循环
    while True:
        conn, client_addr = server.accept()
    
        # 通信循环
        while True:
            try:
                # 接收消息
                data = conn.recv(1024)
                print('来自客户端的数据:', data)
    
                # 回消息
                conn.send(data)
            except ConnectionResetError:  # 捕捉客户端与服务端关闭连接
                break
    

    客户端1

    import socket
    
    # 创建符合TCP协议的客户端
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    # 连接服务端端口
    client.connect(('127.0.0.1', 8000))
    
    while True:
        # 发送消息
        msg = input('please enter msg>>>')
        client.send(msg.encode('utf8'))
    
        # 接收消息
        data = client.recv(1024)
        print('来自服务端的数据:', data.upper())
    

    客户端2

    import socket
    
    # 创建符合TCP协议的客户端
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    # 连接服务端端口
    client.connect(('127.0.0.1', 8000))
    
    while True:
        # 发送消息
        msg = input('please enter msg>>>')
        client.send(msg.encode('utf8'))
    
        # 接收消息
        data = client.recv(1024)
        print('来自服务端的数据:', data.upper())
    

    在服务器连接客户端1时,虽然能监听客户端2,但不能给客户端2返回消息,将客户端1关闭后即断开连接,给客户端2返回数据

  • 相关阅读:
    struts2 spring3 整合
    SilverLight 银光 基础.net 跨网页,桌面软件体验更好,但是要这个插件
    struts 理解 action
    vb 坐标点击
    错误struts2 json There is no Action mapped for namespace
    struts 与 jquery 整合
    springmvc jquery 界面没回应
    css 相关学习
    spring + ehcache 配置
    jquery json 结合
  • 原文地址:https://www.cnblogs.com/863652104kai/p/11091317.html
Copyright © 2011-2022 走看看