第二十九天- socketserver模塊 ftp上傳

来源:https://www.cnblogs.com/xi1419/archive/2018/11/26/10023241.html
-Advertisement-
Play Games

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

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Django的filter查詢 name__contains表示精確大小寫的模糊查詢 使用name__icontains表示忽略大小寫 ...
  • 讓用戶輸入用戶名密碼 認證成功後顯示歡迎信息 輸錯三次後退出程式 ...
  • urllib提供的功能就是利用程式去執行各種HTTP請求。如果要模擬瀏覽器完成特定功能,需要把請求偽裝成瀏覽器。偽裝的方法是先監控瀏覽器發出的請求,再根據瀏覽器的請求頭來偽裝,User-Agent頭就是用來標識瀏覽器的。 ...
  • 1.setnx鎖在redis中最簡單的數據結構就是string。最早的時候,上鎖的操作一般使用setnx,這個命令是當:lock不存在的時候set一個val,或許你還會記得使用expire來增加鎖的過期,解鎖操作就是使用del命令,偽代碼如下:if (Redis::setnx("my:lock", ...
  • 七、用戶登錄與手機註冊 1、drf的token 在INSTALLED_APPS中註冊: 然後遷移資料庫,會生成一張表authtoken_token,存放用戶的token信息: 配置token的url: 然後現在測試發起post請求登錄,我們使用postman工具來發起請求: drf返回的token值 ...
  • 多線程 等待一次性事件 異常處理 背景:假設某個future在等待另一個線程結束,但是在被future等待的線程里發生了異常(throw一個異常A),這時怎麼處理。 結果:假設發生了上面的場景,則在調用future的get方法時,就會得到被future等待的線程拋出的異常A。 3種情況: 1,std ...
  • 題意 "題目鏈接" Sol 直接把$q_i$除掉 那麼$E_j = \sum_{i = 1}^{j 1} q_i (i j)^2 \sum_{i = j + 1}^n q_i (i j)^2$ 設$f_i = q_i, g_i = i^2$ 帶入原式發現原式變成了捲積的形式 $E_j = f_i g ...
  • @Resource和@Autowired都是做bean的註入時使用,其實@Resource並不是Spring的註解,它的包是javax.annotation.Resource,需要導入,但是Spring支持該註解的註入。 1、共同點 兩者都可以寫在欄位和setter方法上。兩者如果都寫在欄位上,那麼 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...