python程序设计上机实践第三章答案_20192419 实验三《Python程序设计》实验报告
學(xué)號 2019-2020-2 《Python程序設(shè)計》實驗3報告
課程:《Python程序設(shè)計》
班級:1924
姓名: 萬騰陽
學(xué)號:20192419
實驗教師:王志強(qiáng)
實驗日期:2020年5月16日
必修/選修: 公選課
1.實驗內(nèi)容
創(chuàng)建服務(wù)端和客戶端,服務(wù)端在特定端口監(jiān)聽多個客戶請求。客戶端和服務(wù)端通過Socket套接字(TCP/UDP)進(jìn)行通信。
2. 實驗過程及結(jié)果
先引入socket 庫,隨后還需要os,struct,sys等,由于這里使用的是base64加密,所以需要引入base64庫進(jìn)行加密。準(zhǔn)備工作做完了,就開始建立連接了。建立連接時要找出沒有被占有的端口,否則無法連接。同時還要找到可使用的IP地址連接完畢后就可以傳輸文件了。
服務(wù)器端:
先是等待請求并接受(程序會停留在這一旦收到連接請求即開啟接受數(shù)據(jù)的線程),接收數(shù)據(jù),收到請求后回復(fù),申請相同大小的空間存放發(fā)送過來的文件名與文件大小信息,接收文件名與文件大小信息,判斷是否接收到文件頭信息,獲取文件名和文件大小,將分批次傳輸?shù)亩M(jìn)制流依次寫入到文件,此時文件應(yīng)為base64 傳輸結(jié)束記得斷開連接避免出現(xiàn)錯誤。
客戶端:
創(chuàng)建套接字對象 ‘s’,建立需要傳輸?shù)奈募窂?#xff0c;定義定義文件信息。128s表示文件名為128bytes長,l表示一個int或log文件類型,在此為文件大小,將文件進(jìn)行base64加密,將傳輸文件以二進(jìn)制的形式分多次上傳至服務(wù)器,之后關(guān)閉套接字對象。
客戶端代碼:
import socket
import os
import sys
import struct
import base64
f_org = open(r'D:\qwer.txt', 'r')
content = f_org.read()
content1 = content.encode(encoding='utf-8')
content2 = base64.b64encode(content1)
f_org.close()
with open(r'D:\qwer.txt', 'wb+') as f_org:
f_org.write(content2)
print("have encrypted,the ciphertext is:"+ str(content2))
def socket_client():
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1', 9001))
except socket.error as msg:
print(msg)
sys.exit(1)
print(s.recv(1024))
filepath = r'D:\qwer.txt'
if os.path.isfile(filepath):
fileinfo_size = struct.calcsize('128sl')
fhead = struct.pack('128sl', os.path.basename(filepath).encode('utf-8'), os.stat(filepath).st_size)
s.send(fhead)
fp = open(filepath, 'rb')
while 1:
data = fp.read(1024)
if not data:
print('{0} file send over...'.format(os.path.basename(filepath)))
break
s.send(data)
s.close()
if __name__ == '__main__':
socket_client()
服務(wù)器端代碼:
import sys
import os
import base64
def socket_service():
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('127.0.0.1', 9001))
s.listen(10)
except socket.error as msg:
print(msg)
sys.exit(1)
print('Waiting connection...')
while 1:
conn, addr = s.accept()
t = threading.Thread(target=deal_data, args=(conn, addr))
t.start()
def deal_data(conn, addr):
print('Accept new connection from {0}'.format(addr))
conn.send('Hi, Welcome to the server!'.encode('utf-8'))
while 1:
fileinfo_size = struct.calcsize('128sl')
buf = conn.recv(fileinfo_size)
if buf:
filename, filesize = struct.unpack('128sl', buf)
fn = filename.strip(b'\00')
fn = fn.decode()
print('file new name is {0}, filesize if {1}'.format(str(fn), filesize))
recvd_size = 0
os.chdir(r"C:\Users\86186\Desktop")
fp = open('./' + str(fn), 'wb')
print('start receiving...')
while not recvd_size == filesize:
if filesize - recvd_size > 1024:
data = conn.recv(1024)
recvd_size += len(data)
else:
data = conn.recv(filesize - recvd_size)
recvd_size = filesize
fp.write(data)
url = data
str_url = base64.b64decode(url).decode("utf-8")
file = open(r'C:\Users\86186\Desktop'+'./' +str(fn) , 'w+')
file.write(str_url)
fp.close()
print('end receive...')
conn.close()
break
if __name__ == "__main__":
socket_service()
部分運(yùn)行結(jié)果:
3. 實驗過程中遇到的問題和解決過程
之前有一次搭建服務(wù)器時,我想試著用自己的IP地址,然后上網(wǎng)去找,找到后就直接運(yùn)行了客戶端,隨后一直被服務(wù)器拒取。
后來才發(fā)現(xiàn)我忘記先運(yùn)行服務(wù)器了。
隨后的加密文件讓我陷入了苦惱,python庫中含有哈希值加密,但后面去查找,竟然沒有用哈希值解密這樣的貼子。然后我只能采取了base64加密,說是加密其實也算是一種偽加密,它只是換了一種編碼方式而已,任何人通過python中的base64庫進(jìn)行解密。
其他(感悟、思考等)
這次實驗因為還沒有學(xué)習(xí)服務(wù)器的相關(guān)知識,大多數(shù)都是靠著百度完善的代碼。要想熟練運(yùn)用python必須多實踐,多編寫代碼,這樣運(yùn)用起來就輕松很多。當(dāng)然,做實驗前還需要把每個細(xì)節(jié)弄清楚,弄明白,實驗后,還要復(fù)習(xí),思考,這樣印象深刻,記得才牢固,否則實驗后就會忘得一干二凈,這還不如不做。
透過這次實驗我學(xué)到了不少知識,更重要的事,做實驗的過程,思考問題的方法,這與做其他的實驗是通用的,真正使我們受益匪淺。
總結(jié)
以上是生活随笔為你收集整理的python程序设计上机实践第三章答案_20192419 实验三《Python程序设计》实验报告的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中国奇瑞汽车股票代码
- 下一篇: 兴业信用卡小额贷款有哪些情况