视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
python3中socket套接字相关的问题
2020-11-27 14:23:42 责编:小采
文档


本篇文章主要介绍了详解python3中socket套接字的编码问题解决,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

一、TCP

1、tcp服务器创建

#创建服务器
from socket import *
from time import ctime #导入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()方法。
"""
while True:
 print("waiting for connection")
 tcpCliSock, addr = tcpSerSock.accept() # 接收客户端连接,返回客户端和地址
 print("...connected from:", addr)

 while True:
 data = tcpCliSock.recv(BUFSIZ).decode() #对话(接收 / 发送) 接收客户端的data
 if not data:
 break
 tcpCliSock.send(('service:'+ctime()+'--'+data).encode()) #发送时间戳 和data信息给客户端

 tcpCliSock.close()
tcpSerSock.close()

2、tcp客户端创建

from socket import *

HOST = 'localhost'
PORT = 21567 #端口号 PORT 应该与你为服务器设置的完全相同(否则,将无法进行通信)
BUFSIZ = 1024
ADDR = (HOST, PORT)

tcpCliSock = socket(AF_INET, SOCK_STREAM) #分配 TCP 客户端套接字
tcpCliSock.connect(ADDR) #主动连接

"""
 我们必须解码来自服务器端的字符串(借助于distutils.log.warn()

"""
while True:
 data = input("> ")
 if not data: #用户如果没有输入,则终止
 break
 tcpCliSock.send(data.encode()) #发送客户端的data给服务器
 data = tcpCliSock.recv(BUFSIZ).decode() #接收服务器的data
 if not data: #或者服务器终止且对 recv()方法的调用失败
 break
 print('返回:%s'%data)
tcpCliSock.close()

二、UDP

1、UDP服务器创建

"""
 这个脚本创建一个 UDP 服务器,它接受客户端发来的消息,并将加了时间戳前缀的该消息返回给客户端。
"""
from socket import *

from time import ctime
HOST = ""

PORT = 21567

BUFSIZ = 1024

ADDR = (HOST, PORT)
udpServer = socket(AF_INET, SOCK_DGRAM)

udpServer.bind(ADDR)
while True:
 print("waiting for masssage")
 data,addr = udpServer.recvfrom(BUFSIZ) #接收

 data = data.decode()

 udpServer.sendto((ctime()+"--"+ data).encode(),addr)

 print("received from and returned to ",addr)
udpServer.close()

2、UDP客户端创建 

#这个脚本创建一个 UDP 客户端,它提示用户输入发送给服务器的消息,并接收服务器加了时间戳前缀的消息,然后将它们显示给用户。
from socket import *
HOST = 'localhost'
PORT = 21567 #端口号 PORT 应该与你为服务器设置的完全相同(否则,将无法进行通信)
BUFSIZ = 1024
ADDR = (HOST, PORT)

udpCS = socket(AF_INET, SOCK_DGRAM)

while True:
 data = input("> ")
 if not data:
 break
 udpCS.sendto(data.encode(),ADDR)
 data,ADDR = udpCS.recvfrom(BUFSIZ)
 if not data:
 break
 print(data)

udpCS.close()

其实道理都差不多,在python3中,利用套接字传输的内容都以byte形式传输,这时候传送时(send/sendto)需要encode,接收(recv)时需要decode。只要掌握这个重点,处理这个问题就很简单了。

下载本文
显示全文
专题