TCP连接客户端服务器python

TCP连接客户端服务器python,python,tcp,Python,Tcp,我有一个客户机类,在这个类中它应该连接到服务器(在本例中是iKettle)并发送和接收数据。IP地址应该来自另一个主服务器,以便另一个类,并且此IP地址可以更改 以下是客户端代码: #command codes _ON = "0x4<LF>" _OFF = "0x0<LF>" #base command _BASE_COMMAND = "set sys output " _SLEEP_TIME = 0.5 #size of buffer when receiving

我有一个客户机类,在这个类中它应该连接到服务器(在本例中是iKettle)并发送和接收数据。IP地址应该来自另一个主服务器,以便另一个类,并且此IP地址可以更改

以下是客户端代码:

#command codes
_ON = "0x4<LF>"
_OFF = "0x0<LF>"

#base command
_BASE_COMMAND = "set sys output "

_SLEEP_TIME = 0.5

#size of buffer when receiving data
_BUFFER_SIZE = 1024
ip_address = ""
port = 2000

def initialiseSocket(self,ip_address):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((ip_address, self.port))
    return s

def setOn(self,ip_address):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((ip_address, self.port))
    s.send("set sys output 0x4<LF>")
    time.sleep(self._SLEEP_TIME)
    self.kettleResponse(ip_address)

def setOff(self,ip_address):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((ip_address, self.port))
    s.send(self._BASE_COMMAND + self._OFF)
    time.sleep(self._SLEEP_TIME)
    self.kettleResponse(ip_address)

def kettleResponse(self,ip_address):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((ip_address, self.port))
    data = s.recv(self._BUFFER_SIZE)
    print(data)
但是,当运行此代码时,它不会打印任何内容


有人能帮忙吗?

您可能连接和重新连接的次数太多了。有时这会简化事情,但在这种情况下,我相信这会让你失去反应

尝试只连接一次,然后重新使用套接字

另外,请记住,TCP是面向字节的协议,而不是面向消息的协议。注意,如果您发送10k、10k、10k,TCP套接字的另一端可能会收到5k、8k、17k,甚至更奇怪的可能性。总字节数将是相同的,数据将以正确的顺序到达,但是块的大小可能会被完全扰乱。出于这个原因,现在大多数人使用REST和http——在某些方面更简单

如果你嫁给了TCP,也许可以试试我的bufsock模块,或者实际上,它是开源的,拥有加州大学欧文分校的版权,但我是在为他们工作时写的,并获得了他们的许可发布它。它在。它的方法更接近大多数人对TCP的期望


HTH.

我的猜测是您应该重用套接字,正如@dstromberg所指出的:

class Kettle:
    # other stuff omitted...

    def setOn(self,ip_address):
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((ip_address, self.port))
        s.send("set sys output 0x4<LF>")
        time.sleep(self._SLEEP_TIME)
        self.kettleResponse(s) # pass the socket on

    def kettleResponse(self, s):
        # don't open a new socket, just reuse s
        data = s.recv(self._BUFFER_SIZE)
        print(data)

你能告诉我们这个计划能实现什么吗?您调用Ketter.setOnKetterIP的示例似乎应该一直运行到printdata,但您说没有打印输出。代码在什么地方卡住了吗?顺便说一句,您还没有包括所有代码。我怀疑它应该从class Kettle开始:它不打印任何东西为什么要这样做?您显示的代码中没有任何输出语句。是的,正确,它确实是从类Ketter开始的:但我刚刚删除了该位,当它运行时,它会无休止地运行,没有停止,它应该烧开水壶,说水壶烧开了,但没有说它,而且在KetterResponse中有输出语句。我如何重用套接字?那么我是否要将它添加到每个方法中?e、 抵消?我刚试过,但没有解决,仍然没有收到可能的响应。无论如何,看起来您应该提取一个方法,如:def setCommandself,ip_address,command:,它发送命令并打印响应。也许您应该从一个更简单的“HELLOKETTLE”程序开始:好的,我刚刚注意到您必须在每个命令之后发送一个“\n”,例如,如果设置了sys output 0x4,则应为:set sys output 0x4\n
class Kettle:
    # other stuff omitted...

    def setOn(self,ip_address):
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((ip_address, self.port))
        s.send("set sys output 0x4<LF>")
        time.sleep(self._SLEEP_TIME)
        self.kettleResponse(s) # pass the socket on

    def kettleResponse(self, s):
        # don't open a new socket, just reuse s
        data = s.recv(self._BUFFER_SIZE)
        print(data)