Python_day6:socket网络编程

一、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()
server
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()
client

  实现多次交互,多连接处理,加两个循环

 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()
server
 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()
client

  防止黏包在两次send之间要加个客户端响应

1 conn.send(str(len(res)).encode())
2 client_ack = conn.recv(1024)
3 conn.sendall(res)
server黏包

二、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()
socketserver

 

猜你喜欢

转载自www.cnblogs.com/alpari-wang/p/9890508.html