20214118 实验三《Python程序设计》实验报告
#学号20214118 《python程序设计》实验三报告
课程: 《python程序设计》
班级:2141
姓名:韦星宇
学号:20214118
实验教师:王志强
实验日期:2022年4月26日
必修/选修:公选课
##1.实验内容
- 创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过Socket套接字(TCP/UDP)进行通信。
##2.实验过程及结果
socket库介绍
创建Socket
socket.socket函数的前两个参数的默认值是socket.AF_INET和socket.SOCK_STREAM,创建TCP socket时可以直接写成socket.socket()。
1 import socket 2 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
连接服务器
1 s.connect(('127.0.0.1', 8000))
发送数据
sendall() 发送完整的TCP数据,成功返回None,失败抛出异常
1 data = "something you want to send" 2 3 s.sendall(data)
关闭连接
当连接不再需要时可以使用close关闭socket连接,关闭后的连接不能再进行任何操作。
1 sk.close()
编写程序
服务端
1 import socket 2 # 创建服务器端套接字 3 sk = socket.socket() 4 # 设置给定套接字选项的值。 5 # sk.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 6 # 把地址绑定到套接字 7 sk.bind(('127.0.0.1', 8898)) 8 # 监听链接 9 sk.listen() 10 # 接受客户端链接 11 conn, addr = sk.accept() 12 while True: 13 # 接收客户端信息 14 ret = conn.recv(1024) 15 # 打印客户端信息 16 print(ret.decode('utf-8')) 17 # 结束处理 18 if ret == b'bye': 19 conn.send(b'bye') 20 break 21 info = input('>>>') 22 conn.send(bytes(info, encoding='utf-8')) 23 # 关闭客户端链接 24 conn.close() 25 # 关闭服务器套接字 26 sk.close()
客户端
1 import socket 2 # 创建客户端套接字 3 sk = socket.socket() 4 # 尝试连接服务器 5 sk.connect(('127.0.0.1',8898)) 6 while True: 7 # 信息发送 8 info = input('>>>') 9 sk.send(bytes(info,encoding='utf-8')) 10 # 信息接收 11 ret = sk.recv(1024) 12 # 结束会话 13 if ret == b'bye': 14 sk.send(b'bye') 15 break 16 # 信息打印 17 print(ret.decode('utf-8')) 18 # 关闭客户端套接字 19 sk.close()
运行
在Pycham中打开Terminal1,运行服务器程序,可以和客户端程序聊天,打bye结束。
打开Terminal2,运行客户端程序,可以和服务器程序聊天,打bye结束。
##3.实验过程中遇到的问题及结果
- 问题1:选用send() 函数,发送数据,数据不全
- 问题1解决方案:查资料得知:send() 发送TCP数据,返回发送的字节大小。这个字节长度可能少于实际要发送的数据的长度。换句话说,这个函数执行一次,并不一定能发送完给定的数据,可能需要重复多次才能发送完成。
1 data = "something you want to send" 2 while True: 3 len = s.send(data[len:]) 4 if not len: 5 break
## 其他
通过实验三,认识了Socket——"套接字"。
在应用中,它基础而关键:应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。