1.socketserver模塊: socketserver,它提供了伺服器中心類,可簡化網路伺服器的開發,內部使用IO多路復用以及“多線程”和“多進程”,從而實現併發處理多個客戶端請求的socket服務端。即,每個客服端請求連接到伺服器時,socket服務端都會在伺服器上創建一個“線程”或“進程” ...
1.socketserver模塊:
socketserver,它提供了伺服器中心類,可簡化網路伺服器的開發,內部使用IO多路復用以及“多線程”和“多進程”,從而實現併發處理多個客戶端請求的socket服務端。即,每個客服端請求連接到伺服器時,socket服務端都會在伺服器上創建一個“線程”或“進程”專門負責處理當前客戶端的所有請求。
2.socketserver的ThreadingTCPServer類:
ThreadingTCPServer實現的socket伺服器內部會為每個client創建一個“線程”,該線程用來和客戶端就行交互
使用方法
1、創建一個繼承socketserver.BaseRequestHandler的類
2、類中必須重寫一個名為handler的方法
3、實例化一個伺服器類,傳入伺服器地址和請求處理程式類
4、調用serve_forever()事件迴圈監聽
3.socketserver代碼示例:
1 import socketserver 2 3 4 class Myserver(socketserver.BaseRequestHandler): 5 6 def handle(self): # 必須有handle方法 7 while 1: 8 from_client_msg = self.request.recv(1024) # self.request 相當於conn連接通道 9 print(from_client_msg.decode('utf-8')) 10 server_msg = input('服務端>>>').encode('utf-8') 11 self.request.send(server_msg) 12 13 14 if __name__ == '__main__': 15 ip_port = ('127.0.0.1',8086) 16 17 # server是socketserver模塊的ThreadingTCPServer類的實例化對象 18 server = socketserver.ThreadingTCPServer(ip_port,Myserver) # 固定寫法 ip_port和上面創建的類 19 server.serve_forever() # server對象調用一個serve_forever方法迴圈監聽服務端
1 import socket 2 import time 3 4 client = socket.socket() 5 client.connect(('127.0.0.1',8086)) 6 7 while 1: 8 msg = input('客戶端>>>') 9 # time.sleep(1) 10 client.send(msg.encode('utf-8')) 11 12 from_server_msg = client.recv(1024).decode('utf-8') 13 print(from_server_msg) 14 15 client.close()客戶端
4.socket的方法補充:
1 ''' 2 服務端套接字函數 3 s.bind() 綁定(主機,埠號)到套接字 4 s.listen() 開始TCP監聽 5 s.accept() 被動接受TCP客戶的連接,(阻塞式)等待連接的到來 6 7 客戶端套接字函數 8 s.connect() 主動初始化TCP伺服器連接 9 s.connect_ex() connect()函數的擴展版本,出錯時返回出錯碼,而不是拋出異常 10 11 公共用途的套接字函數 12 s.recv() 接收TCP數據 13 s.send() 發送TCP數據 14 s.sendall() 發送TCP數據 15 s.recvfrom() 接收UDP數據 16 s.sendto() 發送UDP數據 17 s.getpeername() 連接到當前套接字的遠端的地址 18 s.getsockname() 當前套接字的地址 19 s.getsockopt() 返回指定套接字的參數 20 s.setsockopt() 設置指定套接字的參數 21 s.close() 關閉套接字 22 23 面向鎖的套接字方法 24 s.setblocking() 設置套接字的阻塞與非阻塞模式 25 s.settimeout() 設置阻塞套接字操作的超時時間 26 s.gettimeout() 得到阻塞套接字操作的超時時間 27 28 面向文件的套接字的函數 29 s.fileno() 套接字的文件描述符 30 s.makefile() 創建一個與該套接字相關的文件 31 '''
5.ftp簡易上傳練習:
1 import socket 2 3 4 def send_file_client(new_conn,client_addr): 5 # 接收客戶端要下載的文件名 6 file_name = new_conn.recv(1024).decode('utf-8') 7 print("客戶端%s需要下載的文件是:%s"%(str(client_addr),file_name)) 8 9 # 打開文件讀取數據 10 file_content = None 11 try: 12 with open(file_name,"rb") as f: 13 file_content = f.read() 14 15 except Exception as e: 16 print('沒有要下載的文件%s' % file_name) 17 18 # 發送文件數據給客戶端 19 if file_content: 20 new_conn.send(file_content) 21 return 22 23 24 def main(): 25 file_server = socket.socket() 26 ip_port = ('127.0.0.1',8086) 27 file_server.bind(ip_port) 28 file_server.listen() 29 30 while 1: 31 new_conn,client_addr = file_server.accept() 32 # 調用發送文件函數 33 send_file_client(new_conn,client_addr) 34 new_conn.close() 35 36 file_server.close() 37 38 39 if __name__ == '__main__': 40 main()server
1 import socket 2 3 4 def main(): 5 file_client = socket.socket() 6 # 獲取ip port 7 server_ip = input('請輸入伺服器ip:') 8 server_port = input('請輸入下載的port:') 9 # 連接伺服器 10 file_client.connect((server_ip,int(server_port))) 11 12 # 獲取文件名 發給伺服器 13 down_file_name = input("請輸入要下載的文件名字:") 14 file_client.send(down_file_name.encode('utf-8')) 15 16 # 接收發來的數據寫入新文件 17 content = file_client.recv(1024*1024).decode('utf-8') 18 with open('new'+down_file_name,'w') as f: 19 f.write(content) 20 21 file_client.close() 22 23 24 if __name__ == '__main__': 25 main()client