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 seconds
4.是否使用延时
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();
问题 你想实现一个服务器,通过TCP协议和客户端通信。 解决方案 创建一个TCP服务器的一个简单方法是使用 socketserver 库。例如,下面是一个简单的应答服务器: from socketserver import BaseRequestHandler, TCPServer class EchoHandler(BaseRequestHandler): def handle(sel
本文向大家介绍Node.js创建Web、TCP服务器,包括了Node.js创建Web、TCP服务器的使用技巧和注意事项,需要的朋友参考一下 使用http模块创建Web服务器 Web服务器的功能: 接受HTTP请求(GET、POST、DELETE、PUT、PATCH) 处理HTTP请求(自己处理,或请求别的程序处理) 做出响应(返回页面、文件、各类数据等) 常见的Web服务器架构: Nginx、Ap
nodejs版本:0.8.6 我使用openssl创建了一个ssl csr文件,并使用以下命令:openssl req-nodes-newkey rsa:2048-keyout myserver.key-out myserver.csr null 我试着检查这个问题:openssl s_client-connect my_dns:443//my_dns当然指向我的nodejs服务器 结果:已连接(
本文向大家介绍轻松创建nodejs服务器(2):nodejs服务器的构成分析,包括了轻松创建nodejs服务器(2):nodejs服务器的构成分析的使用技巧和注意事项,需要的朋友参考一下 紧接上一节,我们来分析一下代码: 第一行请求(require)Node.js自带的 http 模块,并且把它赋值给 http 变量。 接下来我们调用http模块提供的函数: createServer 。 这个函数
我试图用php执行nodejs,这样做非常简单 我的nodejs文件创建了一个带有Express的服务器。 当文件运行时,这就是输出 错误:侦听EACCES 127.0。0.1:82 bject.exports._errnoException(util.js:873: 11) 在出口方面_主机端口例外(util.js:896:20) 在服务器上_listen2(net.js:1237:19) 听(
本文向大家介绍轻松创建nodejs服务器(1):一个简单nodejs服务器例子,包括了轻松创建nodejs服务器(1):一个简单nodejs服务器例子的使用技巧和注意事项,需要的朋友参考一下 我们先来实现一个简单的例子,hello world。 似乎每种语言教程的第一节都会讲这个,我们也不例外。 首先我们先创建一个项目目录,目录可自己定义,本案例的目录为 e:/nodetest/。 由于我们要搭建