Socket+TCP,实现小小简单聊天程序
发布于 10 年前 作者 struCoder 6347 次浏览 最后一次编辑是 8 年前

这几天开始抱着两本书重头学习Node,最近也不知自己在瞎忙什么,算了,进入正题吧!
在Node中使用Socket编程,总的给我一个感觉就是爽!今天完成了一个极为简单的基于控制台模式的聊天小程序
之所以写这个就是为了学习下基于Node的Socket编程,协议就是如标题的TCP协议了

#####实现内容#####

就是一个server,和(n+)个Client,server端监视client的连接状态。并且实现broadcast,其形式
也就是相当于一个聊天大厅或者QQ群的形式,只要有客户端成功连接,就会立即加入当前的聊天
状态。当然了我这个小小的应用就是简单的实现,并没有考虑到数据存储的功能,you can do it :)
还有一些 问题待解决。先上代码吧, ###server端:###

var sockets = []; //Collecting all the clients and broadcast the user data to everyone
var server = require('net').createServer(function(socket) {
console.log('new connection');
//socket.setKeepAlive(true);
sockets.push(socket); //if have new connection sockets elements +1
socket.setEncoding('utf8');
socket.on('data', function(data) {
  //进行广播,是每个客户端收到消息
  sockets.forEach(function(otherSocket) {
    if (otherSocket !== socket) {
      otherSocket.write(data + "\n");
    }
  });
});
socket.on('end', function() {
  console.log('client connection ended!');
});
socket.on('close', function() {
  console.log('connection closed');
  var index = sockets.indexOf(socket); //如果一个Client下线退出,清除相关信息
  sockets.splice(index, 1);
});
}).listen(4006, function() {
console.log('waiting for client connection···');
address = server.address(); //这里有一点需要注意,server.address()一定要在listening事件触发后!
console.log('opended server on %j', address);
}).on('close', function() {
console.log('server closed!');
}).on('error', function(err) {
console.log('Server error:' + err.message);
});

###client端###

var net = require('net'),
  definePort = 4006,
  quitting = false,
  retryTimeout = 3000,
  retriedTimes = 0,
  maxRetries = 10,
  client,
  myName = "";

process.stdin.resume();

process.stdin.on('data', function(data) {
  if (data.toString().trim().toLowerCase() === 'quit') {
    quitting = true;
    console.log('quitting···');
    client.end();
    process.stdin.pause();
  } else {
    if (myName !== "") {
      client.write(myName + ":" + data);
    } else {
      myName = data;
      return false;
    }
  }
});
(function connect() {
  function reconnect() {
    if (retriedTimes >= maxRetries) {
      throw new Error('最大尝试次数已到,请检查网络!');
    } else {
      retriedTimes += 1;
      setTimeout(connect, retryTimeout);
    }
  }
  client = net.connect({
    port: definePort,
  }, function() {
    client.setEncoding('utf8');
    retriedTimes = 0; //这边就是当连接上就重置retriedTimes
    console.log('==========================\nconnected to server.\n键入 quit 退出当前聊天模                       式.\n==========================');
    console.log('★★★★★★★★★★★★★\n进入聊天时第一件事是:\n键入自己的昵称\n★★★★★★★★★★★★★\n您的昵称:')
  }).on('data', function(data) {
    //console.log(data.toString());
  }).on('end', function() {
    console.log('client disconnected!');
  }).on('error', function(err) {
    console.log('client error:' + err.message);
  }).on('close', function() {
    if (!quitting) {
      console.log('connection got closed,will try to reconnect');
      reconnect();
    }
  });
  client.pipe(process.stdout, {
    end: false
  });
}());

####问题####

  • 一个就是显示,总觉得显示格式的不太给力
  • 第二就是可能是编码的问题,字母发送显示是正常的,而汉字出现乱码,或者是不显示。我开始设置了 client.setEncoding('utf8'); 但是没效果,★★★希望得到解答★★★
  • 本人也是刚刚入门学习,代码有不对的地方,各位请雅正:)
  • 参考:《professional node.js》
4 回复

它这个格式怎么显示的参差不齐啊!我原先的代码缩进都是挺好的。这样的缩进看得不爽啊!

这个还真不是 CNode 代码问题, 楼主缩进里混用了 Tab 和空格造成的… 已编辑…

看吧不统一缩进一不小心就出问题了…

@jiyinyiyong 恩,发现了。是我的错。下次会注意这个。:)

请问楼主,汉字乱码的问题解决了吗?

回到顶部