使用 net 创建 TCP Server时,中文的输入问题
发布于 3 年前 作者 Jedi-walker 2430 次浏览 来自 问答

大家好,我在使用 net 建立 TCP Server 后,使用 WIN10 的命令行终端用 telnet 连接相应端口,然后希望能够接收和输出中文,但目前为止怎么都不成功,不知道各位有没有好的解决方法,谢谢大家了。

我把我目前的测试程序贴出来,很简陋,请勿笑:

const assert = require('assert');
const net = require('net');
const iconv = require('iconv-lite');
let clients = 0;
let expectedAssertions = 2;

const server = net.createServer(function (client) {
  clients++;
  const clientId = clients;
  console.log('Client connected:', clientId);

  client.setEncoding('');

  client.on('end', function () {
    console.log('Client disconnected:', clientId);
  });

  let infor = '你好,欢迎:' + clientId + '\n';;
  let str = iconv.encode(infor, 'GBK')

  client.write(str);

  let inputStr = ''

  client.on('data', (data) => {
    if(data == '\r\n') {
      inputStr = iconv.encode(inputStr, 'GBK');
      client.write(inputStr);
      inputStr = '';
    } else {
      console.log(data);
      inputStr+=data;
    }

  })

});

server.listen(8000, function () {
  console.log('Server started on port 8000');
});

9 回复

if(data == ‘\r\n’) … 这种判断是不对的 收到的是“流式数据”,不是你想象的那样。。。

   var  chunk=  new Buffer.from(data) ;

然后找到对应的边界,一般字符串是 \n 就是10 如果找到就输出,没找到就拼接继续在下一块数据中找

@myy 你好,我这么写是根据实际测试得出来的,首先这么做用英文输入输出时绝对没问题, 而如果只写 \n,则可能会出现错误,尤其是输出时如果只写 \n 那换行后光标可能出现在 随机的位置,而不是行首。但如果用 \r\n 就没问题

@yakczh 你好啊,感谢,能不能给一段相对比较全的代码?就是如何把数据拼接起来然后转化为输出,谢谢了。

@Jedi-walker
server.js

const assert = require('assert');
const net = require('net');
//const iconv = require('iconv-lite');
let clients = 0;
let expectedAssertions = 2;

const server = net.createServer(function (client) {
  clients++;
  const clientId = clients;
  console.log('Client connected:', clientId);

  client.setEncoding('');

  client.on('end', function () {
    console.log('Client disconnected:', clientId);
  });

  let infor = ' this ' + clientId + '\n';;
//  let str = iconv.encode(infor, 'GBK')

  client.write(infor);

  let inputStr = ''
  var body=new Buffer.from("");
  client.on('data', (data) => {
  var chunk =  new Buffer.from(data);
   if (10 == chunk[chunk.length-1]) {
        body+=chunk;
        console.log(body);
        client.write(body.toString());
        body=new Buffer.from("");
    }else{
        body+=chunk;
        console.log('.');
   }
  })

});

server.listen(8000, function () {
  console.log('Server started on port 8000');
});

client.js

const net=require('net');

var cnt=0;
function rand_send(sock) {
    cnt++;
    var msg="this is 中文send msg to server";
    var len=Math.random()*100 % msg.length;
    sock.write(  msg.substring(0,len)+"\t");
    if(  0 == cnt % 3 ) {
        sock.write("OVER\n");
    }
}
const client = net.createConnection( { port: 8000 }, () => {
    console.log('connected to server!');
    setInterval(function () {
        rand_send(client);
    }, 1000);
});
client.on('data', (data) => {
    console.log(data.toString());
});
client.on('end', () => {
    console.log('disconnected from server');
});

去github搜索我的node-smgp项目的源代码

1.默认使用UTF-8编码,用GBK进行编码的话,终端需要进行解码; 2.如果使用UTF-8进行解码,当前获取到的数据不完整,UTF-8解码会不成功,可以使用string_decoder模块进行安全解码。

多谢,回复晚了,见谅

@tong3jie 多谢,回复太迟,见谅。我后来有点儿想明白了,如果要做一个完整的这种程序,必须自己设计一个客户端是吗?因为用 windows 的 命令行界面确实无法正确输入中文。

回到顶部