【问题标题】:Connect JS client with Python server连接 JS 客户端和 Python 服务器
【发布时间】:2016-08-27 18:32:03
【问题描述】:

我对 JS 和 Python 比较陌生,所以这可能是一个初学者的问题。我正在尝试将字符串从 JS 客户端发送到 Python 服务器(然后将字符串发送到另一个 Python 客户端)。

这是我的代码:

JS 客户端:

    var socket = io.connect('http://127.0.0.1:8484');
    socket.send('lalala');

Python 服务器:

HOST = '127.0.0.1'
PORT = 8484
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(2)

#JS
conn1, addr1 = s.accept()
print 'Connected by', addr1
#PY
conn2, addr2 = s.accept()
print 'Connected by', addr2

while 1:
    try:
        data = conn1.recv(1024)
    except socket.error:
        print ''
    if data:
        print data.decode('utf-8')
        conn2.send('data')

Python 客户端:

def __init__(self): #inicializacion
    self.comando = '0'
    self.HOST = '127.0.0.1'
    self.PORT = 8484
    self.cliente = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    fcntl.fcntl(self.cliente, fcntl.F_SETFL, os.O_NONBLOCK)

def activate(self): 
    print "Plugin de envio en marcha."

def deactivate(self):
    print "Plugin de envio off."

def __call__(self, sample):
    self.cliente.connect((self.HOST, self.PORT))
    try:
        self.comando = self.cliente.recv(1024).decode('utf-8')

    except socket.error, e:
        self.comando = '0'

    print "******************"
    print self.comando
    print "******************"

我从 python 服务器向 python 客户端发送随机字符串没有问题,但我无法从 JS 客户端接收。

当我运行服务器和客户端时,连接没有问题:

Connected by ('127.0.0.1', 52602)
Connected by ('127.0.0.1', 52603)

但是,例如,这是我从 JS 收到的:

GET /socket.io/1/?t=1472322502274 HTTP/1.1
Host: 127.0.0.1:8484
Connection: keep-alive
Origin: http://127.0.0.1:8880
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.84 Safari/537.36
Accept: */*
Referer: http://127.0.0.1:8880/normal.html
Accept-Encoding: gzip, deflate, sdch
Accept-Language: es-ES,es;q=0.8
Cookie: io=e7675566ceab4aa1991d55cd72c8075c

但我想要字符串'lalala'。

有什么想法吗?

(谢谢!)

【问题讨论】:

    标签: javascript python node.js sockets socket.io


    【解决方案1】:

    如果要连接python TCP服务器,可以在node中使用类似如下的代码:

    var net = require('net');
    
    var client = new net.Socket();
    client.connect(8484, '127.0.0.1', function() {
        console.log('Connected');
        client.write('Hello, server! Love, Client.');
    });
    
    client.on('data', function(data) {
        console.log('Received: ' + data);
        client.destroy(); // kill client after server's response
    });
    

    由您的 python 代码启动的服务器不侦听原始 TCP 连接。如果您阅读了HTTP protocol,您就会明白为什么在您的 js 代码发送该字符串时会看到这些字符串。

    【讨论】:

    • 谢谢!但是我现在有这个问题: required.js:417 Uncaught Error: Module name "net" has not been loaded yet for context: _.使用 require([]) requirejs.org/docs/errors.html#notloaded。我试图解决它,但如果我使用: require(['net'], function (net) { });我有: required.js:2417 GET 127.0.0.1:8880/net.js 500 (Internal Server Error) VM1275:1 Uncaught SyntaxError: Unexpected identifier and: required.js:417 Uncaught Error: Load timeout for modules: net requirejs.org/docs/errors.html#timeout 有什么想法吗?跨度>
    • @DidiNa 你是在浏览器中这样做的吗?
    • 是的,我有一个 Web 应用程序,用户在其中编写一个字符串,然后:html -> js -> node.js -> python 服务器 -> python 客户端。我现在的问题是将字符串从 js 发送到 node.js。
    • 浏览器中的js通过哪个协议与运行node.js的服务器联系?
    • 我不确定,但是 Socket.IO 使用 WebSocket 协议。
    【解决方案2】:

    socket.socket() 不创建 websocket 服务器。

    你应该使用 websocket 服务器,检查这个:https://websockets.readthedocs.io/en/stable/

    你的 python 客户端也应该使用websockets,即使你仍然可以使用原始套接字发送数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-06
      相关资源
      最近更新 更多