请教Python网络编程中遇到的问题

最近在看《Python核心编程》这本书。对于其中的网络编程部分内容,刚开始就遇到了问题,却一直没搞明白是为什么,列出来,求高手指教。
sokcet 测试时。按照书上的例子,创建了TCP服务器和TCP客户端,使用两个命令行窗口来检验。
TCP服务器端:

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
        # print(type(data))
        tcpCliSock.send('[%s] %s' % (bytes(ctime(), 'utf-8'), data))

    tcpCliSock.close()
tcpSerSock.close()

Client端代码如下:

from socket import *


HOST = '127.0.0.1'
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('utf-8'))
    data = tcpCliSock.recv(BUFSIZ)
    if not data:
        break
    print(data.decode('utf-8'))

tcpCliSock.close()

运行服务器端代码后,再运行客户端代码,服务器端在等待客户端发起连接后,接受来自客户端消息时就报错。


20200105163225.png

代码tcpCliSock.send('[%s] %s' % (bytes(ctime(), 'utf-8'),data)) 中,data的类型确是bytes,并且将str类型的ctime()转换成了bytes类型,还是报错。前面我是卡在这好久,后来看了python3的文档,晓得是 2.x 和3版本的差异。这里主要是字节码和字符串码。上述代码修改如下即可:
TCP服务器端:

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('utf-8')
        print(data)
        if not data:
            break
        # print(type(data))
        tcpCliSock.send(('[%s] %s' % (ctime(), data).encode('utf-8'))

    tcpCliSock.close()
tcpSerSock.close()

Client端代码如下:

from socket import *


HOST = '127.0.0.1'
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('utf-8'))
    data = tcpCliSock.recv(BUFSIZ).decode('utf-8')
    if not data:
        break
    print(data)

tcpCliSock.close()

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容