什么因素导致数据在python(或python / node.js)的套接字中不通过?

(关于改写问题的build议?)

我通过一个客户端/服务器模式的套接字发送数据。 当我运行python(在pycharms)接收端的输出不会得到数据。 但是,当我使用重新运行的图标(在pycharms)数据通过。

我对这种行为感到困惑,并且不知道该问什么,除了告诉你我所观察到的。

这是客户端代码。 它正在与服务器安装与net (node.js)

client.py

 import socket // python version 2.7.* if __name__ == "__main__": client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect(('127.0.0.1', 7000)) client.sendall("test data to transmit") data = client.recv(50) client.close() print 'Received', repr(data) 

server.js

 var net = require('net'); // node v0.10.21 (latest) var PYTHON = {HOST :'127.0.0.1', PORT :7000}; net.createServer(function(socket) { console.log('CONNECTION for Python: ' + socket.remoteAddress +':'+ socket.remotePort); var body = ''; socket.on('data', function(data) { console.log('DATA ' + socket.remoteAddress ); body += data; }); socket.on('close', function(err) { console.log('finish transmitting data... '); console.log(body); }); }).listen(PYTHON.PORT, PYTHON.HOST, function() { console.log('---->socket to talk to python ' + PYTHON.HOST + ':' + PYTHON.PORT); }); 

更新 :添加server.js代码

我猜测这个问题。

客户端调用sendall发送一些数据,然后调用recv来获得响应。

但是服务器没有任何地方发送响应的代码。 所以客户将永远等待。 这意味着它永远不会closures套接字。 这意味着你的服务器中的socket.on('close')callback将永远不会被调用。 既然这是你打印身体的地方,什么都不会打印出来。

当你点击“重新运行”图标时,可能会杀死你的客户的前一个实例,然后启动一个新的。 杀死客户端将导致套接字closures,所以服务器将最终到达console.log(body)调用。

在服务器完成处理旧客户端之前,新客户端启动并连接是绝对有可能的(但当然不能保证),所以这些可以以任何顺序出现。


那么,你怎么解决这个问题?

那么,我不确定是否问题是客户端试图接收数据时不应该期待任何,或者服务器不应该发送数据时。

如果是前者,只需从客户端删除data = client.recv(50)行(以及最后的print )。

如果是后者,则在服务器的某个地方添加一条线路,将该线路发送回客户端。 你最想在on('data')callback中使用它,但这并不是唯一可以想象的理由(例如,你可以在套接字连接callback的顶部)。 你也可以添加一个callback,以便你可以看到成功。 所以:

 socket.on('data', function(data) { // your existing code here socket.write("Here's a response", function() { console.log('finish writing...'); }); });