Nodejs创建TCP服务器 - king0222
作者:mrr 发布时间:2022-12-16 02:27:27
1.Nodejs提供了net模块给我们,所以我们创建TCP服务器很简单:
require('net').createServer(function(socket) {
// new connection
socket.on('data', function(data) {
// got data
});
socket.on('end', function(data) {
// connection closed
});
socket.write('Some string');
}).listen();
通过var server = require('net').createServer();这行代码我们可以得到tcp服务器对象的引用。
server对象具注册了以下几个监听事件:
listening,connection,close,error
下面一个例子是在TCP服务器的声明周期中监听了如上几个事件:
var server = require('net').createServer();
var port = ;
server.on('listening', function() {
console.log('Server is listening on port', port);
});
server.on('connection', function(socket) {
console.log('Server has a new connection');
socket.end();
server.close();
});
server.on('close', function() {
console.log('Server is now closed');
});
server.on('error', function(err) {
console.log('Error occurred:', err.message);
});
server.listen(port);
一旦建立连接成功后,会得到一个socket对象作为回调中的参数,我们可以操作这个socket对象,前面提到过tcp连接的对象是可读可写的流。作为一个流对象,因此能够监听data,end等事件;作为一个可写流,具有write()方法。 下面是一个能够监听用户输入的例子:
var server = require('net').createServer(function(socket) {
console.log('new connection');
socket.setEncoding('utf');
socket.write("Hello! You can start typing. Type 'quit' to exit.\n");
socket.on('data', function(data) {
console.log('got:', data.toString())
if (data.trim().toLowerCase() === 'quit') {
socket.write('Bye bye!');
return socket.end();
}
//反馈回客户端
socket.write(data);
});
socket.on('end', function() {
console.log('Client connection ended');
});
}).listen();
因为socket对象又是一个可读的流,因此你能够空气他的pause()和resume(),或者你可以直接使用pipe()方法输出一个可写流:
var ws = require('fs').createWriteStream('helloworld.txt');
require('net').createServer(function(socket) {
socket.pipe(ws);
}).listen();
上面的代码创建了一个可写流对象,然后将这个可写流对象输出到客户端。在客户端可以得到一个名为helloworld.txt的文件,
可以用“telnet localhost 4001”来测试该例子。
因为socket对象同时具有可读流的性质和可写流的性质,因此上面的例子你可以反过来形成下面这样的代码:
require('net').createServer(function(socket) {
var rs = require('fs').createReadStream('hello.txt');
rs.pipe(socket);
}).listen();
上面的代码将hello.text文件内容输出到socket对象中返回给客户端,当内容输出完成后,tcp连接就会退出,在前面的文章中有说过Pipe的用法,默认情况下在数据读取完成后就会执行end方法,因此如果不想要这样的效果并保持连接的话可以在pipe中添加第二个参数:{ end : false },并重写end监听。
2.闲置socket 当有闲置的socket出现的时候我们需要进行相应的清除的工作,由setTimeout方法可以帮我们把闲置的socket对象关闭。
var timeout = ; // minute
socket.setTimeout(timeout);
socket.on('timeout', function() {
socket.write('idle timeout, disconnecting, bye!');
socket.end();
});
下面是一个更简洁的使用方式:
socket.setTimeout(60000, function() {
socket.end('idle timeout, disconnecting, bye!');
});3.保持连接
socket.setKeepAlive(true);你也可以添加第二个参数在设置可延时时长:
socket.setKeepAlive(true, 10000); // 10 seconds4.是否使用延时
kernel会在发送tcp数据包之前缓存数据,因此会占据一定的延时,这对于某些小数据包场景来说是有用的,但如果你不希望有这样的延时的话,那么你可以这样设置:
socket.setNoDelay(true);
var port = ;
var host = '...';
server.listen(port, host);listen方法的第二个参数是监听客户端的ip地址,如果填写则只监听所填写的ip,否则则监听所有ip地址,默认情况下不填写。 关闭服务器连接,我们可以使用close方法,同时也可以对该事件进行监听。
server.close();
server.on('close', function() {
console.log('server closed!');
});6.创建一个简单的TCP聊天室服务器
var net = require('net');
var server = net.createServer();
var sockets = [];
server.on('connection', function(socket) {
console.log('got a new connection');
sockets.push(socket);
console.log('sockets length:', sockets.length);
socket.on('data', function(data) {
console.log('got data:', data.toString());
sockets.forEach(function(otherSocket) {
if (otherSocket !== socket) {
otherSocket.write(data);
}
});
});
socket.on('close', function() {
console.log('connection closed');
var index = sockets.indexOf(socket);
sockets.splice(index, );
console.log('sockets length:', sockets.length);
});
});
server.on('error', function(err) {
console.log('Server error:', err.message);
});
server.on('close', function() {
console.log('Server closed');
});
server.listen();


