书中代码是基于UNIX的,刚开始忽略了这一点,程序总报错
File "D:/Python/tsTclnt3.py", line 15, in <module>
tcpCliSock.send(data)TypeError: a bytes-like object is required, not 'str'
在windows下运行要注意编码问题
服务器端书中代码为:
from socket import *
from time import ctime
HOST = ''
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST,PORT)
tcpSerSock = socket(AF_INET,SOCK_STREAM)
tcpSerSock.bind(ADDR)
tcpSerSock.listen(5)
while True:
print('waiting for connection')
tcpCliSock,addr = tcpSerSock.accept()
print('...connected from:',addr)
while True:
data = tcpCliSock.recv(BUFSIZ)
if not data:
break
tcpCliSock.send('[%s] %s' %(bytes(ctime(),'utf-8'),data))
tcpCliSock.close()
tcpSerSock.close()
客户端书中代码为:
from socket import *
HOST = 'localhost'
PORT= 21567
BUFSIZ = 1024
ADDR = (HOST,PORT)
tcpCliSock = socket(AF_INET,SOCK_STREAM)
tcpCliSock.connect(ADDR)
while True:
data = input('>')
if not data:
break
tcpCliSock.send(data)
data = tcpCliSock.recv(BUFSIZ)
if not data:
break
print(data)
tcpCliSock.close()
更改编码问题之后代码为:
服务器端:
from socket import *
from time import ctime
HOST = ''
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST,PORT)
tcpSerSock = socket(AF_INET,SOCK_STREAM)
tcpSerSock.bind(ADDR)
tcpSerSock.listen(5)
while True:
print('waiting for connection')
tcpCliSock,addr = tcpSerSock.accept()
print('...connected from:',addr)
while True:
data = tcpCliSock.recv(BUFSIZ).decode() #接受的数据要解码
if not data:
break
tcpCliSock.send(('[%s] %s' %(ctime(),data)).encode()) #发送的数据要编码
tcpCliSock.close()
tcpSerSock.close()
客户端:
from socket import *
HOST = 'localhost'
PORT= 21567
BUFSIZ = 1024
ADDR = (HOST,PORT)
tcpCliSock = socket(AF_INET,SOCK_STREAM)
tcpCliSock.connect(ADDR)
while True:
data = input('>')
if not data:
break
tcpCliSock.send(data.encode()) #发送的数据要编码
data = tcpCliSock.recv(BUFSIZ).decode() #接受的数据要解码
if not data:
break
print(data)
tcpCliSock.close()