我有一个客户端类,它应该连接到服务器(在本例中为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)
但是,运行此代码时,它不会打印任何内容。
有人可以帮忙吗?
答案 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)