目录python
基于tcp的套接字,关键就是两个循环,一个连接循环,一个通讯循环多线程
socketserver模块中分两大类:server类(解决连接问题)和request类(解决通讯问题)并发
Server类:socket
request类:tcp
继承关系:源码分析
如下述代码为例,分析socketserver源码:线程
ftpserver=socketserver.ThreadingTCPServer(('127.0.0.1',8080),FtpServer) ftpserver.serve_forever()
查找属性的顺序:ThreadingTCPServer->ThreadingMixIn->TCPServer->BaseServercode
基于tcp的socketserver咱们本身定义的类中的server
基于udp的socketserver咱们本身定义的类中的对象
服务端
''' -tcp的服务端 -server=ThreadingTCPServer 建立对象 -server.serve_forever 开线程进行链接循环 -写一个类(继承BaseRequestHandler类),类里重写handle,方法内收发数据(并发起来了) ''' #使用socketserver写服务端 import socketserver HOST = "127.0.0.1" PORT = 8080 #本身定义一个类,必须继承BaseRequestHandler class MyTcp(socketserver.BaseRequestHandler): # 必须重写handle方法 def handle(self): try: while 1: # conn对象就是request # 接收数据 print(self.client_address) # 客户机地址 data = self.request.recv(1024) print(data.decode("utf8")) if len(data) == 0: return # 发送数据 self.request.send(data.upper()) except: print("出错了") if __name__ == '__main__': # 实例化获得一个tcp链接的对象 server = socketserver.ThreadingTCPServer((HOST,PORT),MyTcp) # 这里开的线程,获取链接 server.serve_forever()
客户端
import socket soc=socket.socket() soc.connect(('127.0.0.1',8080)) while True: soc.send('你好'.encode('utf-8')) print(soc.recv(1024).decode("utf8"))
服务端
import socketserver HOST = "127.0.0.1" PORT = 8081 class MyUDP(socketserver.BaseRequestHandler): def handle(self): print(self) # UDP链接对象 # 数据 print(self.request[0]) # 数据 print(self.request[1]) # print(type(self.request[1])) if __name__ == '__main__': # 实例化获得一个tcp链接的对象,Threading意思是说,只要来了请求,它自动的开线程来处理链接跟交互数据 server = socketserver.ThreadingUDPServer((HOST,PORT),MyUDP) # 一直在等待发送数据来 server.serve_forever()
客户端
import socket HOST = "127.0.0.1" PORT = 8081 if __name__ == '__main__': # 建立对象 client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) while 1: # 发数据 client.sendto("123123".encode("utf8"),(HOST,PORT)) # 接收数据 print(client.recvfrom(1024)[0].decode("utf8"))