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.pyb'hi'此时再查看Terminal1,服务器端已经接收到客户端的消息,打印并显示(python3_for_training) U:\Project\Python_Training\Pytho_Basic>python TcpServerSimple.pyb'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')breakinfo = 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