首页 > 其他 > 详细

基于UDP协议的socket 基于socketserver实现并发

时间:2020-01-11 16:12:30      阅读:73      评论:0      收藏:0      [点我收藏+]

 

一丶基于UDP协议的socket

实现UDP协议传输数据

技术分享图片

代码如下:??

### 客户端
?
# -*-coding:utf-8-*-
# Author:Ds
import socket
?
# 实例化UDP协议的socket对象 ,配置参数, socket.SOCK_DGRAM(数据报)
udp_cli=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
?
while 1:
   # 1. 向客户端发送数据
   to_ser_msg=input(‘请输入内容:>>>‘).strip()
   # sendto 包含 字节数据和服务端的ip和端口 两部分内容
   udp_cli.sendto(to_ser_msg.encode(‘utf-8‘),(‘127.0.0.1‘,9999))
?
   # 2. recvfrom 接收服务端返回的数据
   from_ser_msg=udp_cli.recvfrom(1024)
   print(f‘来自{from_ser_msg[1]}的信息:{from_ser_msg[0].decode("utf-8")}‘)
?

 

### 服务端
?
# -*-coding:utf-8-*-
# Author:Ds
import socket
# 实例化UDP协议的socket对象 ,配置参数, socket.SOCK_DGRAM(数据报)
udp_server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
?
udp_server.bind((‘127.0.0.1‘,9999)) # 绑定服务端IP和端口
?
?
while 1 :
   # 1. 接收任意客户端发送的数据
   from_cli_msg=udp_server.recvfrom(1024)
   # 接收到的是元组类型的数据, 包含客户端的IP和端口,客户端发来的字节数据
   print(from_cli_msg)
   # 格式化输出
   print(f‘来自{from_cli_msg[1]}的信息:{from_cli_msg[0].decode("utf-8")}‘)
?
   # 2. 向客户端返回数据,
   to_cli_msg=input(‘请输入回复消息:>>>‘).strip()
   # 因为接收的数据中包含了客户端的的IP和地址
   udp_server.sendto(to_cli_msg.encode(‘utf-8‘),from_cli_msg[1])

总结:

sendto: 发送数据,包含两部分内容(字节形式数据,服务端的IP和地址)

recvfrom: 接收数据(1024)

udp是无链接,先启动哪一端都不会报错(无论服务端还是客户端发送数据,都不管另一方是否能接收到)

二丶基于socketserver实现并发

socketserver作用:

需要用它来实现并发,也就是同时可以和多个客户端进行通信

### 服务端
?
# -*-coding:utf-8-*-
# Author:Ds
import socketserver
?
# 这个请求类要继承BaseRequestHandler,并且还有重写父类里的handle()
class My_Server(socketserver.BaseRequestHandler):
?
   def handle(self):
?
       while 1:
           # 接收数据
           from_cli_data=self.request.recv(1024).decode(‘utf-8‘)
           print(from_cli_data)
?
           # 返回数据
           ## 服务器还是依次给客户端返回数据
           to_cli_data=input(‘请输入要返回的消息:>>‘).strip()
           self.request.send(to_cli_data.encode(‘utf-8‘))
?
?
if __name__ == ‘__main__‘:
   IP_PROT=(‘127.0.0.1‘,9999) # 定义 服务端的IP和端口
?
   # 1.利用模块 socketserver 开启多线程TCP
   # 2. 把端口和IP IP_PROT , 自定义请求处理类My_Server
   server=socketserver.ThreadingTCPServer(IP_PROT,My_Server)
   server.serve_forever() # 永远开启连接通道
?
### 客户端 
## 可以开启多个客户端, 同时向服务器发送数据,
?
# -*-coding:utf-8-*-
# Author:Ds
?
import socket
?
client=socket.socket()
?
client.connect((‘127.0.0.1‘,9999))
?
while 1:
   ui=input(‘输入内:>>‘).strip()
   client.send(ui.encode(‘utf-8‘))
?
   from_ser_data=client.recv(1024)
   print(f‘来自服务器的信息:{from_ser_data.decode("utf-8")}‘)

 

实例化ThreadingTCPServer()分析继承关系

 

基于UDP协议的socket 基于socketserver实现并发

原文:https://www.cnblogs.com/xiangwang1/p/12180097.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!