144
社区成员




课程:《Python程序设计》
班级: 2223
姓名: 吴昊宇
学号:20222314
实验教师:王志强
实验日期:2023年4月20日
必修/选修: 公选课
创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过Socket套接字(TCP/UDP)进行通信。
#客户端
import socket
# 创建套接字对象,AF_INET基于TCP/UDP通信,SOCK_STREAM以数据流的形式传输数据,这里就可以确定是TCP了
server = socket.socket(family=socket.AF_INET,type=socket.SOCK_STREAM)
# 绑定ip地址和端口,127.0.0.1代表回环地址,只能当前计算机访问
server.bind(('127.0.0.1',8080))
# 建立半链接池,允许存放5个请求
server.listen(5)
# 等待建立连接请求,会返回两个值,一个是连接会话,一个是连接的客户端IP与端口
conn,ip_addr = server.accept()
while True:
# 接收客户端传递的数据,不能超过1024字节
res = conn.recv(1024)
# 将客户端的数据接收到以后,转换成大写再编码后发送给客户端
conn.send(res.decode('utf-8').upper().encode('utf-8'))
# 注意:close不能放在这里面,因为在这里面的话,只能一次后就关闭了
# 关闭与客户端的连接
conn.close()
# 关闭套接字
server.close()
#客户端
import socket
# 创建套接字对象,AF_INET基于TCP/UDP通信,SOCK_STREAM以数据流的形式传输数据,这里就可以确定是TCP了
client = socket.socket(family=socket.AF_INET,type=socket.SOCK_STREAM)
# 连接服务端
client.connect(('127.0.0.1',8080))
while True:
inp = input('>>>:').strip()
# 向服务端发送数据,需要转换成Bytes类型发送
client.send(inp.encode('utf-8'))
# 接收服务端回应给客户端的数据,不能超过1024字节
res = client.recv(1024)
print(res.decode('utf-8'))
# 套接字关闭
client.close()
运行结果:
先启动服务端
再启动客户端
思考与反思:
刚开始我并没有采用127.0.0.1来作为链接端口,而是采用了我电脑的ip(之前尝试过使用同学的ip,但是需要防火墙关闭,就没让我南京的同学以为我号被盗了是骗子说啥也不信,就没继续操作下去),但是仍然出现了拒绝链接的反馈,我使用nmap扫描了自己的端口,并没有问题,防火墙我也关了,至于为什么不行我还是没搞清楚,可能是因为权限不够?需要root权限?我还是不懂,这也是我本次试验的遗憾。当然,换成127.0.0.1(默认连自己)之后就可以了,也不需要做什么开防火墙权限和自定义可接受协议之类的杂活
感悟:socket其实并不是一门只能基于python的通信方式,它可以依赖于大多数语言,以后希望有机会可以实现更多的通信项目,加强自己对于通信领域的理解(虽然我不是通信专业的哈哈哈)