檢驗客戶端的合法性
socketserver的使用:實現併發多使用者連線ftp伺服器,上傳檔案import socketserver
import hashlib
import subprocess
import socket
import struct
import json
# 實現併發,實現多人可連線使用
class myserver(socketserver.baserequesthandler):#必須繼承這個類
def handle(self):##這裡是業務邏輯,這裡的方法名必須是handle,只要用使用者連線server,handle方法就執行了
print('有客戶端連線進來了...')
while true:
try:
file_info_json_pack_length = self.request.recv(4)# 之前的conn換做self.request
file_info_json_unpack_length = struct.unpack('i', file_info_json_pack_length)[0]
recv_file_info = self.request.recv(file_info_json_unpack_length)
file_info = json.loads(recv_file_info.decode('utf-8'))
file_name = file_info.get('file_name')
file_size = file_info.get('file_size')
action = file_info.get('action')
all_recv_length = 0
print(all_recv_length)
print(file_size)
md5 = hashlib.md5()
while all_recv_length < file_size:
data = self.request.recv(1024)
md5.update(data)
with open(file_name, 'ab') as f:
f.write(data)
all_recv_length += len(data)
print('檔案總長為%s已經接收長度%s' % (file_size, all_recv_length))
self.request.send(md5.hexdigest().encode('utf-8'))
except exception as e:
print('客戶端斷開連線:%s'%e)
break
#這步是初始化方法,bind繫結ip和埠,和listen(),tcp協議
# 1. 建立socket物件 2. self.socket.bind() 3. self.socket.listen(5)
server=socketserver.threadingtcpserver(('192.168.0.105',9000),myserver)
# 多執行緒udp協議用server=socketserver.threadingudpserver(('192.168.0.105',9000),myserver)
# 多程序tcp併發併發用server=socketserver.forkingtcpserver(('192.168.0.105',9000),myserver)
# 多程序udp併發併發用server=socketserver.forkingudpserver(('192.168.0.105',9000),myserver)
#呼叫accept() 接收連線
server.serve_forever()
# client.py
import json
import os
import socket
import struct
import hashlib
client=socket.socket()
client.connect(('192.168.0.105',9000))
while true:
cmd=input('>>>')
action,file_name=cmd.strip().split(' ')# 執行的命令,和檔名
print(action,file_name)
if not os.path.exists(file_name):
print('你輸入的檔案不存在,請重新輸入')
continue
file_size=os.path.getsize(file_name)# 檔案大小
print('file_size',file_size)
if action == 'put':
print('檔案%s正在傳送...'%(file_name))
file_info=
file_info_json=json.dumps(file_info,ensure_ascii=false) # file_info_json字串形式
file_info_json_length= len(file_info_json.encode('utf-8'))# file_info_json字串形式的長度的bytes型別
file_info_json_pack = struct.pack('i',file_info_json_length) # 4位
client.send(file_info_json_pack) # 傳送4位
client.send(file_info_json.encode('utf-8'))# 傳送file_info的位元組長度
client_md5 = hashlib.md5()
with open('photo.jpg','rb') as f:# 傳送檔案
for i in f:
client_md5.update(i)
client.send(i)
server_md5=client.recv(1024)
if server_md5.decode('utf-8')==client_md5.hexdigest():
print('檔案上傳成功')
else:
print('檔案上傳失敗')
python網路程式設計 socketserver模組
socketserver.baserequesthandler 類 def setup self 請求進來之前的操作 pass def handle self 處理請求的操作 pass def finish self 請求結束後的後事 passimport socketserver class my...
python 併發程式設計(socketserver)
下面的例子是簡單的ssh 登入,其實也就是客戶端把指令傳送給伺服器。伺服器把結果返還給客戶端,客戶端再在終端展現 服務端 author bigbao date 2018 7 18 我們之前沒有實現併發的原因是,我們之前是鏈結迴圈加通訊迴圈,我們只有建立連線後才能通訊,通訊的過程中騰不出手來建立連線 ...
python 併發程式設計(socketserver)
下面的例子是簡單的ssh 登入,其實也就是客戶端把指令傳送給伺服器。伺服器把結果返還給客戶端,客戶端再在終端展現 服務端 author bigbao date 2018 7 18 我們之前沒有實現併發的原因是,我們之前是鏈結迴圈加通訊迴圈,我們只有建立連線後才能通訊,通訊的過程中騰不出手來建立連線 ...