110
社区成员




课程:《Python程序设计》
班级: 2324
姓名: 罗子林
学号:20234320
实验教师:王志强
实验日期:2024年4月24日
必修/选修: 公选课
创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过Socket套接字(TCP/UDP)进行通信。
(1)第一类服务端与客户端只执行一次相互传输操作,客户端先使用Des模块加密,再编码,将数据传输给服务端,服务端接收后将数据解码再解密,打印数据;
第一类服务端
import socket
from DesModule import des_descrypt,des_encrypt
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(("172.16.208.90", 2025))
s.listen()
conn, address = s.accept()
data = conn.recv(1024)
plaintext = des_descrypt(data.decode(), "12345678")
print("从客户端收到的信息为:", plaintext)
ciphertext = des_encrypt("20234320", "12345678")
conn.sendall(ciphertext.encode())
s.close()
第一类客户端
import socket
import os
from DesModule import *
file1 = open("秘密", "w+")#"w"
ciphertext = des_encrypt("hello", "12345678")
file1.write(ciphertext)
file1.seek(0)
cryptostring = file1.readline()
print(cryptostring)
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(("172.16.211.247", 8000))
s.sendall(cryptostring.encode())
data = s.recv(1024)
data=des_descrypt(data.decode(), "12345678")
print("从服务器接收的数据为:",data)
s.close()
(2)第二类服务端与客户端可执行多次对话操作,传输及加密原理同上,增加了循环操作实现对话功能,并进行了异常处理保证程序正确运行不会中断;
第二类客户端
import socket
from DesModule import*
tcpclient = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcpclient.connect(("172.16.211.247", 9000))
while True:
while True:
data: str = input('>>>').strip()
ciphertext = des_encrypt(data, "12345678")
tcpclient.send(ciphertext.encode('utf-8'))
ret = tcpclient.recv(1024)
ret = ret.decode('utf-8')
plaintext = des_descrypt(ret, "12345678")
print(plaintext)
tcpclient.close()
第二类服务端
import socket
import DesModule
tcpserver = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcpserver.bind(("172.16.211.247", 9000))
tcpserver.listen(5)
while True:
conn, addr = tcpserver.accept()
print(conn)
while True:
try:
data = conn.recv(1024)
decrypted_data = DesModule.des_descrypt(data.decode("utf-8"), "12345678")
print("收到来信:", decrypted_data)
ret_data = input("请回复:")
encrypted_ret_data = DesModule.des_encrypt(ret_data, "12345678")
conn.send(encrypted_ret_data.encode('utf-8'))
except Exception as wrong:
print("发生异常:",wrong)
break
conn.close()
(3)运行结果(与20232402 王艺瑶进行通话)
在调用函数或是模块时,要搞清楚需要传入的参数类型,返回的参数以及函数的功能,往往能避免错误,减少调试时间。