使用 net 创建 TCP Server时,中文的输入问题 - CNode技术社区

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

大家好,我在使用 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 的 命令行界面确实无法正确输入中文。

回到顶部

AltStyle によって変換されたページ (->オリジナル) /