TCP连接客户端服务器python
我有一个客户机类,在这个类中它应该连接到服务器(在本例中是iKettle)并发送和接收数据。IP地址应该来自另一个主服务器,以便另一个类,并且此IP地址可以更改 以下是客户端代码: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
#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)