python套接字可以';t发送多条消息--数据在分配前被引用--

python套接字可以';t发送多条消息--数据在分配前被引用--,python,sockets,tcp,Python,Sockets,Tcp,您好,我正在尝试向tcp服务器发送多条消息,但在我的客户端中,我收到一个错误,即在分配之前引用了数据。如果我发送一条消息,则不会出现错误,但如果我尝试发送多条消息,则返回错误 tcp服务器: class Connect(object): def __init__(self): try: self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) except:

您好,我正在尝试向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()
类连接(对象):
定义初始化(自):
#创建TCP/IP套接字
self.sock=socket.socket(socket.AF\u INET,socket.sock\u STREAM)
#将套接字连接到调用者提供的服务器上的端口
打印('连接到主机')
自插座连接('169.254.34.240',10000))
def发送(自我,命令):
尝试:
消息=命令
打印('发送:'+消息)
self.sock.sendall(消息)
收到的金额=0
预期金额=len(消息)
当收到的金额小于预期金额时:
数据=self.sock.recv(16)
收到的金额+=len(数据)
打印('接收:'+数据)
最后:
self.sock.close()
返回数据
def main():
connect=connect()
打印连接发送(“状态”)
打印连接发送(“测量”)
如果“名称”=“\uuuuuuuu主要”:
main()

所以,有人提出了一个想法,我想我没有正确地结束或者什么的,我认为这与我在客户中的时间有关

问题是您在每次请求后调用
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")

提供完整的堆栈跟踪将有助于指出问题所在的确切位置。学习阅读这些堆栈跟踪,它们看起来很无聊,但提供了有价值的信息,如源文件和它来自的行

读取代码时,我怀疑它在
最后
块失败,在该块中,您
返回数据

数据
将不会有赋值,在这种情况下,
当收到的金额
甚至不允许循环中的第一轮,或者如果使用该循环,将在行
self.sock.recv(16)
上发生异常


顺便说一句:您假设响应的长度与请求的长度相同,但您的服务器不提供具有该长度的响应。

您得到的错误是什么?在分配之前引用了该数据,但是,如果我发送一条消息,如状态,它将正确打印,如果我发送两条消息,它将称为错误。请编辑错误的完整回溯到您的问题。没问题!你也应该看看扬·沃辛斯基的答案。我修改了从服务器读取数据的方式。这允许您从服务器读取任意长度的数据,而不仅仅是与发送到服务器的消息长度相等的数据。