110
社区成员




# 学号 2022-2023-2 《Python程序设计》实验x报告
课程:《Python程序设计》
班级: 2222
姓名: 刘璟瑜
学号:20222207
实验教师:王志强
实验日期:2020年4月17日
必修/选修: 公选课
## 1.实验内容创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过Socket套接字(TCP/UDP)进行通信。
## 2. 实验过程及结果
(1)创建服务端和客户端,将服务器,选择一个通信端口,用Python语言编程实现通信演示程序;
(2)要求包含文件的基本操作,例如打开和读写操作。
(3)要求发送方从文件读取内容,加密后并传输;接收方收到密文并解密,保存在文件中。
本次实验有两种通信方式,一种只能通信一次,另一种可以实现多次通信(只能发送一次并接受一次回复,多次发送的消息需要同等数目的回复)
(1)单次通信服务器
import socket
import os
from DesModule import *
file1 = open("秘密", "w+")#"w"
file1.write("20222212收到请回复")
file1.seek(0)
cryptostring = file1.readline()
print(cryptostring)
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(("localhost", 8000))
# s.connect(("192.168.249.46", 8000))
s.sendall(cryptostring.encode())
data = s.recv(1024)
print("从服务器接收的数据为:",data.decode())
s.close()
单次通信客户端
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind(("192.168.249.240", 8000))# s.bind("localhost") 0-65535 s.listen() conn, address = s.accept()#阻塞 data = conn.recv(1024)#接收 print("从客户端收到的信息为:", data.decode()) conn.sendall("20222207收到已回复!".encode()) s.close()
(2)多次通信服务器
import socket
tcpclient = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcpclient.connect(("192.168.249.46", 8000))
while True:
while True:
data = input('>>>').strip()
tcpclient.send(data.encode('utf-8'))
ret = tcpclient.recv(1024)
print(ret.decode('utf-8'))
tcpclient.close()
多次通信客户端 import socket tcpclient = socket.socket(socket.AF_INET, socket.SOCK_STREAM) tcpclient.connect(("192.168.249.46", 8000)) while True: while True: data = input('>>>').strip() tcpclient.send(data.encode('utf-8')) ret = tcpclient.recv(1024) print(ret.decode('utf-8')) tcpclient.close()
加密算法DES
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)
实验结果:
(1)作为服务器端 端口号为8000
通信过程:
我方界面
对方界面
(2)作为客户端 端口号为8000
通信过程:
我方界面
对方界面
3.实验结果:
## 3. 实验过程中遇到的问题和解决过程
问题1:遇到了 [WinError 10048] 通常每个套接字地址(协议/网络地址/端口)只允许使用一次 的问题
问题1解决方案:在csdn上找到,在任务管理器里将其他的pycharm项目关掉
4.代码托管
## 其他(感悟、思考等)
无
## 参考资料
- [《Java程序设计与数据结构教程(第二版)》](https://book.douban.com/subject/26851579/)
- [《Java程序设计与数据结构教程(第二版)》学习指导](http://www.cnblogs.com/rocedu/p/5182332.html)