猜你喜欢
- 网站内部优化作弊和不合理优化方式认定标准1,关键词堆砌为了增加关键词密度,在网页上大量重复关键词的行为,希望提高关键词密度,提高网页针对关键
- Windows系统内置的Internet 信息服务(IIS)对ASP具有良好的支持,因此在IIS中调试ASP网页是非常方便的。但有些朋友的网
- Nofollow属性推出以后,Matt Cutts多次说过,nofollow既可以用在论坛,博客等的留言中,代表这些链接不是站长能控制和背书
- 默认文档异常错误 当修改默认文档时IIS提示信息 执行此操作时出错。 详细信息: 文件名: \\?\E:\DNN\web.config 行号
- 无论是使用手工试探还是使用安全测试工具,恶意攻击者总是使用各种诡计从你的防火墙内部和外部攻破你的SQL服务器系统。既然黑客在做这样的事情。你
- 经过过去几年的成长,WordPress已经不再仅仅是一个博客平台了。人们现在把它当作一个CMS(内容管理系统)来驱动不同类型的网站。将Wor
- 更改个人账户密码普通用户想要更改自己的个人帐户密码,只需要运行passwd命令,不用带任何其他的命令:$ passwd示例输出:Changi
- Apache James是最好用的开源java邮件服务器之一,在配置smtp服务过程中,有些步骤不对的话邮件就发送不出去。0.打开james
- 很显然,微软的放手并没有影响雅虎自己的计划。有消息称,雅虎将在本周中宣布与Google结成合作伙伴关系,在其搜索结果旁边放置Google提供
- 实验环境:AS4最小化安装实验目标:架设VSFTP服务器这次我们来学习Linux系统中的 vsftp服务器的配置。下面我们开始了!首先我们安
- 做网站秘诀有很多高手总结的很好,不管那一种能引导站长成功影响部分人的人生价值观,才是真的成功。作者总结十种也是一种新的领悟。做网站其实心态相
- 根据易观国际Enfodesk产业数据库近期发布的《2009年第3季度中国B2C网上零售市场季度监测》数据显示,截至2009年第3季度,中国B
- Google官方原文:How do I pick up my Western&n
- 我是从2006年开始注册 Adsense 的,刚刚开始的时候是做一个视频网站,数据涉及采集版权内容,申请了很多次都没有通过.还好那时候ads
- 和大多数人一样,我是一个站长,一个落魄的个人站长,终日在城市里颠沛流离,在网络上寻求温饱。不经意间,QQ已经在10年的成长之路上记录了中国网
- 最近才上的服务器,出现了无法删除文件夹的情况,文件可以删除,文件夹删除的时候提示The directory is not empty,解决办
- Linux中增加软路由的方法一:route add -net 172.16.6.0 netmask 255.255.255.0 gw 172
- Web应用服务器优化方法 在对Web服务器进行优化时要根据真实的Web应用系统的情况和特征来采取有针对性地优化方案。首先根据不同的网络特性来
- 全新推出的Discuz! 7.2版本从用户注册登陆应用、社区论坛前后管理两方面着眼,增加和改进了30多处与社区门户运营密切的功能与细节,实现
- 在Discuz!论坛运行的时候,经常有用户会遇到这样的问题,会员的上次访问时间和最后发表时间会超出当前时间,出现这种情况的原因是服务器的时间