实验内容:
编写基于TCP协议的通信程序,包括Server与Client两个部分。实现回声程序:即客户端发送消息,服务器端将收到的消息原样会送给客户端。
提示:服务器端回送消息时,可以进行加工,例如给每个收到的消息加上“服务器回送”+原始消息+服务器端收到消息的时间;
客户端从4字节数据开始发送,采用循环n次的方式,逐渐增大数据量,观察从少量数据的发送到大量数据的发送,时间性能的变化,记录每次发送数据所需时间,利用excel制作曲线图;
实验环境
1) TCP/IP协议
2) 编程语言:python
实验步骤
本次报告为实验1的实验报告。传输的数据设为字符串“abcd”(可自由设置),随着传输次数i的增加字符串“abcd”的长度也将以i的平方增长(每100次一个循环),代码思想如下:
- 单机实验:
将服务器和客户端的IP地址按以下设置:
127.0.0.1为本地地址,端口号8082可以换成当前电脑空闲的其他网络端口
在一台主机上先执行客户端程序,此时客户端会每隔五秒钟监听一次,看服务器是否连接成功,如果连接不成功就会一直提醒,如图:
接下来我们运行服务器端,此时客户端和服务器连接成功并开始输送消息:
服务器接收到成倍增长的“abcd”如图:
客户端接收到服务器端回送的“abcd”串,并在字符串后给出接收该消息所用的时间(单位为毫秒)如图:
至此说明服务器和客户端已经通信结果成功,接下来我们停止客户端程序此时服务器提示我们客户端已断开:
至此,本地单机实验完成。
- 多机实验
同单机实验一样,只需将服务器和客户端的IP地址改为当前电脑所使用的IP地址即可。
通过win+R,cmd进入黑窗口,输入ipconfig即可查看当前电脑的IP
查看当前电脑的IP地址:
将服务端代码中的IP改为当前IP如图
在其他电脑上运行客户端代码,(需要联网)能够接收到消息说明实验成功。
#客户端代码:
import socket
import struct
import time
while True:
try:
client = socket.socket()
client.connect(('127.0.0.1', 8082))
print('已连接到服务端')
while True:
try:
#将运行时间记录进time.txt
with open('time.txt', 'w') as f:
star_time = time.time()
for i in range(1,100):
msge='abcd'*(i**2)
msg = msge.encode('utf-8')
head = struct.pack('i', len(msg))
client.send(head)
client.send(msg)
# 接收服务端发送的回声消息
echo_head = client.recv(4)
echo_size = struct.unpack('i', echo_head)[0]
echo_data = client.recv(echo_size)
end_time=time.time()
total_time=end_time-star_time
f.write(str(total_time))
f.write('\n')
print('服务器回送信息:', echo_data.decode('utf-8'),'\t',total_time)
f.close()#记录完成关闭文件
except ConnectionResetError:
print('服务端已中断连接')
client.close()
break
except ConnectionRefusedError:
print('无法连接到服务器')
#服务端代码:
import socket
import struct
import time
server = socket.socket()
server.bind(('127.0.0.1', 8082))
server.listen(5)
while True:
conn, client_addr = server.accept()
print('客户端已连接')
while True:
try:
head = conn.recv(4)
size = struct.unpack('i', head)[0]
data = conn.recv(size)
print('已收到客户端信息:', data.decode('utf-8'))
# 回声功能:将客户端发送的消息再发送回去
conn.send(head)
conn.send(data)
except ConnectionResetError:
print('客户端已中断连接')
conn.close()
break
实验结果与分析
为方便统计时间,我添加了一个time.txt(在客户端文件client2.py的同一个文件目录下创建一个time.text文档)来记录运行时间,程序将自动把每次传输数据的时间计入txt文件(单位毫秒):
time.txt
为下面用excel画曲线图做准备。
由单机实验结果建立接收时间(80次)曲线图:
time.xlsx
由图可得刚开始的时候随着发送消息量的增多发送时间趋于一条平行线,说明此时发送消息的通道容量还未饱和。到30次的时候曲线坡度开始上升,到47次时,曲线坡度发送突变,随后时间与次数的关系开始有明显的正相关性,说明此时发送消息的通道已经饱和。