【问题标题】:tcp clients server communicationtcp客户端服务器通信
【发布时间】:2015-08-09 02:03:52
【问题描述】:

我正在尝试构建 TCP 服务器/客户端聊天 到目前为止我的代码是

server.js

var net=require("net");
var sockets=[];
var server=net.createServer(function(socket){
    console.log("new socket connected");
    sockets.push(socket);
    var sh="";
    socket.on("data",function(data){
        sh=sh+data;
    });
    socket.on("end",function(){
        sockets.forEach(function(x){
            if(x!==socket){
                x.write("Dakto poveda :"+ sh);
                sh="";
            }
        });
    })
    socket.on("close",function(){
        console.log("Connection closed")
    })
}).listen(8888)

和client.js

var net=require("net");
var client= new net.Socket();
client.connect(8888,function(){
    console.log("Conncted");
    client.write("Hello from client")
});
client.on("data",function(data){
    console.log("data "+data)
});
client.on("close",function(){
    console.log("Client closed");
    client.write("client closed")
})

我启动 server.js 然后我打开新的 cmds 并在其中启动 client.js。在服务器 cmd 中写入客户端已连接,在客户端 cmd 中写入“已连接”,但未写入“来自客户端的您好”+问题是,我如何在这些客户端/服务器之间进行通信?当我启动这些文件时,我无法再写入 cmd

【问题讨论】:

    标签: node.js tcp


    【解决方案1】:

    目前,您的服务器代码会等待客户端断开连接,然后再将缓冲的数据显示到标准输出。如果要立即显示它,则需要使用某种框架协议,以便知道“消息”何时开始和结束。一种流行的方法是使用换行符分隔的 JSON 消息。例如:

    server.js:

    var net = require('net');
    var sockets = [];
    function broadcast(from, msg) {
      msg = JSON.stringify('Dakto poveda: ' + msg) + '\n';
      sockets.forEach(function(x) {
        if (x !== from)
          x.write(msg);
      });
    }
    var server = net.createServer(function(socket){
      sockets.push(socket);
    
      var buffer = '';
      socket.on('data',function(data) {
        buffer += data;
        var idx;
        while ((idx = buffer.indexOf('\n')) > -1) {
          broadcast(socket, JSON.parse(buffer.slice(0, idx)));
          buffer = buffer.slice(idx + 1);
        }
      });
    
      socket.on('close',function() {
        // Remove dead socket from list
        sockets.splice(sockets.indexOf(socket), 1);
    
        console.log('Connection closed')
      });
    }).listen(8888);
    

    client.js:

    var net = require('net');
    var client = new net.Socket();
    function send(msg) {
      client.write(JSON.stringify(msg) + '\n');
    }
    client.connect(8888, function() {
      console.log('Conncted');
      send('Hello from client');
    });
    var buffer = '';
    client.on('data', function(data) {
      buffer += data;
      var idx;
      while ((idx = buffer.indexOf('\n')) > -1) {
        console.log('message received: ' + JSON.parse(buffer.slice(0, idx)));
        buffer = buffer.slice(idx + 1);
      }
    });
    client.on('close',function(){
      console.log('Client closed');
    });
    

    如果您想在消息中嵌入换行符等,JSON 转换会很有用,否则会弄乱您的消息框架。另一个好处是您可以发送 JavaScript 对象、数组等,而不仅仅是纯字符串。这将使您能够更轻松地传递不同类型的数据。

    【讨论】:

    • 这确实有帮助,但是对于最后一个问题,为什么我在启动客户端后无法在 cmd 中写入?没有它我仅限于静态消息(ofc 我可以从一端向它发送一些数据,但我只是从节点开始,所以我稍后会尝试)
    • @trolkura 这个问题没有单一的答案。这完全取决于应用程序。例如,如果您只是将其制作为在终端中工作的基于控制台的东西,那么您只需从标准输入读取并在用户按下回车时发送消息。或者,也许您的命令/输入来自 redis pubsub 频道。这一切都取决于。
    猜你喜欢
    • 2012-04-19
    • 2013-12-14
    • 1970-01-01
    • 1970-01-01
    • 2017-07-16
    • 2023-03-18
    • 2016-05-16
    • 2012-04-21
    • 1970-01-01
    相关资源
    最近更新 更多