网络编程之TCP服务器与客户端(《Core Python Programming》)

书中代码是基于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()

猜你喜欢

转载自blog.csdn.net/dxcve/article/details/80868611
今日推荐