一、socket
socket即套接字,用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求。
最简单的socket,一次
1 import socket 2 server = socket.socket() #获得实例 3 server.bind(("localhost",9999)) #绑定主机和端口以元组形式 4 server.listen() #监听 5 print("等待客户端连接。。") 6 conn,addr = server.accept() #接收连接 7 data = conn.recv(1024) #接收数据,默认最大为8192 8 print("收到:",data.decode()) #data是byte格式要decode一下 9 conn.send("不要回答!不要回答!不要回答!".encode())#发送的数据要是byte格式 10 server.close()
1 import socket 2 client = socket.socket() 3 client.connect(("localhost",9999)) 4 client.send("请占领地球!".encode("utf-8")) 5 data = client.recv(1024) 6 print("反馈:",data.decode()) 7 client.close()
实现多次交互,多连接处理,加两个循环
1 import socket 2 server = socket.socket() 3 server.bind(("localhost",9999)) 4 server.listen() 5 while True: #第一层循环 6 print("等待客户端连接。。") 7 conn,addr = server.accept() 8 while True: #第二层循环 9 data = conn.recv(1024) 10 if not data: #如果没有数据就断开 11 print("客户端断开。") 12 break 13 print("收到:",data.decode()) 14 conn.send("不要回答!不要回答!不要回答!".encode()) 15 server.close()
1 import socket 2 client = socket.socket() 3 client.connect(("localhost",9999)) 4 while True: 5 msg = input(">>:").strip() 6 if len(msg) == 0:continue 7 client.send(msg.encode("utf-8")) 8 data = client.recv(1024) 9 print("反馈:",data.decode()) 10 client.close()
防止黏包在两次send之间要加个客户端响应
1 conn.send(str(len(res)).encode()) 2 client_ack = conn.recv(1024) 3 conn.sendall(res)
二、socketserver
1 import socketserver 2 3 class MyTCPHandler(socketserver.BaseRequestHandler): 4 """ 5 The request handler class for our server. 6 It is instantiated once per connection to the server, and must 7 override the handle() method to implement communication to the client. 8 """ 9 10 def handle(self): 11 # self.request is the TCP socket connected to the client 12 self.data = self.request.recv(1024).strip() 13 print("{} wrote:".format(self.client_address[0])) 14 print(self.data) 15 # just send back the same data, but upper-cased 16 self.request.sendall(self.data()) 17 18 if __name__ == "__main__": 19 HOST, PORT = "localhost", 9999 20 21 # Create the server, binding to localhost on port 9999 22 server = socketserver.TCPServer((HOST, PORT), MyTCPHandler) 23 #server = socketserver.ThreadingTCPServer((HOST, PORT), MyTCPHandler) #多并发 24 # Activate the server; this will keep running until you 25 # interrupt the program with Ctrl-C 26 server.serve_forever()