详解python3中socket套接字的编码问题解决
一、TCP
1、tcp服务器创建
#创建服务器
fromsocketimport*
fromtimeimportctime#导入ctime
HOST=''#任意主机
PORT=21567#随机提供个端口号
BUFSIZ=1024#缓冲区大小设置为1KB,可以根据网络性能和程序需要改变这个容量
ADDR=(HOST,PORT)
tcpSerSock=socket(AF_INET,SOCK_STREAM)#分配了TCP服务器套接字
tcpSerSock.bind(ADDR)#绑定到服务器地址以及开启TCP监听器的调用。
tcpSerSock.listen(5)#listen()方法的参数是在连接被转接或拒绝之前,传入连接请求的最大数
"""
一旦进入服务器的无限循环之中,我们就(被动地)等待客户端的连接。当一个连接请求出
现时,我们进入对话循环中,在该循环中我们等待客户端发送的消息。如果消息是空白的,这意
味着客户端已经退出,所以此时我们将跳出对话循环,关闭当前客户端连接,然后等待另一个客
户端连接。如果确实得到了客户端发送的消息,就将其格式化并返回相同的数据,但是会在这些
数据中加上当前时间戳的前缀。最后一行永远不会执行,它只是用来提醒读者,如果写了一个处
理程序来考虑一个更加优雅的退出方式,正如前面讨论的,那么应该调用close()方法。
"""
whileTrue:
print("waitingforconnection")
tcpCliSock,addr=tcpSerSock.accept()#接收客户端连接,返回客户端和地址
print("...connectedfrom:",addr)
whileTrue:
data=tcpCliSock.recv(BUFSIZ).decode()#对话(接收/发送)接收客户端的data
ifnotdata:
break
tcpCliSock.send(('service:'+ctime()+'--'+data).encode())#发送时间戳和data信息给客户端
tcpCliSock.close()
tcpSerSock.close()
2、tcp客户端创建
fromsocketimport*
HOST='localhost'
PORT=21567#端口号PORT应该与你为服务器设置的完全相同(否则,将无法进行通信)
BUFSIZ=1024
ADDR=(HOST,PORT)
tcpCliSock=socket(AF_INET,SOCK_STREAM)#分配TCP客户端套接字
tcpCliSock.connect(ADDR)#主动连接
"""
我们必须解码来自服务器端的字符串(借助于distutils.log.warn()
"""
whileTrue:
data=input(">")
ifnotdata:#用户如果没有输入,则终止
break
tcpCliSock.send(data.encode())#发送客户端的data给服务器
data=tcpCliSock.recv(BUFSIZ).decode()#接收服务器的data
ifnotdata:#或者服务器终止且对recv()方法的调用失败
break
print('返回:%s'%data)
tcpCliSock.close()
二、UDP
1、UDP服务器创建
"""
这个脚本创建一个UDP服务器,它接受客户端发来的消息,并将加了时间戳前缀的该消息返回给客户端。
"""
fromsocketimport*
fromtimeimportctime
HOST=""
PORT=21567
BUFSIZ=1024
ADDR=(HOST,PORT)
udpServer=socket(AF_INET,SOCK_DGRAM)
udpServer.bind(ADDR)
whileTrue:
print("waitingformasssage")
data,addr=udpServer.recvfrom(BUFSIZ)#接收
data=data.decode()
udpServer.sendto((ctime()+"--"+data).encode(),addr)
print("receivedfromandreturnedto",addr)
udpServer.close()
2、UDP客户端创建
#这个脚本创建一个UDP客户端,它提示用户输入发送给服务器的消息,并接收服务器加了时间戳前缀的消息,然后将它们显示给用户。
fromsocketimport*
HOST='localhost'
PORT=21567#端口号PORT应该与你为服务器设置的完全相同(否则,将无法进行通信)
BUFSIZ=1024
ADDR=(HOST,PORT)
udpCS=socket(AF_INET,SOCK_DGRAM)
whileTrue:
data=input(">")
ifnotdata:
break
udpCS.sendto(data.encode(),ADDR)
data,ADDR=udpCS.recvfrom(BUFSIZ)
ifnotdata:
break
print(data)
udpCS.close()
其实道理都差不多,在python3中,利用套接字传输的内容都以byte形式传输,这时候传送时(send/sendto)需要encode,接收(recv)时需要decode。只要掌握这个重点,处理这个问题就很简单了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。