nodejs实现套接字服务
 
 
一 什么是套接字
1.套接字允许一个进程他通过一个IP地址和端口与另一个进程通信,当你实现对运行在同一台服务器上的两个不同进程的进程间通信或访问一个完全不同的服务器上运行的服务时,套接字很有用。node提供的net模块,允许你既创建套接字服务器又创建可以连接到套接字服务器的客户端。
2.套接字位于HTTP层下面并提供服务器之间的点对点通信。套接字使用套接字地址来工作,这是IP地址和端口的组合。在套接字连接中,有两种类型的点:一类是服务器,它监听连接;一类是客户端,它打开一个到服务器的连接。服务器和客户端都需要一个唯一的IP地址和端口的组合。
3.套接字是HTTP模块的底层结构,如果你不需要处理如get何post的web请求,只需要点对点的传输数据,那么使用套接字就可以就能为你提供一个轻量级的解决方案和更多的控制。                                                                                                                                                                                                                                                                                                                                                                                                                                    二 net.Socket对象
1.Socket对象同时在套接字服务器和客户端套接字上创建,并允许数据在它们之间来回写入和读取。在套接字客户端,当你调用net.connect()或net.createConnection()时,Socket对象在内部创建,这个对象是为了表示到服务器的套接字连接。使用Socket对象来监控连接,将数据发送到服务器并处理来自服务器的响应。在套接字服务器上,当客户端连接到服务器时,Socket对象被创建,并被传递到连接事件处理程序,这个对象是为了表示对客户端的套接字连接。      在NodeJS中有三种socket:TCP,UDP,Unix域套接字,主要介绍NodeJS中TCP的基本编程知识。
 
2.创建一个Socket对象,可以使用以下方法:
//第一种方法,通过一个options参数
var SocketClient = net.connect(options, [connectionListener]);
var SocketClient = net.createConnection(options, [connectionListener]); //第二种方法,通过接受port和host值作为直接的参数
var SocketClient = net.connect(port, [host], [connectionListener]);
var SocketClient = net.createConnection(port, [host], [connectionListener]); //第三种方法,通过接受指定文件系统位置的path参数,这个位置是一个Unix套接字在创建Socket对象时使用的。
var SocketClient = net.connect(path, [connectionListener]);
var SocketClient = net.createConnection(path, [connectionListener]);
无论你使用哪种,都将返回一个Socket对象,唯一的区别在于接受的第一个参数,而最后一个参数都是当连接对服务器打开时执行的回调函数。而无论你使用net.connect还是net.createConncetion,它们的工作方式是完全相同的。
那么至于第一个参数,指定的选项为:
port:客户端应连接到的端口。此选项是必需的。
host:客户端应该连接到的服务器的域名或IP地址。默认为localhost
localAddress:客户端应该绑定的用于网络连接的本地IP地址。
allowHalfOpen:一个布尔值,如果为true,则表示当套接字的另一端发送一个FIN数据包时,该套接字将不会自动发送一个FIN数据包,从而使Duplex流的一半保持开放。默认为false
 
3.一旦Socket对象被创建,它就提供了在连接到服务器的生命周期中发出的几个事件,如下:
connect:成功建立与服务器的连接时发出。回调函数不接受任何参数
data:在套接字上收到数据时发出。如果没有数据时间处理程序被连接,那么数据可能会丢失。回调函数必须接受一个buffer对象作为参数,它包含从套接字读取的数据的块。
end:当服务器通过发送一个FIN终止连接时发出。回调函数不接受任何参数
timeout:由于不活动,因此到服务器的连接超时时发出。
drain:当写缓冲区变为空时发出。你可以使用此事件截回被写入套接字中的数据流。回调函数不接受任何参数
error:在套接字连接上发生错误时发出。回调函数应该接受错误的唯一参数。
close:套接字已完全关闭时发出,它可能是由一个end()方法关闭的,或者因为发生错误而关闭。回调函数不接受任何参数
 
5.Socket对象还提供了可以访问以获得该对象的信息的几个属性:
bufferSize   当前已缓冲并等待写入套接字的流中的字节数
remoteAddress   套接字连接到的远程服务器的IP地址
remotePort    套接字连接到的远程服务器的端口
localAddress   远程客户端用于套接字连接的本地IP地址
localPort     远程客户端用于套接字连接的本地端口
byteRead     由套接字读取的字节数
byteWritten    由套接字写入的字节数
 
三 net.Server对象
可以使用net.Server对象创建一个TCP套接字服务器,并监听对它的连接,你将能够读取和写入数据。
要创建一个服务器独享,使用net.createServer()方法:
net.createServer([options],[connectListener])
其中,options是一个对象,指定创建套接字Server对象时要使用的选项,如allowHalfOpen,可以使一半的Duplex流保持开放,默认为false。connectLlistener是connection事件的回调函数,它在接收到连接时被执行。
 
