美文网首页
Socket学习

Socket学习

作者: jinjin1009 | 来源:发表于2021-06-22 11:40 被阅读0次

    一、正常的TCP/IP协议关系

    image.png
    可以看到,协议主要包括链路层、网络层、传输层、应用层

    二、Socket所处位置

    image.png
    Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
    Socket又称“套接字”,应用程序通常通过“套接字”向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通信。

    三、Socket通信具体过程

    image.png
    服务器端:服务器端先初始化Socket,然后与端口绑定bind,对端口进行监听listen,调用accept阻塞,等待客户端连接。在这时如果有一个客户端初始化Socket,然后连接服务器connect,如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。
    # socket_server.py 服务端
    import socket
    
    # 建立一个服务端
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    host = socket.gethostname()
    port = 1234
    # 绑定要监听的主机和端口号
    server.bind((host, port))
    # 开始监听,可以使用五个链接排队
    server.listen(5)
    
    while True:
        # conn 就是客户端链接过来在服务端生成的一个链接实例
        conn, addr = server.accept()
        print('链接地址为:{}'.format(addr))
    
        while True:
            try:
                # 接收客户端发送过来的数据
                data = conn.recv(1024)
                print('server recive:{}'.format(data.decode()))
                # 向客户端发送数据
                conn.send(data.upper())
            except ConnectionResetError as e:
                print('关闭了正在占线的链接')
                break
        # 接收客户端的连接关闭要求,关闭连接
        conn.close()
    
    # socket_client.py 客户端
    import socket
    
    client = socket.socket()
    host = socket.gethostname()
    port = 1234
    # 连接服务端
    client.connect((host, port))
    
    while True:
        msg = 'welcome to cai niao'
        # 向服务端发送数据
        client.send(msg.encode('utf-8'))
        # 接收服务端的数据
        data = client.recv(1024)
        print('client recv:{}'.format(data.decode()))
    
    client.close()
    

    相关文章

      网友评论

          本文标题:Socket学习

          本文链接:https://www.haomeiwen.com/subject/nhipyltx.html