在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()