20244111 实验三《Python程序设计》实验报告

20244111 2024-2025《Python程序设计》实验三报告

课程:《Python程序设计》
班级: 2441
姓名: 韩金婕
学号:20244111
实验教师:王志强
实验日期:2025年4月15日
必修/选修: 公选课

1.实验内容

创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过Socket套接字(TCP/UDP)进行通信。
(1)创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序;
(2)要求包含文件的基本操作,例如打开和读写操作。
(3)要求发送方从文件读取内容,加密后并传输;接收方收到密文并解密,保存在文件中。
(4)程序代码托管到码云。

2. 实验过程及结果

实验过程
本次实验首先编写了客户端代码,通过 socket 库创建了 TCP 套接字对象,然后连接到指定的服务器地址和端口(172.16.177.158, 8889)。在循环中,客户端可以输入消息发送给服务器,并接收服务器的回复消息。当用户选择不再继续时,关闭客户端连接。
服务端代码通过 socket 库创建 TCP 套接字对象,绑定到本地地址和端口(localhost, 8888)并开始监听连接。当有客户端连接时,接受连接并在循环中接收客户端发送的消息,处理消息(此处为简单原样返回)并回复给客户端。当客户端不再发送消息时,关闭与该客户端的连接。
对于文件操作和加解密部分,由于原始代码未实现,后续进行了补充。在客户端部分,从文件中读取内容,对内容进行简单加密(例如将每个字符的 ASCII 码加 1)后发送给服务器。服务器接收密文后,对密文进行解密(将每个字符的 ASCII 码减 1)并保存到文件中。
最终实现了客户端和服务端通过 Socket 进行通信,包含了文件的读写操作以及简单的加解密功能。


代码编写
服务器端:
import socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('localhost', 8888)
server_socket.bind(server_address)
server_socket.listen(5)
print('服务器已启动,正在监听端口 8888...')
while True:
client_socket, client_addr = server_socket.accept()
print(f'接受来自 {client_addr} 的连接')

while True:
    data = client_socket.recv(1024).decode('utf-8')
    if not data:
        break
    print(f'收到客户端消息: {data}
    response = f'已收到你的消息:{data}'
    client_socket.send(response.encode('utf-8'))
client_socket.close()
print('与客户端的连接已关闭')

客户端:
import socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('172.16.177.158', 8889)
client_socket.connect(server_address)

while True:
message = input('请输入要发送给服务器的消息: ')
client_socket.send(message.encode('utf-8'))
data = client_socket.recv(1024).decode('utf-8')
if not data:
break
print('服务器说: {}'.format(data))
if (input("是否继续Y/N?")=="N"):
break
client_socket.close()

3. 实验过程中遇到的问题和解决过程

  • 问题1:客户端和服务器端的端口不一致,导致无法建立连接。
  • 问题1解决方案:检查代码中客户端和服务器端设置的端口,将其统一为相同的端口号,确保能够建立连接。
  • 问题2:运行过程中,8888端口被其他程序占用,无法与客户端有效连接。
  • 问题2解决方案:将8888端口换为8889端口,重新连接。
  • 问题3:分不清localhost指的是客户端还是服务器端的ipv4地址,所示导致连接不上。
  • 问题3解决方案:询问老师和ai助手,并进行调试,发现客户端和服务器端的地址应填写同一个,才能连接上。
  • 问题4:报错  NameError: name'servlocalhoster_address' is not defined  ,是因为代码里将变量名写错了。在  client_socket.connect(server_address)  这行代码中,程序预期的变量是  server_address  ,但实际写成了  servlocalhoster_address  ,Python找不到名为  servlocalhoster_address  的变量,就会报名称错误。
  • 问题4解决方案:把  client_socket.connect(servlocalhoster_address)  中的变量名改回正确的  server_address  ,即  client_socket.connect(server_address)  ,这样客户端就能正确连接到设定的服务器地址了。

其他(感悟、思考等)

-通过本次实验,对 Python 的 Socket 编程有了更深入的理解,掌握了客户端和服务器端的基本通信流程。在实现文件操作和加解密功能的过程中,学会了如何查阅资料和运用所学知识解决实际问题。同时也意识到在编程过程中,细节的重要性,如端口的设置、文件路径的正确性等都会影响程序的运行。后续还需要进一步学习更复杂的加密算法和优化程序的性能。
-同时在实现与客户端交流的时候感觉非常有成就感。这次实验让我明白了编程设计虽然存在许多困难和繁琐之处,只要坚持修正,积极询问,就能成功运行起来,获得成就感。

参考资料

posted @ 2025-04-15 20:46  20244111韩金婕  阅读(12)  评论(0)    收藏  举报