20242125单嘉怡 实验三《Python程序设计》实验报告
20242125 单嘉怡 《Python程序设计》实验三报告
课程:《Python程序设计》
班级: 2421
姓名: 单嘉怡
学号:20242125
实验教师:王志强
实验日期:2025年4月16日
必修/选修: 公选课
1.实验内容
1.1创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过Socket套接字(TCP/UDP)进行通信。
1.2.1创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序;
1.2.2要求包含文件的基本操作,例如打开和读写操作。
1.2.3要求发送方从文件读取内容,加密后并传输;接收方收到密文并解密,保存在文件中。
1.2.4程序代码托管到码云。
2. 实验过程及结果
2.1使用Socket套接字实现通信,发送文件内容(base64编码)
2.1.1创建服务端
代码如下:
import socket
import base64
 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(("127.0.0.1", 8000))# s.bind("localhost") 0-65535
s.listen()
 
conn, address = s.accept()#阻塞
 
data = conn.recv(1024)#接收
ddata=base64.b64decode(data)
dddata=ddata.decode('utf-8')
print("收到的信息为:", dddata)
 
sent="hi"
ssent=sent.encode('utf-8')
conn.sendall(base64.b64encode(ssent))
 
s.close()
2.1.2创建客户端
代码如下:
 
import socket
import os
import base64
 
file1 = open("秘密.txt", "r+")#"w"
file1.write("hello")
file1.seek(0)
cryptostring = file1.readline()
print(cryptostring)
 
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(("localhost", 8000))
 
send=cryptostring.encode('utf-8')
s.sendall(base64.b64encode(send))
 
data = s.recv(1024)
ddata=base64.b64decode(data)
dddata=ddata.decode('utf-8')
print("接收的数据为:",dddata)
 
s.close()
传输内容采用base64加密方法,对信息先加密,然后通过utf-8编码再进行传输,接收方通过逆过程解密
2.2使用Socket套接字实现通信,建立持续通信(DES加密)
2.2.1创建服务端
代码如下:
from DesModule import des_descrypt, des_encrypt
 
 
KEY="12345678"
tcpserver = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcpserver.bind(("172.16.231.92", 2025))
tcpserver.listen(5)
while True:
    conn, addr = tcpserver.accept()
    print(conn)
    while True:
        try:
            data=conn.recv(1024)
            ddata=data.decode("utf-8")
            recDecrypt=des_descrypt(ddata,KEY)
            print("您接收到信息:",recDecrypt)
 
            rep=input("请回复")
 
 
            ffrep=des_encrypt(rep,KEY)
            conn.sendall(ffrep.encode("utf-8"))
        except Exception:
            break
    conn.close()
2.2.2创建客户端
from DesModule import des_descrypt, des_encrypt
 
KEY="12345678"
tcpclient = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcpclient.connect(("127.0.0.1",2025))
while True:
    while True:
        sent=input(">>>").strip()
 
        fffsent=des_encrypt(sent,KEY)
        tcpclient.send(fffsent.encode('utf-8'))
 
        rec=tcpclient.recv(1024)
        drec=rec.decode('utf-8')
        ddrec=des_descrypt(rec.decode('utf-8'),KEY)
 
        print(ddrec)
tcpclient.close()```
通信内容采用DES加密,其原理为对明文相应的二进制编码使用密钥相应的二进制编码进行异或处理,加密模块如下:```
from pyDes import *
import binascii
 
def des_encrypt(s, KEY):
    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).decode()
def des_descrypt(s, KEY):
    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.decode()
if __name__ == "__main__":
    ciphertext = des_encrypt("hello, world!", "12345678")
    print("密文:",ciphertext)
    plaintext = des_descrypt(ciphertext, "12345678")
    print("解密后的明文:", plaintext)
使用时直接传入明文字符串,返回加密后的十六进制编码,因而在传输之前需要再使用utf-8编码处理,成为bytes类型,相应的,解密之前也应先进行utf-8反编码。
2.3实例
2.3.1文件内容一次性传递




2.3.2持续通话


2.4上传代码

3. 实验过程中遇到的问题和解决过程
问题1:脱离本机与其他同学的电脑链接失败
问题1解决方案:经过尝试发现服务端需要本机WLAN IPv4地址
问题2:base64加密失败
问题2解决方案:顺序错误,应当先进行base64编码,然后再用utf-8编码传输
其他(感悟、思考等)
Socket编程技术展示出一副完善的网络传输流程,具象化,便于理解网络传输是如何实现的。
参考资料
《PYthon编程从入门到实践》
《零基础学PYthon》
s
 
                    
                 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号