我在python中编写一个TCP客户端,当它连接到服务器并回答它时需要从服务器获取数学问题。 我用Netcat连接到服务器并在Wireshark上看到了这个:
唯一的区别是服务器发出问题后我的代码没有确认。
这是我的代码:
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = 'x.x.x.x'
port = 1337
s.connect((host, port))
while 1:
data = s.recv(1024)
print(data)
splited_data = data.splitlines()
exercise = splited_data[-1].decode("utf-8")
print(exercise)
exercise = splited_data[-1].split()
num1 = int(exercise[0])
arithmetic = exercise[1].decode("utf-8")
num2 = int(exercise[2])
if arithmetic == '+':
answer = num1 + num2
elif arithmetic == '-':
answer = num1 - num2
elif arithmetic == '*':
answer = num1 * num2
elif arithmetic == '/':
answer = num1 / num2
elif arithmetic == '%':
answer = num1 % num2
else:
print(arithmetic)
print(answer)
print(str(answer).encode('utf-8'))
s.send(str(answer).encode('utf-8'))
答案 0 :(得分:0)
无论服务器使用哪种协议将这些问题封装到消息中,您的代码都没有相应的代码来接收此类消息。您需要遵循服务器正在使用的协议的文档,或者如果协议没有记录,则对其进行反向工程。
TCP是一种字节流协议,不保留应用程序消息边界。要实现消息,您需要编写消息层。你没有写过这样的代码。
每当两个程序要交换消息时,他们必须就如何标记和识别这些消息的开头和结尾达成一致。发件人必须具有代码,以便按照约定标记邮件的结尾。接收方必须有代码才能找到消息的结尾。您的接收器没有这样的代码,因此无法可靠地确定消息的结束位置。
答案 1 :(得分:0)
我会在你的while循环后面使用s.close()来结束连接。
在您的第一个Wireshark片段中,看起来一方无法正常关闭TCP连接。