NO.8:自學python之路------并行socket網絡編程

摘要

  一到放假就雜事很多,這次的作業比較復雜,做了一個周,進度又拖了。不過結果還不錯。

正文

粘包

  在上一節中,如果連續發送過多數據,就可能發生粘包。粘包就是兩次發送的數據粘在一起被接收,損壞了數據的完整性。解決方法有兩種。

  方案一:

    在發送多個數據之間添加接收確認。這樣在完成一次發送以后只有接收到另一端的確認以后才會開始新的發送,避免了粘包的發生。

  方案二:

    首先將發送數據的大小發送給另一端,另一端根據數據的大小接收。一次接收一次發送的數據量,這樣也就避免了數據的粘包。例子。

#方案1
#server
f = open(path, 'wb')
for i in f:server.socket.send(i)
f.close()
server.socket.recv(1024)
server.socket.send(b'發送完畢')
#client
recv_data = ''
while True:data = client.socket.recv(1024)if not data:breakrecv_data += data
client.socket.send(b'recv over')
other_data = client.socket.recv(1024)
#方案2
#server
size = os.path.getsize(path)
server.socket.send(size.encode())
server.socket.recv(1024)
f = open(path, 'wb')
for i in f:server.socket.send(i)
f.close()
server.socket.send(b'發送完畢')
#client
size = client.socket.recv(1024)
client.socket.send(b'start')
recv_data = ''
recv_size = 0
while recv_size < size:if size - recv_size < 1024:single_size = size - recv_sizeelse:single_size = 1024data = client.socket.recv(single_size)recv_size += len(data)recv_data += data
other_data = client.socket.recv(1024)
View Code

FTP

  一個簡單的FTP過程主要包含以下幾個步驟。

  1.讀取文件名

  2.檢測文件是否存在

  3.打開文件

  4.檢測文件大小,文件名

  5.發送文件大小 md5值給客戶端

  6.等待客戶端確認

  7.開始邊讀取數據邊發送數據

  8.md5確認

  具體例子。

  服務器

# 服務器端
import socket
import os
import  hashlibserver = socket.socket()
server.bind(('localhost', 9999))
server.listen()while True:conn, addr = server.accept()print('new conn:', addr)while True:data = conn.recv(1024)data = data.decode()if not data:print('客戶端已斷開')breakcmd, filename = data.split()print(filename)if os.path.isfile(filename):f = open(filename, 'rb')m = hashlib.md5()file_size = os.stat(filename).st_sizeprint(file_size)conn.send(str(file_size).encode('utf-8'))conn.recv(1024)for line in f:m.update(line)conn.send(line)print('md5:', m.hexdigest())f.close()conn.send(m.hexdigest().encode('utf-8'))
View Code

  客戶端

# 客戶端
import socket
import hashlibclient = socket.socket()
client.connect(('localhost', 9999))while True:cmd = input('>>').strip()if len(cmd) == 0:continueif cmd.startswith('get'):client.send(cmd.encode('utf-8'))cmd_res_size = client.recv(1024)  # 接收長度print('文件大小 %s' % (cmd_res_size.decode()))client.send('準備完畢,開始發送數據'.encode('utf-8'))recv_size = 0file_name = cmd.split()[1]f = open(file_name + '.new', 'wb')m = hashlib.md5()while recv_size < int(cmd_res_size.decode()):if int(cmd_res_size.decode()) - recv_size > 1024:size = 1024else:size = int(cmd_res_size.decode()) - recv_sizedata = client.recv(size)recv_size += len(data)  # 讀取每次接收的數據
            f.write(data)m.update(data)#print(recv_size)else:file_md5 = m.hexdigest()print('文件接收完畢', recv_size)f.close()recv_md5 = client.recv(1024)print(file_md5, recv_md5.decode())
client.close()
View Code

SocketServer

  SocketServer是Python的一個包,它在socket的基礎上封裝,可以更加簡單的完成并發處理。

  socketserver.TCPServer 繼承BaseServer,完成TCP

  socketserver.UDPServer 繼承TCPServer,完成UDP

  socketserver.UnixStreamServer?繼承TCPServer,完成Unix的TCP

  socketserver.UnixDatagramServer?繼承UDPServer,完成Unix的UDP

  使用socketserver的步驟:

  1.創建一個請求處理類,并且這個類要繼承BaseRequestHandler,并且需要重寫父類中的Handle()方法。

  2.實例化一個Server類,并且傳遞Server ip和1中創建的請求處理類給它。

  3.server.handle_request()只處理一個請求 server.server_forever()處理多個請求,永久執行。

  4.調用server_close()關閉它。

  BaseServer中的常用方法,例子。

