简介:最近在进行网络通讯的学习时候遇到了这个问题,使用的版本是Python3.5.2,启动服务器端,再启动客户端通讯时候遇到该问题,并且直接出错无法继续执行
服务端的程序是一个UDP通讯程序
import socket
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.bind(('127.0.0.1',9999))
print('Bind UDP on 9999....')
while True:
data,addr=s.recvfrom(1024)
print('Received from %s:%s.' % addr)
s.sendto(b'Hello,%s!' % data,addr)
s.close()
客户端程序会发送一段话给服务器端,服务器端会将这句话加上字符串之后回传
import socket
import time
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
failuretime = 0
def udpsend(str):
s.sendto(str, ('127.0.0.1', 9999))
recdata = s.recv(1024).decode()
s.close()
return
udpsend('hello')
本来是简单的不行的一个程序却屡次碰壁
比如,以上的运行时候就会出错,提示 TypeError: a bytes-like object is required, not 'str'
原因不明,按照意思来说是我的传值不对,应该传入的是bytes类型而不是string,既然这样那就把传值改了,改为二进制吧
udpsend(b'hello')
结果提示 BrokenPipeError: [Errno 32] Broken pipe
然后,我找了一个可以使用的函数
def udpsend2(str):
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.sendto(str,('127.0.0.1',9999))
print(s.recv(1024).decode('utf-8'))
s.close()
对比我写的
def udpsend(str):
s.sendto(str, ('127.0.0.1', 9999))
recdata = s.recv(1024).decode('utf-8')
print(recdata)
s.close()
return
所以我发现最后导致问题的,是我在这里出现了一个错误,在建立链接时候,错用了SOCK_STREAM模式,该模式是给TCP通讯使用的,会保证有握手过程,信息一定收到,而服务端是UDP监听
最后
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
改为
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
解决