20241101 2024-2025-2 《Python 程序设计》实验三报告
20241101 2024-2025-2 《Python程序设计》实验三报告
课程:《Python程序设计》
班级:2411
姓名:苏萱
学号:20241101
实验教师:王志强
实验日期:2025.4.16
必修/选修: 公选课
1.实验内容
创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过Socket套接字(TCP/UDP)进行通信。
(1)创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序;
(2)要求包含文件的基本操作,例如打开和读写操作。
(3)要求发送方从文件读取内容,加密后并传输;接收方收到密文并解密,保存在文件中。
(4)程序代码托管到码云。
2. 实验过程及结果
1.服务端
import socket
from operator import truediv
server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server_socket.bind(("172.20.10.3", 8000))
server_socket.listen(5)
conn,address = server_socket.accept()
while True:
data = conn.recv(1024).decode('utf-8')
if not data:
break
print(f'收到对方信息:{data}')
conn.send(input("服务端回应:").encode())
conn.close()
server_socket.close()
①实例化一个socket对象
server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
socket.AF_INET:服务器之间网络通信 该参数表示该socket网络层使用IP协议
socket.SOCK_STREAM:流式socket 面向连接 该参数表示该socket传输层使用tcp协议
②绑定地址和端口 为客户端提供IP地址和端口号
server_socket.bind(("172.20.10.3", 8000))
server_socket.bind(address):将套接字绑定到地址,在AF_INET下,以元组(host,port)的形式表示地址,在网络编程中,host通常指的是IP地址
IP:
'0.0.0.0':绑定本机所有网络接口IP地址
如果希望对方使用指定某个IP地址连接,写成固定的IP地址
端口:
客户端端口号:当客户端(比如你的电脑或手机)发起一个网络请求时,它会临时分配一个端口号(通常是动态端口,范围在49152-65535之间)。这个端口号就像客户端的“门铃”,用于标识客户端的网络请求,并确保服务器端的响应可以正确地返回给发起请求的客户端。
服务端端口号:服务端(比如网站服务器或应用服务器)通常会监听一个固定的、已知的端口号(比如80端口用于HTTP服务,443端口用于HTTPS服务)。这个端口号就像服务端的“门铃”,客户端通过这个端口号可以找到服务端,并与之建立连接。
举个例子:
假设你想访问一个网站(服务端),你的电脑(客户端)会做以下事情:
你的浏览器(客户端应用程序)会随机选择一个端口号(比如55000),并通过这个端口号向目标网站的服务器发送一个请求。
请求中会包含目标网站的IP地址和你电脑的IP地址,以及目标端口号(比如80)和你电脑的端口号(比如55000)。
网站的服务器收到请求后,会通过目标端口号(80)识别请求是发给它的,并通过源端口号(55000)知道响应应该发送回哪个客户端。
服务器处理完请求后,会将响应数据发送回你的电脑,目标端口号是你的电脑的端口号(55000),源端口号是服务器的端口号(80)。
你的电脑收到响应后,会通过端口号(55000)将数据传递给浏览器,浏览器再将网页内容显示出来。
③使socket处于监听状态,等待客户端的连接请求
server_socket.listen(5)
server_socket.listen(backlog):开始监听TCP传入连接。backlog指定在拒绝连接之前,最多接受多少个等待连接的客户端。该值至少为1,大部分应用程序设为5就可以了。
④接受客户端连接
conn,address = server_socket.accept()
s.accept():接受TCP连接并返回(conn,address),其中conn是新的套接字对象,可以用来接收和发送数据。address是连接客户端的地址。
⑤尝试读取对方发送的信息
发送的数据类型也必须是bytes类型,所以需要编码
data = conn.recv(1024).decode('utf-8')
s.recv(bufsize[,flag]):接受TCP套接字的数据。数据以字节串形式返回,bufsize指定要接收的最大数据量。flag提供有关消息的其他信息,通常可以忽略。
data.decode():读取的字节数据是bytes类型,需要解码
if not data:
break
print(f'收到对方信息:{data}')
若对方关闭了连接,conn.recv()返回空字节,直接跳出循环结束消息收发
⑥回复对方信息
conn.send(input ("服务端回应:").encode())
⑦调用close()关闭socket
conn.close()
server_socket.close()

2.客户端
import socket
client_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client_socket.connect(('172.20.10.3', 8000))
while True:
toSend = input()
if toSend == '':
break
client_socket.send(toSend.encode('utf-8'))
data = client_socket.recv(1024).decode("utf-8")
if not data:
break
print("服务端回答:",data)
client_socket.close()
连接服务端socket
client_socket.connect(('172.20.10.3', 8000))
s.connect(address):连接到address处的套接字。一般address的格式为元组(SERVER_IP,SERVER_PORT),如果连接出错,返回socket.error错误。

3. 实验过程中遇到的问题和解决过程
问题:对socket编程技术掌握不熟练
解决方法:如上述实验过程,对socket类型及函数进行了总结和注释

浙公网安备 33010602011771号