Socket+TCP,实现小小简单聊天程序
这几天开始抱着两本书重头学习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》