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

 

一丶基于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()分析继承关系

 

posted on 2020-01-11 15:43  向往1  阅读(351)  评论(0编辑  收藏  举报

导航

……