基于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.data = self.request.recv(1024).strip()
print("{} wrote:".format(self.client_address[0]))
print(self.data)
self.request.sendall(self.data.upper())
if __name__ == "__main__":
HOST, PORT = "localhost", 9999
with socketserver.TCPServer((HOST, PORT), MyTCPHandler) as server:
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
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
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 的响应消息,其中相关的方法,可以参考上面的描述
|