fileno() # 返回文件描述符
handle_request # 處理單個請求
serve_forever(poll_interval=0.5) # 一直運行直到收到shutdown()請求,每poll_interval檢查一次,后調用service_actions()結束
service_actions() # 結束操作
shutdown() # 停止信號
server_close() # 清除server
address_family # 地址簇
RequestHandlerClass # 請求處理類
server_address # ip地址
socket # 同socket
self.allow_reuse_adress # 允許重用地址 socket中socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
socket_type # socket使用的協議類型
self.setup() # 請求來之前 self.handle() # 請求來時 self.finish() # 請求處理之后
View Code

作業

  1.用戶加密認證

  2.允許多個用戶登陸

  3.每個用戶有自己的家目錄,不能互相訪問

  4.對用戶進行磁盤配額,可用空間不同

  5.允許用戶在ftp_server上隨意切換目錄

  6.允許用戶查看當前目錄文件

  7.允許用戶上傳下載文件,保證文件一致性

  8.傳輸過程顯示進度條

  作業

轉載于:https://www.cnblogs.com/zk71124720/p/9407286.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/249816.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/249816.shtml
英文地址,請注明出處:http://en.pswp.cn/news/249816.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vue項目中主要文件的加載順序(index.html、App.vue、main.js)

先后順序&#xff1a; index.html > App.vue的export外的js代碼 > main.js > App.vue的export里面的js代碼 > Index.vue的export外的js代碼 測試的頁面代碼塊&#xff1a; 文件的加載先后順序&#xff1a; Index.vue的mounted()中的輸出沒有執行。why&#…

