zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    BZOJ3224普通平衡树——旋转treap
    我有一个梦想
    Python自动化测试入门
    Java为何这么难学?
    jmeter正则表达式书写
    fiddler抓包后Jmeter实现登录接口
    JMeter如何使用用户定义的变量
    第一篇博客说明
    React笔记_(5)_react语法4
    React笔记_(4)_react语法3
  • 原文地址:https://www.cnblogs.com/Smart1san/p/9291730.html
Copyright © 2011-2022 走看看