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?

IMG_256

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

客户端和服务器端的交流详情见以下图片:

IMG_256

(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课同学的电脑进行实验)

fbbf2bd9ceba201a3048569946eda79

编写程序

用户端:

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()

  

运行结果:

2ee8e5f11c584119478f74ee6f389ef

再将代码上传到Git中

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

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


- 问题1:尝试熄灯后做实验,发现两台电脑连接同一手机热点无法进行实验。
- 问题1解决方案:待白天用寝室里的wifi进行实验。
- 问题2:刚开始做实验时,目标计算机拒绝访问
- 问题2解决方案:关闭了它的防火墙就行了

- ...


其他(感悟、思考等)

通过本次实验,我了解到了socket的使用方法,我创建了服务端和客户端,监听了多个客户的请求,遇到的一个最主要的问题就是不知道IP地址该绑定哪一个,是要绑定服务端的。发现了拍摄的强大之处,是面向对象设计的,其中有很多模块非常方便,非常容易使用,比c语言的功能更简洁更方便。

参考资料


《socket资料1》

《socket资料2》

《socket资料3》

posted @ 2025-04-24 12:30  Hoccz  阅读(32)  评论(0)    收藏  举报