python3网络编程

今天学习了下python核心编程中的网络编程,话不多说,进入正题


环境:python3 win7 64位


先是tcp的客户端

from socket import *
from time import ctime

HOST = '10.254.7.26'
PORT = 12345
BUFSIZE = 1024

tcpsocket = socket(AF_INET, SOCK_STREAM)
tcpsocket.bind((HOST, PORT))
tcpsocket.listen(5)

while True:
    print('wait for connection......')
    tcpclisock, addr = tcpsocket.accept()
    print('connected from:', addr)

    while True:
        data = tcpclisock.recv(BUFSIZE)
        if data == 'quit':
            break
        print(data, 'from', addr)
        tcpclisock.send('[%s] %s' % (bytes(ctime(), 'utf-8'), data))

    tcpclisock.close()
tcpsocket.close()
然后是tcp客户端

from socket import *
from time import ctime

HOST = '10.254.7.26'
PORT = 12345
BUFSIZE = 1024

tcpsocket = socket(AF_INET, SOCK_STREAM)
tcpsocket.connect((HOST, PORT))

while True:
    data = input()
    if data == 'quit':
        break
    tcpsocket.send(data)
    data = tcpsocket.recv(BUFSIZE)
    if not data:
        break
    print(data.decode('utf-8'))
tcpsocket.close()
由于书上有专门的python3代码演示,比较开心,毕竟有些地方python2和3不兼容。

接下来跑下服务器和客户端:

完美,已经连上了,然后在客户端输入点东西试试:

python3网络编程_第1张图片

python3网络编程_第2张图片

WTF?客户端服务器都炸了

让我们看下错误原因a bytes-like object is required, not 'str',意思是该方法需要byte类型的而我们给了str类型的,还好有点编码的知识,修改下客户端的代码:

tcpsocket.send(bytes(data, 'utf-8'))

python3网络编程_第3张图片

客户端还是直接挂掉了,但是却没有报错,我们看到服务器这边能得到发送的消息了(上次是空的),错误和客户端类似?那还是编码的问题,简单!

修改服务器代码:

tcpclisock.send('[%s] %s' % (bytes(ctime(), 'utf-8'), bytes(data, 'utf-8')))

然后继续跑:

python3网络编程_第4张图片
这个错误就不是很清楚了,我想大概意思是需要str参数却没有?

这个时候我注意到recv()和send()应该传的都是byte类型的(联想到我们第一次改客户端代码的编码问题),也就是说data已经是byte类型的了,不需要这样再强转,而send发送的似乎是str类型的,我们再次修改代码:

tcpclisock.send(b'[%s] %s' % (bytes(ctime(), 'utf-8'), data))

python3网络编程_第5张图片

成功!书上的代码也不一定对,看来还是需要多实践。


你可能感兴趣的:(python)