我在端口26542上的本地计算机上以守护进程模式运行Vowpal Wabbit(VW)。我可以验证它是否正在运行,因为它使用nc
响应它发送给它的消息。
$ echo ' | a b c' | nc localhost 26542
0.050000 0.050000 0.850000 0.050000
我想在python中编写一个客户端来做同样的事情而不调用nc
的系统调用,而是使用套接字。这是我到目前为止所拥有的。
class VwClient:
def __init__(self, vwhost, vwport):
self._host = vwhost
self._port = vwport
self._socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self._socket.connect((self._host, self._port))
print 'Socket connected to', self._host, 'on port', self._port
def close(self):
self._socket.shutdown()
def get(self, message):
print 'Sent:', self._socket.send(message)
d = self._socket.recv(1)
print d
return d
我将其调用为:
client = VwClient('localhost', 26542)
client.get(' | a b c')
这就是我所看到的:
$ python vw.py
Socket connected to localhost on port 26542
Sent: 8
之后它就会挂起。我在这里错过了什么?我尝试使套接字无阻塞但我无法使用recv()
阅读。我还在recv()
尝试了更高的缓冲区大小(尝试了8,64,128,1024),但这也没有用。
修改
对于任何坚持这个问题的人。解决方法是简单地在邮件中添加换行符。仍然需要对get
方法进行一些修改。
def get(self, message):
self._socket.sendall(message) # better use sendall()
d = self._socket.recv(1024) # assuming max 1024 are received
return d
这应该被称为client.get(' | a b c\n') # notice the newline