我正在创建一个使用python测试服务器的测试客户机。它将TCP数据包发送到服务器,服务器应在同一个TCP连接中将1个响应发送回客户端。如果它没有发送任何响应,或者发送了一个以上的响应,那么我在服务器代码中有一个bug。在
我要做的是监视TCP端口上的响应消息并将它们打印出来。如果没有响应,脚本应该在超时后继续执行。在
以下是相关代码:
import socket
import time
import multiprocessing
def get_response(response_stream, response_buffer_size):
response_count = 1
while True:
response = response_stream.recv(response_buffer_size).decode()
print("[response]", response_count, ":", response)
response_count += 1
TCP_IP = '192.168.1.101'
TCP_PORT = 12345
BUFFER_SIZE = 1024
MESSAGE = b"Bazinga!"
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((TCP_IP, TCP_PORT))
s.send(MESSAGE.encode())
print("Message sent.")
p = multiprocessing.Process(target = get_response(s,BUFFER_SIZE))
p.start()
p.join(3)
if p.is_alive():
print("Killing thread ...")
p.terminate()
p.join()
s.close()
print("Socket closed.")
所以结果是p.join(3)
永远无法到达,因为代码被困在get_response
的这一行:response = response_stream.recv(response_buffer_size).decode()
。在
脚本总是在那里等待解码下一个包,因此脚本永远不会正确终止。我做错什么了?在
首先,这一行:
实际上是在主线程上调用
get_response
。因为,您没有像应该传递的那样传递函数名,而是调用该函数并传递target
参数,即该调用的结果。在而是你想要的
^{pr2}$但这行不通!您无法轻松地将套接字传递给其他进程。有一些方法可以用管道来解决这个问题,但是只有在Windows上的Unix或Python3上才有实现。在
所以考虑一下我下面列出的不同方法。在
第三,您可能需要添加一些在子进程函数中突破无限循环的内容。我添加了一行来检查
recv
是否返回空字符串,您可以根据需要修改它。在考虑:
在这里,我们将all套接字活动放在worker线程中。它拥有并打开套接字,发送“Bazinga”并处理响应。在
相关问题 更多 >
编程相关推荐