举例:
var net = require('net');
var HOST = '127.0.0.1';
var PORT = 6969; // 创建一个TCP服务器实例,调用listen函数开始监听指定端口
// 传入net.createServer()的回调函数将作为”connection“事件的处理函数
// 在每一个“connection”事件中,该回调函数接收到的socket对象是唯一的
net.createServer(function(sock) { // 我们获得一个连接 - 该连接自动关联一个socket对象
console.log('CONNECTED: ' + sock.remoteAddress + ':' + sock.remotePort); // 为这个socket实例添加一个"data"事件处理函数
sock.on('data', function(data) {
console.log('DATA ' + sock.remoteAddress + ': ' + data);
// 回发该数据,客户端将收到来自服务端的数据
sock.write('You said "' + data + '"');
}); // 为这个socket实例添加一个"close"事件处理函数
sock.on('close', function(data) {
console.log('CLOSED: ' +
sock.remoteAddress + ' ' + sock.remotePort);
}); }).listen(PORT, HOST);
console.log('Server listening on ' + HOST +':'+ PORT);
服务端也可以用稍不同的方式接受TCP连接,即显式处理"connection"事件:
var server = net.createServer();
server.listen(PORT, HOST);
console.log('Server listening on ' +
server.address().address + ':' + server.address().port); server.on('connection', function(sock) {
console.log('CONNECTED: ' +
sock.remoteAddress +':'+ sock.remotePort);
// 其它内容与前例相同
});
上述两个例子只是写法不同,并无本质区别。
 
创建TCP客户端
现在让我们创建一个TCP客户端连接到刚创建的服务器上,该客户端向服务器发送一串消息,并在得到服务器的反馈后关闭连接。下面的代码描述了这一过程。
var net = require('net');
var HOST = '127.0.0.1';
var PORT = 6969; var client = new net.Socket();
client.connect(PORT, HOST, function() {
console.log('CONNECTED TO: ' + HOST + ':' + PORT);
// 建立连接后立即向服务器发送数据,服务器将收到这些数据
client.write('I am Chuck Norris!');
}); // 为客户端添加“data”事件处理函数
// data是服务器发回的数据
client.on('data', function(data) {
console.log('DATA: ' + data);
// 完全关闭连接
client.destroy();
}); // 为客户端添加“close”事件处理函数
client.on('close', function() {
console.log('Connection closed');
});
 
再举个例子:
var net=require('net');
function getConnection(connName){
var client=net.connect({port:8017,host:'127.0.0.1'},function(){
console.log(connName+' connected: ');
console.log(' local=%s:%s',this.localAddress,this.localPort);
console.log( ' remote=%s:%s',this.remoteAddress,this.remotePort);
this.setTimeout(500);
this.setEncoding('utf8');
this.on('data',function(data){
console.log(connName+' From Server: '+data.toString());
this.end();
});
this.on('end',function(){
console.log(connName+' Client disnected');
});
this.on('error',function(err){
console.log('Socket Error: ',JSON.stringify(err));
});
this.on('timeout',function(){
console.log('Socket Time Out');
});
this.on('close',function(){
console.log('Socket Closed');
});
});
return client;
}
function writeData(socket,data){
var success=!socket.write(data);
if(!success){
(function (socket,data){
socket.once('drain',function(){
writeData(socket,data);
});
})(socket,data);
}
}
var example1=getConnection('example1');
var example2=getConnection('example2');
writeData(example1,'This is example1');
writeData(example2,'This is example2'); var server=net.createServer(function(client){
console.log('Client connection: ');
console.log(' local=%s:%s',client.localAddress,client.localPort);
console.log( ' remote=%s:%s',client.remoteAddress,client.remotePort);
client.setTimeout(500);
client.setEncoding('utf8');
client.on('data',function(data){
console.log('Received data from client on port %d:%s',client.remotePort,data.toString());
console.log(' Bytes received:'+data.toString());
writeData(client,'Sending: '+data.toString());
console.log(' Bytes sent: '+client.bytesWritten)
});
client.on('end',function(){
console.log('Client disconnected');
server.getConnections(function(err,count){
console.log('Remaining Connections: '+count);
});
});
client.on('error',function(err){
console.log('Socket Error: '+JSON.stringify(err));
});
client.on('timeout',function(){
console.log('Socket Time Out');
});
});
server.listen(8017,function(){
console.log('Server listening: '+JSON.stringify(server.address()));
server.on('close',function(){
console.log('Server Terminated');
});
server.on('error',function(err){
console.log('Server Error: ',JSON.stringify(err));
});
});

