这个模拟的思路是:客户端给服务器传一个固定长度的数据流,这程序用的10个字节,服务器接受到后,要判断是否出错,这个出错的概率用的是随机数,在服务器端生成的一个随机数,当随机数大于8时判定为出错,此时给客户端返回这个随机数,这个客户端也知道这个8,也就知道服务器收到的是错的,客户端重传,然后服务器再判断,直到对为止。当这个随机数小于8时,就是成功了,服务器会将收到的这10个字节数据保存起来,并将这个随机数返回给客户端,客户端也就知道对了,然后会再读10个字节,传给服务器。
# todo socket server 编程 服务端
def test_socket_server():
import socket
import datetime
import random
# 建立一个服务端
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('localhost', 9090)) # 绑定要监听的端口
server.listen(5) # 开始监听 表示可以使用五个链接排队
conn, add = server.accept() # 等待链接,多个链接的时候就会出现问题,其实返回了两个值
f = open('/home/zh/local/classes/computerNetwork/test.txt', 'w')
t1 = datetime.datetime.now()
print(t1)
while True:
try:
data = conn.recv(1024).decode() #接收数据
if data == "end":
print("客户端关闭")
break
ack = random.randint(1, 10)
if ack > 8:
print("模拟出错接受到的不存入文件,并发送错误信号", ack)
conn.send((str(ack)).encode("utf-8")) # 然后再发送数据
else:
print('recive:@', data, "@存入文件") # 打印接收到的数据
if data != "":
f.write(data)
conn.send((str(ack)).encode("utf-8")) # 然后再发送数据
except:
conn.close()
server.close()
print("客户端断开了,服务器端也断")
break
conn.close()
server.close()
print("服务器关闭")
t2 = datetime.datetime.now()
print(t1)
print(t2)
t = t2 - t1
print(t.total_seconds())
# todo socket client 编程 客户端
def test_socket_client():
import socket
# 客户端 发送一个数据,再接收一个数据
client = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM) # 声明socket类型,同时生成链接对象
client.connect(('localhost', 9090)) # 建立一个链接,连接到本地的9090端口
f = open('/home/zh/local/classes/computerNetwork/test2.txt', 'r+')
data = '1'
ch = ''
while True:
if int(data) > 8:
print("模拟服务器没有接收到,反复发送直到成功接收")
client.send(ch.encode('utf-8')) # 发送一条信息 python3 只接收btye流
data = client.recv(1024).decode() # 接收一个信息,并指定接收的大小 为1024字节
print("服务器端返回:", data) # 输出我接收的信息
else:
try:
ch = f.read(10)
if not ch:
client.send("end".encode('utf-8')) # 发送一条信息 python3 只接收btye流
break
client.send(ch.encode('utf-8')) # 发送一条信息 python3 只接收btye流
data = client.recv(1024).decode() # 接收一个信息,并指定接收的大小 为1024字节
print("服务器端返回:", data) # 输出我接收的信息
except:
print("服务器断开连接了,客户端也断开")
client.close() # 关闭这个链接
break
client.close() # 关闭这个链接
print("客户端断开链接")
# todo 画折线图
def draw_picture():
# import datetime
# t1 = datetime.datetime(2019, 10, 21, 22, 19, 11)
# print(t1)
# t2 = datetime.datetime.now()
# print(t2)
# t = t2 - t1
# print(t.total_seconds())
import matplotlib.pyplot as plt
x = [5, 10, 15, 20,
25,
30,
35,
40,
45,
50,
55
]
y = [2.219706, 1.091734, 0.688127, 0.520746,
0.423051,
0.351719,
0.311394,
0.265771,
0.258531,
0.214895,
0.219492
]
# x=[
# 90,
# 80,
# 70,
# 60,
# 50,
# 40,
# 30,
# 20,
# 10
# ]
#
# y=[
# 6.315903,
# 3.197172,
# 2.146958,
# 1.625612,
# 1.327782,
#
# 1.122105,
# 0.927034,
# 0.799626,
# 0.819249,
# ]
plt.plot(x, y, 'ko') # 点线
plt.plot(x, y, 'k')
# 同一文件不同包大小
plt.title('Performance Curve of different packet')
plt.ylabel('time / s')
plt.xlabel('packet / bit')
# 同一文件不同出错概率
# plt.title('Performance Curve of different error probability')
# plt.ylabel('time/s')
# plt.xlabel('error probability / %')
# plt.ylabel('time/ms')
# plt.xlabel('packet/bit')
plt.show()