python异常处理-异常捕获-抛出异常-断言-自定义异常-UDP通信-socketserver模块应用-3 (3)

服务器端

import socketserver # 文件名不要和模块冲突了,不然都不知道导哪个了 class MyServer(socketserver.BaseRequestHandler): def handle(self): # 与客户端进行通信 # print("来啦 老弟") while True: # 需要保持通信(后续 client.send() 可没有附带服务器地址, connect 被关闭了) data = self.request.recv(1024) print(self.client_address) # 客户端地址 print(data.decode('utf-8')) self.request.send(data.upper()) if __name__ == '__main__': '''只要有客户端连接,会自动交给自定义类中的handle方法去处理''' server = socketserver.ThreadingTCPServer(('127.0.0.1', 8080), MyServer) # 创建一个基于TCP的对象 server.serve_forever() # 启动该服务对象 # ('127.0.0.1', 14327) # dAddA # ('127.0.0.1', 14326) # ADD # ('127.0.0.1', 14325) # ADsafga

客户端

# TCP 实现UDP import socket client = socket.socket() client.connect(('127.0.0.1', 8080)) while True: res = input(">>>:") client.send(res.encode('utf-8')) data = client.recv(1024) print(data.decode('utf-8')) # 窗口1 控制台数据(输入与输出) # >>>:dAddA # DADDA # >>>: # 窗口2 控制台数据(输入与输出) # >>>:ADD # ADD # >>>: # 窗口1 控制台数据(输入与输出) # >>>:ADsafga # ADSAFGA # >>>: socketserver之UDP

服务器端

import socketserver # 文件名不要和模块冲突了,不然都不知道导哪个了 class MyServer(socketserver.BaseRequestHandler): def handle(self): # 与客户端进行通信 # while True: # UDP 不需要通信循环,每次 sendto 都有服务器的地址 data, sock = self.request print(self.client_address) # 客户端地址 print(data.decode('utf-8')) sock.sendto(data.lower(), self.client_address) if __name__ == '__main__': '''只要有客户端连接,会自动交给自定义类中的handle方法去处理''' server = socketserver.ThreadingUDPServer(('127.0.0.1', 8080), MyServer) # 创建一个基于UDP的对象 server.serve_forever() # 启动该服务对象 # 控制台打印的数据 # ('127.0.0.1', 52524) # CLient2 # ('127.0.0.1', 52529) # clet1 # ('127.0.0.1', 52529) # CLienT1 # ('127.0.0.1', 54485) # CLiEnt3

客户端

import socket client = socket.socket(type=socket.SOCK_DGRAM) server_addr = ('127.0.0.1', 8080) while True: res = input(">>>:").strip() client.sendto(res.encode('utf-8'), server_addr) data, response_server_addr = client.recvfrom(1024) print(data.decode('utf-8'), response_server_addr) # 窗口1 控制台数据(输入与输出) # >>>:clIeNt1 # clet1 ('127.0.0.1', 8080) # >>>:CLienT1 # client1 ('127.0.0.1', 8080) # >>>: # 窗口2 控制台数据(输入与输出) # >>>:CLient2 # client2 ('127.0.0.1', 8080) # >>>: # 窗口1 控制台数据(输入与输出) # >>>:CLiEnt3 # client3 ('127.0.0.1', 8080) # >>>: 为什么UDP不用写通信循环 handle 是处理一次连接请求的,handle结束连接就断开了 UDP是不需要保持(双向)连接的,所以每次sendto 都是单个请求(都附带服务器端地址及端口),不能写通信循环(不然就拿着一个sendto 过来的数据循环打印了) 而TCP是基于双向通道通信的,handle结束后连接就断开了(再client.send() 这个连接状态就已经不存在了),所以TCP这边的服务端要写通信循环保持连接来多次通信

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpwszg.html