当前位置: 移动技术网 > IT编程>脚本编程>Python > 小记

小记

2018年06月07日  | 移动技术网IT编程  | 我要评论

权御天下歌词,蛙道网,农历十月十五

问题TypeError: a bytes-like object is required, not 'str'(python3.5)
在python核心编程第三版de网络编程的示例有错误

示例代码(服务器端):
HOST='localhost'
PORT=1040
BUFSIZ=1024
ADDR=(HOST,PORT)
tcpsock=socket(AF_INET,SOCK_STREAM)
tcpsock.bind(ADDR)
tcpsock.listen(5)
while True:
    print('waiting for connection...')
    tcpClient,addr=tcpsock.accept()
    print('....connected from :',addr)
    while 1:
        data=tcpClient.recv(BUFSIZ)
        if not data:
            break
        tcpClient.send('[%s] %s'%(bytes(ctime(),'utf-8'),data))
    tcpClient.close()
客户端:
from socket import *
HOST='localhost'
PORT=1040
BUFSIZ=1024
ADDR=(HOST,PORT)
tcpsock=socket(AF_INET,SOCK_STREAM)
tcpsock.connect(ADDR)
while 1:
    data=input('>')
    if not data:
        break
    tcpsock.send(data)
    data=tcpsock.recv(BUFSIZ)
    if not data:
        break
    print(data)
tcpsock.close()
按书上的代码跑不通的,原因是数据在网络是以bytes传输,需要把str转换成bytes
python可以直接通过bytes()方法转换

修正后(服务器端):
from socket import *
from time import ctime
HOST='localhost'
PORT=1040
BUFSIZ=1024
ADDR=(HOST,PORT)
tcpsock=socket(AF_INET,SOCK_STREAM)
tcpsock.bind(ADDR)
tcpsock.listen(5)
while True:
    print('waiting for connection...')
    tcpClient,addr=tcpsock.accept()
    print('....connected from :',addr)
    while 1:
        data=tcpClient.recv(BUFSIZ)
        if not data:
            break
        tcpClient.send('b[%s] %s'%(bytes(ctime(),'utf-8'),data))    #注意这行,加了b
    tcpClient.close()
客户端:
from socket import *
HOST='localhost'
PORT=1040
BUFSIZ=1024
ADDR=(HOST,PORT)
tcpsock=socket(AF_INET,SOCK_STREAM)
tcpsock.connect(ADDR)
while 1:
    data=input('>')
    if not data:
        break
    tcpsock.send((bytes(data.encode('utf-8'))))  #注意,把data转换成BYTES
    data=tcpsock.recv(BUFSIZ)
    if not data:
        break
    print(data.decode('utf-8'))    #注意,把bytes转换成str输出
tcpsock.close()

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网