在python3中,bytes string和unicodestring是两种不同的类型。
由于python3中,字符串str在内存中是以unicode表示,一个字符对应多个字节。如果在网上传输,就需要将str转化为以字节为单位的bytes。
例如,在做套接字试验时,客户端与服务端经行数据传输时,不进行字符转换,会报错。如下,
TypeError:'str' does not support the buffer interface
以unicode表示的str通过encode()方法按制定的编码方式编码为指定的bytes。
例如,data.encode(‘utf-8’),data.encode('ascii')
在另一方面,从网络中读取数据,读到的数据时bytes。就要把bytes转换为str,就需要decode()方法。
data.decode('utf-8')
ps:最近在看核心编程(第三版),在做实验时就遇到了此问题。
下面时服务端代码:
#!/usr/bin/python3.4 # -*- coding: utf-8 -*- from socket import socket,AF_INET,SOCK_STREAM from time import ctime def main(): HOST='' PORT=21570 BUFFSIZE=1024 ADDR=(HOST,PORT) tcpSerSock = socket(AF_INET,SOCK_STREAM) tcpSerSock.bind(ADDR) tcpSerSock.listen(5) while True: print("waiting for connection...") tcpClientSock,addr = tcpSerSock.accept() print("...connected from:{}".format(addr)) while True: data = tcpClientSock.recv(BUFFSIZE).decode('utf-8') if not data: break tcpClientSock.send(data.encode('utf-8')) tcpClientSock.close() tcpSerSock.close() if __name__ == '__main__': main()
#!/usr/bin/python3.4 # -*- coding: utf-8 -*- from socket import socket,AF_INET,SOCK_STREAM def main(): HOST='localhost' PROT=21570 BUFFSIZE=1024 ADDR=(HOST,PROT) tcpClientSock = socket(AF_INET,SOCK_STREAM) tcpClientSock.connect(ADDR) while True: data = input('> ') if not data: break tcpClientSock.send(data.encode('utf-8')) data = tcpClientSock.recv(BUFFSIZE).decode('utf-8') if not data: break print(data) tcpClientSock.close() if __name__ == '__main__': main()