nodejs 实现套接字服务的更多相关文章

  1. 通过开启子进程的方式实现套接字服务端可以并发的处理多个链接以及通讯循环(用到了subprocess模块,解决粘包问题)

    今日作业:通过开启子进程的方式实现套接字服务端可以并发的处理多个链接以及通讯循环(用到了subprocess模块,解决粘包问题) server(服务端) import socket from mult ...

  2. Node.js中实现套接字服务

    后端服务的一个重要的部分是通过套接字进行通信的能力. 套接字允许一个进程通过一个IP地址和端口与另一个进程通信 同一个服务器上的两个不同进程的进程间通信(IPC)或者访问一个完全不同 的服务器上运行的 ...

  3. 5-tcp套接字服务端编程

    import socket 1.创建套接字 sockfd= socket.socket(socket_family = AF_INIT,socket_type=SOCK_STREAM,proto) 功 ...

  4. DotNet:Socket Server 异步套接字服务端实现

    异步服务器套接字示例 From https://msdn.microsoft.com/zh-cn/library/fx6588te(v=vs.110).aspx 下面的示例程序创建接收来自客户端的连接 ...

  5. TCP下的套接字服务端实现并发 作业题

    # 服务端 import socket from threading import Thread """ 服务端 1.要有固定的IP和PORT 2.24小时不间断提供服务 ...

  6. python通过套接字来发送接收消息

    案例如下: 1.启动一个服务端套接字服务 2.启动一个客户端套接字服务 3.客户端向服务端发送一个hello,服务端则回复一个word,并打印 参考地址:https://www.cnblogs.com ...

  7. Python之路(第三十二篇) 网络编程:udp套接字、简单文件传输

    一.UDP套接字 服务端 # udp是无链接的,先启动哪一端都不会报错 # udp没有链接,与tcp相比没有链接循环,只有通讯循环 server = socket.socket(socket.AF_I ...

  8. Learning-Python【28】:基于TCP协议通信的套接字

    什么是 Socket Socket 是应用层与 TCP/IP 协议通信的中间软件抽象层,它是一组接口.在设计模式中,Socket 其实就是一个门面模式,它把复杂的 TCP/IP 协议族隐藏在 Sock ...

  9. day37协程与线程套接字通讯

    协程与线程套接字通讯基于多线程实现套接字服务端支持并发,服务端 from socket import * from threading import Thread def comunicate(con ...

随机推荐

  1. BZOJ2654:tree(最小生成树,二分)

    Description 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. Input 第一行V,E,need分别表示点数,边数和需要的白色 ...

  2. 使用npm uninstall卸载express无效

    最近在看<node.js开发指南>学习node.js,因为书是2012年的书,对应的各种软件.包的版本就特别老,其中第五章用到express,书中版本用的是2.X版本,而我这边通过npm ...

  3. ASP.NET Core 运行原理剖析 (转载)

    1.1. 概述 在ASP.NET Core之前,ASP.NET Framework应用程序由IIS加载.Web应用程序的入口点由InetMgr.exe创建并调用托管.以初始化过程中触发HttpAppl ...

  4. sharepoint2016安装OOS,OOS场负载均衡

    Office Online Server is the successor to Office Web Apps Server. It may be connected to SharePoint, ...

  5. MAMP:MySQL wasn't able to start

    MAMP 我点击start server的时候 发现mysql服务器打不开 http://images.cnblogs.com/cnblogs_com/lwwen/1231721/o_11111111 ...

  6. 搭建Apache服务器并使用自签证书实现https访问

    实验环境:两台Centos7.2的虚拟机,一台作CA服务器,一台作Apache服务器,此处安装httpd-2.4.6的版本. 1)CA服务器 # 私钥一般存放位置:/etc/pki/CA/privat ...

  7. awk命令用法

    awk:把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理,是一个强大的文本分析工具,在对数据分析并生成报告时很有优势. awk有3个不同版本: awk.nawk和gawk, ...

  8. 多线程异步非阻塞之CompletionService

    引自:https://www.cnblogs.com/swiftma/p/6691235.html 上节,我们提到,在异步任务程序中,一种常见的场景是,主线程提交多个异步任务,然后希望有任务完成就处理 ...

  9. shell脚本实现目录的“5S”作业

    shell,又称为命令解释器.首先它是一个软件,有很多个版本,现在最流行的为bash,它作为用户和内核沟通的中间桥梁,在系统中起着举足轻重的作用 shell脚本,是一个以.sh结尾的文件,里面是诸如l ...

  10. Jquery复选框的全选全不选及选择所有复选框实现全选的复选框

    Jquery代码 $(function () { $(":checkbox.parentfunc").click(function () { //如何获取被点击的那个复选框 $(t ...