今天学习了下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不兼容。
接下来跑下服务器和客户端:
完美,已经连上了,然后在客户端输入点东西试试:
WTF?客户端服务器都炸了
让我们看下错误原因a bytes-like object is required, not 'str',意思是该方法需要byte类型的而我们给了str类型的,还好有点编码的知识,修改下客户端的代码:
tcpsocket.send(bytes(data, 'utf-8'))
客户端还是直接挂掉了,但是却没有报错,我们看到服务器这边能得到发送的消息了(上次是空的),错误和客户端类似?那还是编码的问题,简单!
修改服务器代码:
tcpclisock.send('[%s] %s' % (bytes(ctime(), 'utf-8'), bytes(data, 'utf-8')))
然后继续跑:
这个错误就不是很清楚了,我想大概意思是需要str参数却没有?
这个时候我注意到recv()和send()应该传的都是byte类型的(联想到我们第一次改客户端代码的编码问题),也就是说data已经是byte类型的了,不需要这样再强转,而send发送的似乎是str类型的,我们再次修改代码:
tcpclisock.send(b'[%s] %s' % (bytes(ctime(), 'utf-8'), data))
成功!书上的代码也不一定对,看来还是需要多实践。