1.實(shí)驗(yàn)內(nèi)容
創(chuàng)建服務(wù)端和客戶端,服務(wù)端在特定端口監(jiān)聽(tīng)多個(gè)客戶請(qǐng)求。客戶端和服務(wù)端通過(guò)Socket套接字(TCP/UDP)進(jìn)行通信。
要求:
(1)創(chuàng)建服務(wù)端和客戶端,選擇一個(gè)通信端口,用Python語(yǔ)言編程實(shí)現(xiàn)通信演示程序;
(2)要求包含文件的基本操作,例如打開(kāi)和讀寫操作。
(3)要求發(fā)送方從文件讀取內(nèi)容,加密后并傳輸;接收方收到密文并解密,保存在文件中。
(4)程序代碼托管到碼云。
2. 實(shí)驗(yàn)過(guò)程及結(jié)果
(1)設(shè)計(jì)思路
該實(shí)驗(yàn)?zāi)繕?biāo)是制作一個(gè)基于socket的通訊器,根據(jù)之前課上學(xué)習(xí)的內(nèi)容及課后作業(yè),本次實(shí)驗(yàn)不難完成。
加密上選擇的是基于pyDes的CBC模式DES加密,實(shí)現(xiàn)了客服端與服務(wù)器的雙向加密通信。基于Python標(biāo)準(zhǔn)庫(kù)tkinter,實(shí)現(xiàn)了可視化選擇目標(biāo)文件的功能。但由于沒(méi)有具體實(shí)現(xiàn)tkinter窗體(極其不標(biāo)準(zhǔn)的使用方法),導(dǎo)致使用該功能后會(huì)有一個(gè)無(wú)內(nèi)容的tkinter窗體殘留,雖然不影響總體使用,但對(duì)程序的完成性和一致性有所破壞。
(2)主要代碼介紹
部分代碼有參考。
報(bào)告中只貼出了部分代碼,全部代碼已上傳碼云:服務(wù)器部分,客戶端部分,DES加解密部分
加解密部分:
基于pyDes庫(kù)實(shí)現(xiàn)DES加解密功能。
from pyDes import des, CBC, PAD_PKCS5
import binascii
key_ = ‘12345675’
def des_encrypt(s):
“”“
DES 加密
:param s: 原始字符串
:return: 加密后字符串,16進(jìn)制
”“”
secret_key = key_
iv = secret_key
k = des(secret_key, CBC, iv, pad=None, padmode=PAD_PKCS5)
en = k.encrypt(s, padmode=PAD_PKCS5)
return binascii.b2a_hex(en)
def des_descrypt(s):
“”“
DES 解密
:param s: 加密后的字符串,16進(jìn)制
:return: 解密后的字符串
”“”
secret_key = key_
iv = secret_key
k = des(secret_key, CBC, iv, pad=None, padmode=PAD_PKCS5)
de = k.decrypt(binascii.a2b_hex(s), padmode=PAD_PKCS5)
return de
客戶端部分:
循環(huán)發(fā)送字符串給服務(wù)器。取‘close_’作為關(guān)閉連接的保留字。
import socket
from mydes import des_descrypt, des_encrypt
from tkinter.filedialog import askopenfilename
if __name__ == ‘__main__’:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((‘127.0.0.1’, 8001))
print(‘連接服務(wù)器成功’)
while True:
ch = input(‘1.發(fā)送字符串 2.發(fā)送文件 3.退出\n請(qǐng)選擇想要使用的功能:’)
if ch == ‘1’:
str_ = input(‘請(qǐng)輸入要傳輸?shù)膬?nèi)容:’)
elif ch == ‘2’:
filename = askopenfilename()
with open(filename, ‘r’, encoding=‘utf-8’) as f:
str_ = f.read()
elif ch == ‘3’:
str_ = ‘close_’
str_ = des_encrypt(str_)
s.sendall(str_)
break
else:
print(‘無(wú)該選項(xiàng),請(qǐng)重新輸入’)
str_ = des_encrypt(str_)
# print(type(str_))
s.sendall(str_)
data = s.recv(1024)
data = des_descrypt(data)
print(data.decode())
s.close()
print(‘連接已關(guān)閉’)
服務(wù)器部分:
循環(huán)接收客戶端發(fā)送的數(shù)據(jù),并寫入文件中。取‘close_’作為關(guān)閉連接的保留字。
import socket
from mydes import des_descrypt, des_encrypt
if __name__ == ‘__main__’:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((‘127.0.0.1’, 8001))
print(‘服務(wù)器已創(chuàng)建,正在監(jiān)聽(tīng)中。..’)
s.listen()
conn, address = s.accept()
while True:
data = conn.recv(1024)
data = des_descrypt(data)
# print(data, type(data))
if data == b‘close_’:
break
else:
with open(‘received’, ‘wb’) as f:
f.write(data)
str_ = ‘服務(wù)器已接收:’+str(data)
str_ = des_encrypt(str_.encode())
conn.sendall(str_)
print(‘接收數(shù)據(jù):’, data.decode(), ‘\n已寫入received.txt文件中’)
s.close()
print(‘服務(wù)器關(guān)閉’)
(4)程序結(jié)果
客戶端:
發(fā)送字符串:

發(fā)送文件

結(jié)束連接

服務(wù)器:

-
程序設(shè)計(jì)
+關(guān)注
關(guān)注
3文章
263瀏覽量
31692 -
語(yǔ)言編程
+關(guān)注
關(guān)注
0文章
23瀏覽量
10131 -
python
+關(guān)注
關(guān)注
57文章
4876瀏覽量
90025
發(fā)布評(píng)論請(qǐng)先 登錄
請(qǐng)問(wèn)單片機(jī)開(kāi)發(fā)的程序設(shè)計(jì)語(yǔ)言主要有哪幾種?
LABVIEW 2023 Q1調(diào)用python后一直報(bào)錯(cuò)1671
termux如何搭建python游戲
挖到寶了!人工智能綜合實(shí)驗(yàn)箱,高校新工科的寶藏神器
挖到寶了!人工智能綜合實(shí)驗(yàn)箱,高校新工科的寶藏神器
挖到寶了!比鄰星人工智能綜合實(shí)驗(yàn)箱,高校新工科的寶藏神器!
天合跟蹤獲得DNV第三方風(fēng)洞測(cè)試審查報(bào)告
委托測(cè)試報(bào)告和型式檢驗(yàn)報(bào)告什么區(qū)別
跟老齊學(xué)Python:從入門到精通
基于STM32 人群定位、調(diào)速智能風(fēng)扇設(shè)計(jì)(程序、設(shè)計(jì)報(bào)告、視頻演示)
基于STM32 人群定位、調(diào)速智能風(fēng)扇設(shè)計(jì)(程序、設(shè)計(jì)報(bào)告、視頻演示)
程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)
python入門圣經(jīng)-高清電子書(shū)(建議下載)
?如何在虛擬環(huán)境中使用 Python,提升你的開(kāi)發(fā)體驗(yàn)~
零基礎(chǔ)入門:如何在樹(shù)莓派上編寫和運(yùn)行Python程序?
《Python程序設(shè)計(jì)》實(shí)驗(yàn)三報(bào)告
評(píng)論