Python实验报告三
20233309 2025-3-26 《Python程序设计》实验三报告
课程:《Python程序设计》
班级: 2333
姓名: 侯成子
学号:20233309
实验教师:王志强
实验日期:2025年4月16日
必修/选修: 公选课
1.实验内容
创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过Socket套接字(TCP/UDP)进行通信。
(1)创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序;
(2)要求包含文件的基本操作,例如打开和读写操作。
(3)要求发送方从文件读取内容,加密后并传输;接收方收到密文并解密,保存在文件中。
(4)程序代码托管到码云。
注:在华为ECS服务器(OpenOuler系统)和物理机(Windows/Linux系统)上使用VIM、PDB、IDLE、Pycharm等工具编程实现。
2. 实验过程及结果
(1)何为Socket?

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
客户端和服务器端的交流详情见以下图片:

(2)常用函数
①socket()创建socket描述符
类型为int socket(int domain,,int type,int protocol)
成功返回非负描述符,失败返回-1
domain:即协议域,又称为协议族(family)。决定了地址类型
常用的地址族有:
• AF_INET(用ipv4地址与端口号的组合)
• AF_INET6
• AF_LOCAL(AF_UNIX,本地通信用)
• AF_ROUTE
type:信息传送方式。
• SOCK_STREAM
• SOCK_DGRAM
• SOCK_RAW
• SOCK_PACKET
• SOCK_SEQPACKET
protocol:对应协议。
• IPPROTO_TCP TCP传输协议
• IPPROTO_UDP UDP传输协议
• IPPROTO_SCTP STCP传输协议
• IPPROTO_TIPCTIPC传输协议
通常设置为0,让其自动匹配。
②bind()绑定实际地址
int bind(int sockfd,const struct sockaddr *addr,soklen)
sockfd 一般服务端才需要绑定,客户端由系统内核解决
addr 所有协议都有一个公共的结构叫做const struct sockaddr,不同协议对应不同的具体结构
addrlen:协议结构体大小通常使用sizeof运算符计算
③listen()、connect() 主机监听、从机链接
④accept 建立链接
⑤read和write函数,读写
read函数是负责从fd中读取内容.当读成功时,read返回实际所读的字节数,如果返回的值是0表示已经读到文件的结束了,小于0表示出现了错误。如果错误为EINTR说明读是由中断引起的,如果是ECONNREST表示网络连接出了问题。
write函数将buf中的nbytes字节内容写入文件描述符fd.成功时返回写的字节 数。失败时返回-1,并设置errno变量。在网络程序中,当我们向套接字文件描述符写时有俩种可能。1)write的返回值大于0,表示写了部分或者是 全部的数据。
2)返回的值小于0,此时出现了错误。我们要根据错误类型来处理。如果错误为EINTR表示在写的时候出现了中断错误。如果为EPIPE表示 网络连接出现了问题(对方已经关闭了连接)。
⑥close关闭服务
(3)具体步骤
先将两台电脑连到同一个路由器的WiFi中,通过打开WLAN找到服务端电脑的IPv4地址,再将其填入服务端代码与客户端代码。(由于在寝室做的实验,因此借用了未参加Python课同学的电脑进行实验)

编写程序
用户端:
import socket
tcpclient = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcpclient.connect(("192.168.31.89", 2025))
while True:
data = input('>>>').strip()
if data == 'exit':
print("退出连接")
break
tcpclient.send(data.encode('utf-8'))
ret = tcpclient.recv(1024)
print(ret.decode('utf-8'))
tcpclient.close()
运行结果:

服务端:
import socket
tcpserver = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcpserver.bind(("192.168.31.89", 2025))
tcpserver.listen(5)
while True:
conn, addr = tcpserver.accept()
print(conn)
while True:
try:
data = conn.recv(1024)
print(data.decode("utf-8"))
# ret_data = "收到!"
ret_data = input("收到的信息为:")
conn.send(ret_data.encode('utf-8'))
except Exception:
break
conn.close()
运行结果:

再将代码上传到Git中


可以看到将代码成功上传到Git上:

3. 实验过程中遇到的问题和解决过程
- 问题1:尝试熄灯后做实验,发现两台电脑连接同一手机热点无法进行实验。
- 问题1解决方案:待白天用寝室里的wifi进行实验。
- 问题2:刚开始做实验时,目标计算机拒绝访问
- 问题2解决方案:关闭了它的防火墙就行了
- ...
其他(感悟、思考等)
通过本次实验,我了解到了socket的使用方法,我创建了服务端和客户端,监听了多个客户的请求,遇到的一个最主要的问题就是不知道IP地址该绑定哪一个,是要绑定服务端的。发现了拍摄的强大之处,是面向对象设计的,其中有很多模块非常方便,非常容易使用,比c语言的功能更简洁更方便。
浙公网安备 33010602011771号