TCP连接客户端服务器python

时间:2018-02-17 18:29:48

标签: 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 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)

这是另一个类的命令示例:

kettle.setOn(KETTLEIP)

但是,运行此代码时,它不会打印任何内容。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

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

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

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

如果您与TCP结婚,也许可以尝试我的bufsock模块(或实际上,它是Unif Calif Irvine版权所有的Opensource,但是我在为他们工作时写了它,并获得了他们释放它)。它在http://stromberg.dnsalias.org/~strombrg/bufsock.html。它的方法与大多数人对TCP的期望更接近。

HTH。

答案 1 :(得分:0)

我的猜测是你应该重用套接字,如@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)