socketserver網絡編程簡單的小例子
阿新 • • 發佈:2018-09-18
exce pwa __init__ cli sum cps dff ima caption
1:網絡編程之socketserver
1:首先socketserver 服務器調用socketserver 模塊
2:繼承了socketserver.BaseRequestHandler
3:在父類的基礎上重寫了handle
下面是一個簡單的文件登錄文件上傳的例子
server端
import socketserver import json import struct import socket class MyTCPHandler(socketserver.BaseRequestHandler): def handle(self): flag = self.login_check() while flag: try: self.data = self.request.recv(1024).strip() print(‘{} wrote‘.format(self.client_address[0])) print(self.data) self.request.send(self.data.upper()) print(self.data.decode(‘utf-8‘)) if self.data.decode(‘utf-8‘) == ‘2‘: self.uploading() except ConnectionResetError as e: print(‘error‘, e) break def login_check(self): dic_user = { ‘name‘: ‘qwer‘, ‘pwad‘: ‘1234‘ } dic_clinet = self.request.recv(1024).strip() dic_clinet = json.loads(dic_clinet) print(dic_clinet) if dic_user[‘name‘] == dic_clinet[‘name‘] and dic_user[‘pwad‘] == dic_clinet[‘pwad‘]: self.request.send(b‘True‘) return True def uploading(self): ‘‘‘接受上傳文件‘‘‘ ret = self.request.recv(1024) dic_client = json.loads(ret) print(dic_client) self.request.send(b‘Start To upload‘) print(‘Start the download‘) size = dic_client[‘size‘] with open(dic_client[‘filename‘],‘wb‘) as f: while size: ret = self.request.recv(1024) f.write(ret) size -= len(ret) print(‘下載完畢!‘) if __name__ == ‘__main__‘: Host, port = ‘127.0.0.1‘, 9999 # sever = socketserver.TCPServer((Host, port), MyTCPHandler) sever = socketserver.ThreadingTCPServer((Host, port), MyTCPHandler) sever.serve_forever()
client端
import socket
import json
import os
import sys
import time
#進度條
import time
from tqdm import tqdm
# for i in tqdm(range(100)):
# time.sleep(0.05)
def processBar(num, total):
rate = num / total
rate_num = int(rate * 100)
if rate_num == 100:
r = ‘\r%s>%d%%\n‘ % (‘|‘ * rate_num, rate_num,)
else:
r = ‘\r%s>%d%%‘ % (‘|‘ * rate_num, rate_num,)
sys.stdout.write(r)
sys.stdout.flush
class Client():
‘‘‘客戶端‘‘‘
cmd_list = [
(‘下載文件‘, ‘ncftpget‘),
(‘上傳文件‘, ‘upload‘),
(‘切換目錄‘, ‘chdir‘),
(‘創建目錄‘, ‘create_directory‘),
(‘刪除文件或者目錄‘,‘expurgate ‘),
]
def __init__(self):
self.client = socket.socket() #實例socket對象
def connect(self, ip, port):
‘‘‘綁定端口‘‘‘
self.client.connect((ip, port))
def logon(self):
‘‘‘用戶登錄‘‘‘
name = input(‘user_name:‘)
pawd = input(‘passwork:‘)
user_dic = {
‘name‘: name,
‘pwad‘: pawd
}
self.client.send(json.dumps(user_dic).encode(‘utf-8‘))
ret = self.client.recv(1024).decode(‘utf-8‘)
print(ret)
return ret
def User_input(self):
flag = self.logon()
name_path = ‘/home/‘
while flag:
for index, val in enumerate(self.cmd_list, 1):
print(‘%s %s‘%(index, val[0]))
inp = input(‘%s:‘%name_path)
self.client.send(inp.encode(‘utf-8‘))
ret = self.client.recv(1024).decode(‘utf-8‘)
if inp == ‘2‘:
self.upload()
else:
print(‘密碼錯誤!‘)
def ncftpget(self):
‘‘‘下載文件‘‘‘
def upload(self):
‘‘‘上傳文件‘‘‘
path_name = r‘G:\python筆記\Pythonjing\day18\video\01 深圳校區 python fullstuck 1期 day18 內容回顧.mp4‘
size = os.path.getsize(path_name)
print(size)
total = size
dic_user = {
‘means‘: ‘uploading‘,
‘filename‘: ‘test.mp4‘,
‘size‘: size,
}
self.client.send(json.dumps(dic_user).encode(‘utf-8‘))
ret = self.client.recv(1024)
print(ret)
with open(path_name, ‘rb‘) as f:
count = 0
time_old = time.clock()
pbar = tqdm(total=size)
while size:
data = f.read(1024)
self.client.send(data)
size -= len(data)
count += len(data)
pbar.update(len(data)) #進度條
# processBar(count, total) #進度條
time_new = time.clock()
pbar.close()
print(‘上傳完畢!一個用時%s秒‘%int(time_new - time_old))
def chdir(self):
‘‘‘切換目錄‘‘‘
def create_directory(self):
‘‘‘創建目錄‘‘‘
def expurgate(self):
‘‘‘刪除文件或者文件夾‘‘‘
if __name__ == ‘__main__‘:
# Host, port = ‘127.0.0.1‘, 9999
Host, port = ‘192.168.16.46‘, 9999
cl = Client()
cl.connect(Host, port)
cl.User_input()
socketserver網絡編程簡單的小例子