小肥羊要进步

Python网络编程 - TCP编程

关于网络编程中字符编码相关说明:
  • 网络编程中,服务器和浏览器只认bytes 类型数据。
  • send 函数的参数和 recv 函数的返回值都是 bytes 类型
 
4种字符类型的编码:
  • ASCII:一个字节(byte)8比特位(bit),每个比特位表示0/1,除去一个奇偶校验位,ASCII码用1个字节编码表示128个字符,数字和符号。
  • Unicode:处理中文或者其他语言,至少需要2个字节,甚至复杂的字符需要更多字节,所以Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。
  • UTF-8:如果全英文表示,比如代码,用Unicode编码比ASCII编码需要多一倍的存储空间。因此发明了“可变长编码”的UTF-8编码。UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。
  • GBK:中国的汉字编码方案,包含GB2312,和Unicode可以一一对应。
 
字符的编码encoding和解码decoding:
  • python3内存中的默认编码为unicode(str类型表示),存储的时候默认以UTF-8存储(二进制数据byte类型表示)。
  • encode:str --> bytes
  • decode:bytes --> str
  • 用例1:服务器端和客户端通讯1
     
    服务器端
    import socket
     
    # 创建服务器端套接字
    sk = socket.socket()
     
    # 把地址绑定到套接字
    sk.bind(('127.0.0.1',8898)) 
     
    # 监听链接
    sk.listen()          
     
    # 接受客户端链接
    conn,addr = sk.accept() 
     
    # 接收客户端信息
    ret = conn.recv(1024)  
     
    # 打印客户端信息
    print('客户端信息:', ret.decode('utf-8'))
     
    # 向客户端发送信息
    conn.send(bytes("HELLO,我是服务器", encoding='utf-8'))    
     
    # 关闭客户端链接
    conn.close()       
     
    #关闭服务器套接字
    sk.close()        
     
    客户端
    import socket
     
    # 创建客户端套接字
    sk = socket.socket()           
     
    # 尝试连接服务器
    sk.connect(('127.0.0.1',8898)) 
     
    # 对话发送
    sk.send(bytes("HELLO,我是客户端", encoding='utf-8'))
     
    # 对话接收
    ret = sk.recv(1024)    
     
    # 打印服务器端信息        
    print('服务器端信息:', ret.decode('utf-8'))
     
    # 关闭客户端套接字
    sk.close()                    
     
    运行:
    在Pycham中打开Terminal1,运行服务器程序,此时服务器端在等待客户端消息
    (python3_for_training) U:\Project\Python_Training\Pytho_Basic>python TcpServerSimple.py
     
    在Pycham中打开Terminal2,运行客户端程序,此时客户端接收到了服务器端发送的'hi',打印显示,客户端回送消息'hello'。
    (python3_for_training) U:\Project\Python_Training\Pytho_Basic>python TcpClientSimple.py
    b'hi'
     
    此时再查看Terminal1,服务器端已经接收到客户端的消息,打印并显示
    (python3_for_training) U:\Project\Python_Training\Pytho_Basic>python TcpServerSimple.py
    b'hello!'
     

     
    用例2:服务器端和客户端通讯2
     
    服务器端
    import socket
     
    # 创建服务器端套接字
    sk = socket.socket()
     
    # 设置给定套接字选项的值。
    sk.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
     
    # 把地址绑定到套接字
    sk.bind(('127.0.0.1', 8898))
     
    # 监听链接
    sk.listen()
     
    # 接受客户端链接
    conn, addr = sk.accept()
     
    while True:
        # 接收客户端信息
        ret = conn.recv(1024)
     
        # 打印客户端信息
        print(ret.decode('utf-8'))
     
        # 结束处理
        if ret == b'bye':
            conn.send(b'bye')
            break
     
        info = input('>>>')
        conn.send(bytes(info, encoding='utf-8'))
     
    # 关闭客户端链接
    conn.close()
     
    # 关闭服务器套接字
    sk.close()     
     
    客户端
    import socket
     
    # 创建客户端套接字
    sk = socket.socket()           
     
    # 尝试连接服务器
    sk.connect(('127.0.0.1',8898))
     
    while True:
        # 信息发送
        info = input('>>>')
        sk.send(bytes(info,encoding='utf-8'))
     
        # 信息接收
        ret = sk.recv(1024)
     
        # 结束会话
        if ret == b'bye':
            sk.send(b'bye')
            break
     
        # 信息打印
        print(ret.decode('utf-8'))
     
    # 关闭客户端套接字
    sk.close()                    
     
    运行:
    在Pycham中打开Terminal1,运行服务器程序,可以和客户端程序聊天,打bye结束。
    (python3_for_training) U:\Project\Python_Training\Pytho_Basic>python TcpServerSimple.py
    你好啊
    >>>你好
    你有空吗
    >>>不,我没空
    bye
     
    在Pycham中打开Terminal2,运行客户端程序,可以和服务器程序聊天,打bye结束。
    (python3_for_training) U:\Project\Python_Training\Pytho_Basic>python TcpClientSimple.py
    >>>你好啊
    你好
    >>>你有空吗
    不,我没空
    >>>bye

posted on 2020-10-18 15:58  小肥羊要进步  阅读(197)  评论(0编辑  收藏  举报

导航