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