什么因素导致数据在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...'); }); });
- 在Node.js TCP套接字中testingKeepalive的function
- Nodejs错误:getaddrinfo ENOTFOUND&EADDRINFO
- Socket.io:在任何时候获取客户端会话ID
- NodeJS,SocketIO和Express逻辑上下文构build
- 如何从Node socket.io-client **通过HTTPS连接到节点socket.io-server **
- 如何使用NodeJS中的http模块在同一端口上打开IPv4和IPv6套接字?
- 关于Node.js中raw-socket的一些问题
- 在Socket.io中进行身份validation
- NodeJS的一个没有无状态的套接字解决scheme