使用Python客户端和Node.js服务器保持套接字连接

时间:2016-02-23 21:49:16

标签: python node.js sockets tcp

我正在尝试将Node.js与Python结合起来创建套接字连接。

问题是我可以发送数据,但我无法保持连接。

这是我在Node.js中的服务器

var net = require('net');

var HOST = '127.0.0.1';
var PORT = 1337;

net.createServer(function(sock) {

    console.log('CONNECTED: ' + sock.remoteAddress +':'+ sock.remotePort);

    sock.on('data', function(data) {

        console.log('DATA ' + sock.remoteAddress + ': ' + data);
        sock.write('You said "' + data + '"');

    });

    sock.on('close', function(data) {
        console.log('CLOSED: ' + sock.remoteAddress +' '+ sock.remotePort);
    });

}).listen(PORT, HOST);

console.log('Server listening on ' + HOST +':'+ PORT);

这是我在Python中的客户端

import socket
import sys

# Create a TCP/IP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# Connect the socket to the port where the server is listening
server_address = ('localhost', 1337)
print >>sys.stderr, 'connecting to %s port %s' % server_address
sock.connect(server_address)

try:

    # Send data
    message = 'This is the message.'
    print >>sys.stderr, 'sending "%s"' % message
    sock.sendall(message)

finally:
    print >>sys.stderr, 'closing socket'

这很有效,但客户端在发送数据后立即断开连接。

最终,我希望能够为用户输入发送数据,并接收数据。

有关如何执行此操作的任何建议将不胜感激。

1 个答案:

答案 0 :(得分:0)

我将接近用户输入方案。截至目前,您的程序只是运行并存在。

您希望能够组合两个天真的阻塞操作,运行某种输入循环(例如while True: data = input()),但也可以处理传入的流量。

执行此操作的基本方法是拥有2个线程,一个用于用户输入,另一个用于类似while True: data = socket.recv(buff)循环中的套接字连接,但此处还有另一个问题,因为您可能阻止单个连接 - 您必须为每个连接专用一个线程。为了避免这种情况,您可以使用select,它可以异步维护套接字连接。

如果没有用户输入,那么您可以使用select - 这将足以以简洁的方式处理多个连接。

无论哪种方式,我建议你看一些基于select的异步事件驱动框架,例如asyncioTwisted