• udp协议


    一、理论知识热身

    1.udp协议在发送消息的时候,是发完就走的,它是不会等待客户端消息的回复。

    2.所以 udp 协议中是不用 tcp 协议中的监听和接收客户端的链接请求功能,也就是少了没有了server.listen() 和 conn.client_addr=server.accept() 这两步操作的。

    ⭐基于udp 协议的套接字

    服务端

     1 from socket import *
     2 server=socket(AF_INET,SOCK_DGRAM)
     3 server.bind(('4.4.4.61',8080))
     4 
     5 while True:
     6 
     7     # 直接接收客户端的数据和客户端的 IP 和 port
     8     data,client_addr=server.recvfrom(1024)
     9     print(data,client_addr)
    10 
    11     # 服务端发消息的时候用的是sendto
    12     server.sendto(data.upper(),client_addr)
    13 
    14 server.close()

    客户端

     1 from socket import *
     2 client=socket(AF_INET,SOCK_DGRAM)
     3 while True:
     4     msg=input('>>>').strip()
     5 
     6     # 向服务端发送消息(注意解码和带上目标服务端的 IP 和 port )
     7     client.sendto(msg.encode('utf8'),('4.4.4.61',8080))
     8 
     9     # 接收服务端的返回数据和服务端的 IP 和 port
    10     data,server_addr=client.recvfrom(1024)
    11     print(data,server_addr)
    12 
    13 client.close()

     二、基于socketserver实现并发的socket(基于tcp协议)

     1 import socketserver
     2 
     3 
     4 # 自定义类
     5 class MyHandler(socketserver.BaseRequestHandler):
     6 
     7     # 父类中的固有方法
     8     def handle(self):
     9         print(self)   # self:<__main__.MyHandler object at 0x000002252AE24390>
    10         print(self.request) # self.request == 相当于是以前的tcp协议中的conn
    11         while True:
    12             try:
    13                 data = self.request.recv(1024)
    14                 if len(data) == 0: break
    15                 self.request.send(data.upper())
    16             except ConnectionResetError:
    17                 break
    18 
    19 
    20 if __name__ == '__main__':
    21     server = socketserver.ThreadingTCPServer(('4.4.4.60', 8080), MyHandler)
    22 
    23     server.serve_forever()  # 代表链接循环
    24     # 1 循环建立链接,每建立一个链接就会启动一个线程+调用MyHandler类产生一个对象,
    25     # 2 调用该对象下的 handle 方法,专门与刚刚建好的链接作通信循环
    server
     1 from socket import *
     2 client=socket(AF_INET,SOCK_STREAM)
     3 client.connect(('4.4.4.60',8080))
     4 while True:
     5     msg=input('>>').strip()
     6     if len(msg)==0:continue
     7     client.send(msg.encode('utf8'))
     8     data=client.recv(1024)
     9     print(data)
    10     break
    11 client.close()
    client

    三、基于socketserver实现并发的socket(基于udp协议)

     1 import socketserver
     2 class MyHadnler(socketserver.BaseRequestHandler):
     3     def handle(self):
     4         print(self)  # self 是MyHandler的对象
     5         print(self.request)  # 收到的是(b'客户端的消息',server的一些详细信息)
     6         print(self.client_address) # 客户端的IP和PORT
     7         data=self.request[0]
     8         print('客户端发来的信息%s'%data)
     9         self.request[1].sendto(data.upper(),self.client_address)
    10 
    11 if __name__ == '__main__':
    12     server=socketserver.ThreadingUDPServer(('4.4.4.60',8080),MyHadnler)
    13     server.serve_forever()
    server
     1 from socket import *
     2 client=socket(AF_INET,SOCK_DGRAM)
     3 while True:
     4     msg=input('>>').strip()
     5     if len(msg)==0:continue
     6     client.sendto(msg.encode('utf8'),('4.4.4.60',8080))
     7     data=server_addr=client.recvfrom(1024)
     8     print(data,server_addr)
     9     break
    10 client.close()
    client
  • 相关阅读:
    左偏树
    论在Windows下远程连接Ubuntu
    ZOJ 3711 Give Me Your Hand
    SGU 495. Kids and Prizes
    POJ 2151 Check the difficulty of problems
    CodeForces 148D. Bag of mice
    HDU 3631 Shortest Path
    HDU 1869 六度分离
    HDU 2544 最短路
    HDU 3584 Cube
  • 原文地址:https://www.cnblogs.com/Smart1san/p/9291730.html
Copyright © 2020-2023  润新知