Unicode数据和网络通信
不同于标准输入和输出流,网络套接字是字节流,默认情况下不支持编码。因此,如果程序希望通过网络发送或接收Unicode数据,那么在将数据写至一个套接字之前必须先将数据编码为字节。下例中的服务器会把接收到的数据回送给发送者。
新建codecs_socket_fail.py文件。
import sys
import socketserver
class Echo(socketserver.BaseRequestHandler):
def handle(self):
data = self.request.recv(1024)
self.request.send(data)
return
if __name__ == '__main__':
import codecs
import socket
import threading
address = ('localhost', 0)
server = socketserver.TCPServer(address, Echo)
ip, port = server.server_address
t = threading.Thread(target=server.serve_forever)
t.setDaemon(True)
t.start()
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip, port))
text = 'français'
len_sent = s.send(text)
response = s.recv(len_sent)
print(repr(response))
s.close()
server.socket.close()
以上代码输出结果为:
Traceback (most recent call last):
File "codecs_socket_fail.py", line 43, in
len_sent = s.send(text)
TypeError: a bytes-like object is required, not 'str'
以上代码,可以在每个send()调用之前对数据显示编码,不过如果少一个send()调用,则会导致编码错误。