網路程式設計之socketserver

2021-09-24 19:28:30 字數 3561 閱讀 3386

檢驗客戶端的合法性

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 我們之前沒有實現併發的原因是,我們之前是鏈結迴圈加通訊迴圈,我們只有建立連線後才能通訊,通訊的過程中騰不出手來建立連線 ...