Http請求報頭設置(C#)

1、添加一個SetHeaderValue方法&#xff1a; public static void SetHeaderValue(WebHeaderCollection header, string name, string value) { var property typeof(WebHeaderCollection).GetProperty("InnerCollection",BindingFlags.Instance | BindingFlags.NonP…

vue-cli3使用cdn引入

1. index.html引入&#xff1a; <script src"https://cdn.bootcss.com/moment.js/2.20.1/moment.min.js"></script> <script src"https://cdn.bootcss.com/moment.js/2.20.1/locale/zh-cn.js"></script>2. vue.config.js配置&…

vue常用屬性

Vue實例常用屬性 1.數據 data:Vue 實例的數據對象 components&#xff1a;Vue實例配置局部注冊組件 1.類方法 computed:計算屬性 watch&#xff1a;偵聽屬性 filters&#xff1a;過濾器 methods:Vue實例方法 render&#xff1a;渲染函數&#xff0c;創建虛擬DOM 1.生命周期 c…

凸包算法

轉載自&#xff1a;https://blog.csdn.net/bone_ace/article/details/46239187 凸包問題的五種解法 2015年05月29日 17:58:51 閱讀數&#xff1a;33660前言&#xff1a; 首先&#xff0c;什么是凸包&#xff1f; 假設平面上有p0~p12共13個點&#xff0c;過某些點作一個多邊形&a…

一個優雅的占位圖解決方案。適用于 UITableView 和 UICollectionView。

FMListPlaceholder 項目地址&#xff1a;https://github.com/yfming93/FMListPlaceholder 一個優雅的占位圖解決方案。適用于 UITableView 和 UICollectionView。 一行代碼處理空列表占位圖邏輯 0x001 與其他的同類三方庫對比的優點&#xff1a; 首次進入列表占位圖是不顯示的。…

es7 async 前置依賴

https://stackoverflow.com/questions/33527653/babel-6-regeneratorruntime-is-not-defined 移動端 px2rem-loader 轉載于:https://www.cnblogs.com/smzd/p/10560176.html

vue中 關于$emit的用法

1、父組件可以使用 props 把數據傳給子組件。 2、子組件可以使用 $emit 觸發父組件的自定義事件。 vm.$emit( event, arg ) //觸發當前實例上的事件 vm.$on( event, fn );//監聽event事件后運行 fn&#xff1b; 例如&#xff1a;子組件&#xff1a; <template><di…

SSO閱讀有感

SSO比較詳細且理解。贊 鏈接&#xff1a;https://www.cnblogs.com/ywlaker/p/6113927.html轉載于:https://www.cnblogs.com/z1j2r3/p/9408480.html

C語言——反彈球游戲(第二階段

#include<stdio.h> #include<stdlib.h> #include<windows.h> #include<conio.h>#define High 15 //游戲畫面尺寸 #define Width 20//全局變量 int ball_x,ball_y; //小球的坐標 int ball_vx,ball_vy; //小球的速度 int canvas[High][W…

docker運行我們的容器

docker images docker pull nginx 運行 docker images 查看Nginx鏡像是否獲取成功&#xff0c;若為如下所示即為獲取成功&#xff1a; docker run -p 8080:80 -d nginx docker run –name 容器名 -d&#xff08;后臺運行&#xff09;-p 本地端口:容器端口 -v(掛載) 掛載本地路徑…

vue-transition動畫

demo點擊顯示與消失 <div id"demo"><button v-on:click"show !show">Toggle</button><transition name"fade"><p v-if"show">hello</p></transition> </div> <script> new V…

luogu P1896 [SCOI2005]互不侵犯

去tm插頭dp 數據范圍這么小,又要求,顯然上dp 設\(f[i][j][k]\)表示放到第\(i\)行,總共放了\(j\)個那啥,第\(i\)行的格子狀態為\(k\)的方案 先預處理出一行內狀態的放置個數和格子狀態,因為那啥占據周圍一圈的格子,所以轉移時前后兩行格子狀態沒有交集的狀態轉移 #include<al…

Java String:重要到別人只能當老二的字符串類

字符串&#xff0c;是Java中最重要的類。這句肯定的推斷不是Java之父詹姆斯高斯林說的&#xff0c;而是沉默王二說的&#xff0c;因此你不必懷疑它的準確性。 關于字符串&#xff0c;有很多的面試題&#xff0c;但我總覺得理論知識繞來繞去沒多大意思。你比如說&#xff1a;Str…

vue 中slot 的具體用法

子組件 <template><div class"slotcontent"><ul><!--<slot></slot>--><li v-for"item in items">{{item.text}}</li></ul></div> </template><script>export default{data(){re…

Java基礎教程:多線程基礎(3)——阻塞隊列

Java基礎教程&#xff1a;多線程基礎&#xff08;3&#xff09;——阻塞隊列 快速開始 引入問題 生產者消費者問題是線程模型中的經典問題&#xff1a;生產者和消費者在同一時間段內共用同一存儲空間&#xff0c;生產者向空間里生產數據&#xff0c;而消費者取走數據。 模擬情景…

001.Linux開機啟動過程

相關Linux啟動過程解析&#xff0c;此作為通用啟動參考&#xff1a; 轉載于:https://www.cnblogs.com/itzgr/p/10285833.html

學習vim 從常用按鍵開始

撤銷 u 前進 ctrl r移動 下一個單詞 w 當前單詞首或上個單詞首 b 當前單詞尾或上個單詞尾 e ---- 大寫就是忽略標點符號 行首行尾 $^ 查詢 /word 下一個 n 上一個 Nv 可視化操作命令 刪除操作 x 刪除光標處的字符&#xff0c;向后刪除 nx …

element ui 中 el-menu 如何添加鏈接router-link標簽

在vue項目中&#xff0c;使用elementui 框架&#xff0c;做一個后臺管理系統 在寫左邊菜單&#xff0c;菜用了&#xff0c;elementui 提供的組件 &#xff0c; el-menu 組件。但是組件沒有鏈接&#xff0c;而我們知道添加鏈接使用router-link標簽代碼如下&#xff1a; <el-…

使用fastjson的parseObject方法將json字符串轉換成Map 或者List

fastjson 轉換成map HashMap<String,String> map JSON.parseObject(jsonStr,new TypeReference<HashMap<String,String>>() {}); fastjson 轉換成list List<Person> list new ArrayList<Person>(); list JSON.parseArray(jasonArray.toStri…