如何连接到 TCP 服务器并向其传递 Javascript

How to connect to a TCP server and pass a Javascript to it

我绝对是 JS 和节点的新手。我有 telescope 名为 SkyX Pro 的管理软件,它能够 运行 端口 3040 上的 TCP 服务器。我可以使用 Netcat 连接到它并向它发送一个以 / 开头的 Javascript /* Javascript *// 这有效并允许我启动相机和其他设备并发送拍照命令等。问题是它需要从批处理文件中 运行 获取任何信息回到 HTML 艰难的页面(例如相机、调焦器和滤镜轮的状态和温度)。

NC 调用看起来像“NC localhost 3040 < Javascript-file.js

为了绕过浏览器以解决本地计算机安全问题,我想 运行 从 node.js 使用可能的套接字。io-client 如果可能的话,但我不知道正确的方法它的语法。

我已经看到很多客户端语法发送你好等,但没有发送 javascript 并允许我可以理解的 two-way 连接。

我试过使用:

var socket = io.connect('http://localhost');`enter code here`
socket.on('httpServer', function (data) {
console.log(data);
document.write(data + "\r\n");
socket.emit('tcp', "For TCP");
});


const net = require('net');
const client = new net.Socket();
client.connect({ port: 3040, host: process.argv[2] });
client.on('data', (data) => {
console.log(data.toString('utf-8'));

但我对它的理解还不够深入,无法解决它为什么不工作的问题。

任何帮助都将是非常好的,请像对待需要一步一步的婴儿一样对待我。

加油

彼得

阅读 [1],我们可以假设 socket-io 不适合您,因为您拥有的服务器听起来像是典型的 tcp-socket 服务器,而不是 socket.io服务器(需要特殊的 headers )或 web-socket 服务器。

所以你只需要“网络”库来完成这项工作。

const net = require('net');

// module to send a message to TCP-socket server and wait for the response from socket-server
const sendAndReceive = async (client, message) => {

  client.write(message);

  let response = null
  await ( new Promise( (resolve, reject) => {
    client.on('data', function(data) {
      response = data;
      resolve()
    });
  }))

  return response;

}

// send a single message to the socket-server and print the response
const sendJSCode = (message) => {

  // create socket-client
  const client = new net.Socket();
  client.connect(3040, 'localhost', async function() {
    console.log('Connected');

    // send message and receive response
    const response = await sendAndReceive(client, message)

    // parse and print repsonse string
    const stringifiedResponse = Buffer.from(response).toString()
    console.log('from server: ', stringifiedResponse)

    // clean up connection
    client.destroy()

  });


}

sendJSCode('var Out; \n Out="TheSky Build=" + Application.build \n\r')
  • 此脚本将:

    • 启动套接字客户端
    • 连接成功,客户端发送消息
    • 客户端收到来自该消息的回复
    • 客户端向终端打印响应
  • 请注意,TheSkyX 对每条消息有 4096 字节的限制[2],超过此限制,我们将需要对消息进行分块。因此,您可能希望 js-code 简短而准确。

  • 我给出的那个片段是最小的,它不处理来自服务器的错误。如果你愿意,你可以添加client.on("error", .. )来处理它。

  • 您直接从浏览器连接到套接字服务器的观点非常有趣,不幸的是,出于安全考虑,现代浏览器本身不允许这样做3

[1] https://socket.io/docs/#What-Socket-IO-is-not:~:text=That%20is%20why%20a%20WebSocket%20client,to%20a%20plain%20WebSocket%20server%20either.

[2]https://www.bisque.com/wp-content/scripttheskyx/scriptOverSocket.html#MSearchField:~:text=set%20to%204096%20bytes