socket通信

  1. socket套接字.

    五层协议: 从传输层包括传输层一下,都是操作系统帮助我们封装的各种head.你不用去关心.

    # content = input('>>>')
    # print(content)
    # 怎么交给操作系统( ⊙o⊙ )?
    # 模块,或者内置函数 必须有方法内置的一些代码接收数据,然后在底层交由操作系统.
    
    # socket套接字充当的就是内置模块的角色.
    
    # 你说一下socket的套接字?
    '''
    socket 套接字,它存在于传输层与应用层之间的抽象层,
        1. 避免你学习各层的接口,以及协议的使用, socket已经封装好了所有的接口.
            直接使用这些接口或者方法即可,使用起来方便,提升开发效率.
        2. socket就是一个模块.通过使用学习模块提供的功能,
            建立客户端与服务端的通信,使用方便.
    '''
    
  2. 基于TCP协议的socket通信.

  3. 单个客户与服务端通信.

    服务端:

    # content = input('>>>')
    # print(content)
    # 怎么交给操作系统( ⊙o⊙ )?
    # 模块,或者内置函数 必须有方法内置的一些代码接收数据,然后在底层交由操作系统.
    
    # socket套接字充当的就是内置模块的角色.
    
    # 你说一下socket的套接字?
    '''
    socket 套接字,它存在于传输层与应用层之间的抽象层,
        1. 避免你学习各层的接口,以及协议的使用, socket已经封装好了所有的接口.
            直接使用这些接口或者方法即可,使用起来方便,提升开发效率.
        2. socket就是一个模块.通过使用学习模块提供的功能,
            建立客户端与服务端的通信,使用方便.
    '''
    

    客户端:

    import socket
    
    # 1. 创建socket对象(买手机)
    phone = socket.socket() # 可以默认不写
    
    # 连接服务器ip地址与端口
    phone.connect(('127.0.0.1', 8848))
    
    # 发消息
    to_server = input('>>>').strip()
    phone.send(to_server.encode('utf-8'))
    # 接收消息
    from_server_data = phone.recv(1024)  # 夯住,等待服务端的数据传过来
    print(f'来自服务端消息:{from_server_data.decode("utf-8")}')
    
    # 关机
    phone.close()
    
    
    
  4. 通信循环.

    服务端:

    import socket
    
    phone = socket.socket()
    
    phone.bind(('127.0.0.1', 8888))
    
    phone.listen(5)
    
    # 4. 接收连接
    while 1:
        print('start')
        conn, addr = phone.accept()  # 程序夯住
        print(conn,addr)
        while 1:
            try:
                from_client_data = conn.recv(1024)  # 至多接收1024个字节
                if from_client_data == b'q':
                    break
                print(f'来自客户端{addr}消息{from_client_data.decode("utf-8")}')
                to_client = input('>>>')
                conn.send(to_client.encode('utf-8'))
            except ConnectionResetError:
                break
        conn.close()
    phone.close()
    

    客户端:

    import socket
    
    # 1. 创建socket对象(买手机)
    phone = socket.socket() # 可以默认不写
    
    # 连接服务器ip地址与端口
    phone.connect(('127.0.0.1', 8888))
    
    # 发消息
    while 1:
        to_server = input('>>>').strip()
        if to_server.upper() == 'Q':
            phone.send('q'.encode('utf-8'))
            break
        phone.send(to_server.encode('utf-8'))
        # 接收消息
        from_server_data = phone.recv(1024)  # 夯住,等待服务端的数据传过来
        print(f'来自服务端消息:{from_server_data.decode("utf-8")}')
    
    # 关机
    phone.close()
    
  5. 通信,连接循环.

    服务端:

    # import socket
    #
    # # phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    # # 1. 创建socket对象(买手机)
    # phone = socket.socket() # 可以默认不写
    #
    # # 2. 绑定ip地址和端口(办卡)
    # phone.bind(('127.0.0.1', 8848))  # 本地回环地址
    #
    # # 3. 监听.(开机状态)
    # phone.listen(5)
    #
    # # 4. 接收连接
    # print('start')
    # conn, addr = phone.accept()  # 程序夯住
    # # print(conn,addr)
    # while 1:
    #     from_client_data = conn.recv(1024)  # 至多接收1024个字节
    #     print(f'来自客户端{addr}消息{from_client_data.decode("utf-8")}')
    #     to_client = input('>>>')
    #     conn.send(to_client.encode('utf-8'))
    #
    # conn.close()
    # phone.close()
    
    # 无论你的客户端是否正常关闭,服务端都应该正常关闭,而不是报错.
    
    
    import socket
    
    # phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    # 1. 创建socket对象(买手机)
    phone = socket.socket() # 可以默认不写
    
    # 2. 绑定ip地址和端口(办卡)
    phone.bind(('127.0.0.1', 8888))  # 本地回环地址
    
    # 3. 监听.(开机状态)
    phone.listen(5)
    
    # 4. 接收连接
    print('start')
    conn, addr = phone.accept()  # 程序夯住
    # print(conn,addr)
    while 1:
        try:
            from_client_data = conn.recv(1024)  # 至多接收1024个字节
            if from_client_data == b'q':
                break
            print(f'来自客户端{addr}消息{from_client_data.decode("utf-8")}')
            to_client = input('>>>')
            conn.send(to_client.encode('utf-8'))
        except ConnectionResetError:
            break
    conn.close()
    phone.close()
    

    客户端:

    import socket
    
    # 1. 创建socket对象(买手机)
    phone = socket.socket() # 可以默认不写
    
    # 连接服务器ip地址与端口
    phone.connect(('127.0.0.1', 8888))
    
    # 发消息
    while 1:
        to_server = input('>>>').strip()
        if to_server.upper() == 'Q':
            phone.send('q'.encode('utf-8'))
            break
        phone.send(to_server.encode('utf-8'))
        # 接收消息
        from_server_data = phone.recv(1024)  # 夯住,等待服务端的数据传过来
        print(f'来自服务端消息:{from_server_data.decode("utf-8")}')
    
    # 关机
    phone.close()
    
  6. 利用socket完成获取远端命令的示例.

    while 1:
        try:
            from_client_data = conn.recv(1024)  #至多接受1024字节
            obj = subprocess.Popen(from_client_data.decode("utf_8"),
                                   shell=True,
                                   stdout=subprocess.PIPE,
                                   stderr=subprocess.PIPE,
                                   )
            result = obj.stdout.read()+ obj.stderr.read()
            conn.send(result)
        except ConnectionResetError:
            break
    
  7. 黏包现象.

  8. 今日总结

    名词,协议整理.

原文地址:https://www.cnblogs.com/W-Y-C/p/11196067.html