Python sockets无法发送多条消息——数据在赋值前被引用
你好,我正在尝试向TCP服务器发送多个消息,但在我的客户端出现了一个错误,提示数据在赋值之前被引用。如果我只发送一条消息,就不会有错误,但如果我尝试发送多条消息,就会返回这个错误。
TCP服务器:
class Connect(object):
def __init__(self):
try:
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except:
print('socket cannot be created')
server_address = ('169.254.34.240', 10000)
#print('starting up: ' + server_address)
self.sock.bind(server_address)
self.sock.listen(1)
def listen(self):
while True:
connection, client_address = self.sock.accept()
print('client connected')
try:
data = connection.recv(16)
print(data)
if data == "STATUS":
connection.sendall("vision=ready")
elif data == "MEASURE":
connection.sendall("vision=computing")
elif data == "GET_RESULT":
connection.sendall("x=1.5,y=0.25,z=0.14,a=0.15")
else:
connection.sendall("wrong command")
finally:
connection.close()
def main():
connect = Connect()
connect.listen()
if __name__=='__main__':
main()
这是我的TCP客户端,它负责发送消息:
class Connect(object):
def __init__(self):
# Create a TCP/IP socket
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Connect the socket to the port on the server given by the caller
print('connecting to host')
self.sock.connect(('169.254.34.240',10000))
def send(self, command):
try:
message = command
print('sending: ' + message)
self.sock.sendall(message)
amount_received = 0
amount_expected = len(message)
while amount_received < amount_expected:
data = self.sock.recv(16)
amount_received += len(data)
print('received: ' + data)
finally:
self.sock.close()
return data
def main():
connect = Connect()
print connect.send("STATUS")
print connect.send("MEASURE")
if __name__=='__main__':
main()
所以有没有人知道是什么问题?我想我可能没有正确结束,或者其他什么原因。我觉得这可能和我在客户端的while循环有关?
2 个回答
0
提供完整的错误追踪信息会很有帮助,这样可以指明具体出错的行数。学会阅读这些错误追踪信息,它们看起来很无聊,但能提供有价值的信息,比如出错的源文件和具体行数。
看你的代码,我怀疑问题出在 finally
块里,也就是你 return data
的地方。
如果 while amount_received < amount_expected
这个条件不允许循环的第一次执行,或者在循环中 self.sock.recv(16)
这一行出现了异常,那么 data
就不会被赋值。
顺便说一下,你假设响应的长度和请求的长度是一样的,但你的服务器并没有提供这样的长度的响应。
3
问题在于你在每次请求后都调用了 self.sock.close()
来关闭连接,但没有在关闭后重新创建一个新的连接。每次关闭连接后,你都需要重新创建一个新的连接。
你可以通过为每个请求创建一个新的连接来解决这个问题,方法如下:
class Connect(object):
def connect(self):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print('connecting to host')
sock.connect(('127.0.0.1',10000))
return sock
def send(self, command):
sock = self.connect()
recv_data = ""
data = True
print('sending: ' + command)
sock.sendall(command)
while data:
data = sock.recv(1024)
recv_data += data
print('received: ' + data)
sock.close()
return recv_data
def main():
connect = Connect()
print connect.send("STATUS")
print connect.send("MEASURE")