Python3 搭建UDP/TCP服务端
Posted Fu_Lin_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python3 搭建UDP/TCP服务端相关的知识,希望对你有一定的参考价值。
文章目录
基于socketserver实现
看网上有很多人写这个,有说到用socketserver
这个库来实现,但是代码完全不可用,不知道搞些什么,不晓得是不是版本太低还是自己瞎写凑数,然后网上大多都是复制来复制去的同一篇,所以我只能跑到官网去看教程例程,下面便记录一下,socketserver官方文档地址
下面貼出官方TCP服务端
的实现demo:
import socketserver
class MyTCPHandler(socketserver.BaseRequestHandler):
"""
The request handler class for our server.
It is instantiated once per connection to the server, and must
override the handle() method to implement communication to the
client.
"""
def handle(self):
# self.request is the TCP socket connected to the client
self.data = self.request.recv(1024).strip()
print(" wrote:".format(self.client_address[0]))
print(self.data)
# just send back the same data, but upper-cased
self.request.sendall(self.data.upper())
if __name__ == "__main__":
HOST, PORT = "localhost", 9999
# Create the server, binding to localhost on port 9999
with socketserver.TCPServer((HOST, PORT), MyTCPHandler) as server:
# Activate the server; this will keep running until you
# interrupt the program with Ctrl-C
server.serve_forever()
下面貼出官方UDP服务端
的实现demo:
import socketserver
class MyUDPHandler(socketserver.BaseRequestHandler):
"""
This class works similar to the TCP handler class, except that
self.request consists of a pair of data and client socket, and since
there is no connection the client address must be given explicitly
when sending data back via sendto().
"""
def handle(self):
data = self.request[0].strip()
socket = self.request[1]
print(" wrote:".format(self.client_address[0]))
print(data)
socket.sendto(data.upper(), self.client_address)
if __name__ == "__main__":
HOST, PORT = "localhost", 9999
with socketserver.UDPServer((HOST, PORT), MyUDPHandler) as server:
server.serve_forever()
其他线程类混合类请求就去看看官网文档,一切以官方文档为准,文档可切换成中文语言查看,还是很方便的~
原生socket实现
下面是python使用原生Socket搭建UDP的方式,我贴一下简单的
服务端的实现代码:
import socket
# AF_INET 表示使用IPv4, SOCK_DGRAM 则表明数据将是数据报(datagrams)
udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udp.bind(('0.0.0.0', 1777))
while True:
rec_msg, addr = udp.recvfrom(1024)
client_ip, client_port = addr
print('client_ip:', client_ip, 'client_port:', client_port)
print('msg from client:', rec_msg.decode('utf8'))
ack_msg = 'Hello, udp client.'
udp.sendto(ack_msg.encode('utf8'), addr)
用法说明:
- 使用
udp.bind()
方法绑定ip
和port
- 通过
udp.recvfrom()
方法来收取客户端发送的udp
消息(该方法是阻塞的,直到有消息来才能够向下执行) - 可以在
addr
中获取到client_ip, client_port
,你可以自行记录,以便server
和 不同的client
进行通信 - 收取到的消息使用
decoce()
方法解码
,可以得到对应的字符串消息 - 使用
udp.sendto()
方法可以将消息发送到对应的客户端
客户端实现:
import socket
# AF_INET 表示使用IPv4, SOCK_DGRAM 则表明数据将是数据报(datagrams)
udp_client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
client_msg = 'Hello udp server.'
udp_client.sendto(client_msg.encode('utf8'), ('127.0.0.1', 1777))
while True:
rec_msg, addr = udp_client.recvfrom(1024)
print('msg form server:', rec_msg.decode('utf8'))
该段代码是客户端模拟发送 udp
消息,以及收取 server
的响应消息,其中相关的方法,可以参考上面的描述
以上是关于Python3 搭建UDP/TCP服务端的主要内容,如果未能解决你的问题,请参考以下文章