nodejs-tcp数据通信

nodejs中我们使用net模块来创建tcp服务器,tcp客户端,实现服务器与客户端之前的数据通信

创建tcp服务器

var server=net.createServer([optations],[connectionListener])

optations:{allowHalfOpen:boolean}

allowHalfOpen:false 当服务器接受到客户端发送的一个FIN包时候,会回发一个FIN包,当为true时服务器不会回FIN包,使得tcp服务器可以继续发送数据到客户端,但是不会接受客户端发送的数据,开发者必须调动end方法来关闭socket,默认是false

connectionListener:当客户端与服务器连接上了,可以触发的回调函数。

function(socket){

//.......

}

我们也可以不用回调函数来写连接上做什么处理,连接上会触发connection事件

var  server=net.createServer()返回创建的tcp服务器

我们可以server.on('connection',function(socket){

})

在创建完tcp服务器我们通知服务器要监听客户端连接

server.listen(port,[host],[backlog],[callback])

port:监听的端口,为0时候tcp服务器分配一个随机的端口

host:监听的ip和主机名,省略该参数,服务器监听任何ipv4地址的客户端连接

backlog:指定等待队列中最大的客户端连接最大数量 默认511

当指定端口、ip这个时候服务器开始监听这个ip这个端口的客户端了,这个时候触发listening事件,可以指定callback参数来处理触发listening具体要做什么

我们也可以

server.on('lisening',function(){

//.......

})

创建一个tcp服务器后可以用server.address()查看tcp服务器监听的信息

var address=server.address()

addres是一个对象

prot :监听的端口

address:监听的ip

family:ipv4还是ipv6


我们可以使用getConnections()查看与服务器连接的客户端的数量

server.getConnections(callback)

callback:function(err,count){
}

err:错误信息

count:为连接服务器的数量


我们也可以设置最大的连接数,超过这个数字,服务器不允许连接

server.maxConnections=2


服务器关闭

server.close([callback])

这个 方法让tcp服务器拒绝新的客户端连接,原有已经连上的客户端是不关闭的,当所有的连接服务器的客户端关闭时候,服务器默认自动关闭,触发服务器的close事件

下面我们写一个tcp服务器

var net=require("net");
opations={allowHalfOpne:false}
var server=net.createServer(opations);
server.on('connection',function(socket){
    server.maxConnections=2;
    console.log("服务器最大连接数为%s",server.maxConnections)
    server.getConnections(function(err,count){
       console.log("已经有%s个客户端连接",count)
    })
    
    console.log("%s客户端与服务器建立连接",server.address().address)
})
server.on('error',function(err){
    throw err;
})
server.on('listening',function(){
    console.log("服务器开始监听%j",server.address())
    console.log("服务器开始监听")    
})


server.listen(9966,'192.168.0.3');

setTimeout(function(){
   server.close(function(){
       console.log("tcp服务器关闭11111")
   })
   console.log("tcp服务器关闭")
 
},20000)


注意连接成功的时候触发的connection事件,执行的方法,参数是一个socket端口对象,这个就是服务器所监听的端口对象,所以我们socket.address().address返回给我们的是监听ip


socket端口对象

port:端口

address:ip

family:ipv4 ipv6

socket端口对象,可以读取客户端发送的流数据,每次接收到客户端发送的数据触发data事件。

接受客户端发送的消息(在连接成功的触发函数中 让server监听data事件做相应的处理)

server.on('connection',function(socket){
    socket.on('data',function(data){
        socket.setEncoding("utf-8");
        console.log(data)
        //console.log(data.toString())
    })
})

bytesRead为socket端口对象监听客户端发送的数据字节数

console.log(socket.bytesRead)


当客户端关闭时候,触发socket端口对象的end事件


我们把客户端连接发送的数据保存到一个文件下

var net=require("net");
var fs=require("fs");
var server =net.createServer();
var op={
 flags:"a",
 encoding:"utf-8"
}
var file=fs.createWriteStream('./socket.txt',op)
server.on('connection',function(socket){
   socket.on('data',function(data){
   
       file.write(data);
   })
 
})
server.on('listening',function(){
  console.log("监听开始")
})
server.listen('1111','192.168.0.3')


以管道形式发送数据到文件

var net=require("net");
var fs=require("fs");
var server =net.createServer();
var op={
 flags:"a",
 encoding:"utf-8"
}
var file=fs.createWriteStream('./socket.txt',op)
server.on('connection',function(socket){
   //socket.on('data',function(data){
     //  file.write(data);
   //})
    socket.pipe(file,{end:false});
    socket.on("end",function(){
       file.end("wanbi")
    })
})
server.on('listening',function(){
  console.log("监听开始")
})
server.listen('1111','192.168.0.3')



tcp客户端

创建tcp客户端

var client =new net.socket([opations])

optation:fd 一个现有的socket端口对象文件描述

type :ipv4 、ipv6

allowHalfOpne:true、false

连接服务器

client.connect(prot,[host],[callback])

host不指定默认为本地ip

回调函数表示连接上了做什么

若没有可以socket端口对象触发connect事件

client.on("connect",function(){

})

当我们连接成功后客户端服务器端的socket端口对象有下面的属性

remoteAddress、remotePort、localAddress、localPort

socket端口对象可以写入服务器、客户端流数据

socket.write(data,[encodeing],[callback])

写入数据少时候我们直接写入缓存区,数据很多时候,缓存区满了,我们要把数据写入缓存队列中,这个时候write(data) 返回false,触发drain

我们可以用bufferSize看缓存队列中有多少个字节

socket.on("error",function(err){

})

当遇到error时候这个socket端口对象应该销毁

socket.destory()

socket.end([data],[encoding])

这个方法表示我们要关闭socket端口对象,这个不是关闭服务器的close方法,后者是关闭服务器,实现的效果是不能让客户端连接了,前者是关闭连接(socket端口对象)

当我们使用服务器的socket端口对象(连接客户端得)的end(data,encoding)方法时候,会触发客户端socket端口对象end事件

服务器:

socket.end('88');

客户端会执行下面的代码:

client.on("end",function(){

 //......

})


服务器端不会退出应用程序,即使所有的客户端都断开了,这个时候我们要server.unref(),退出程序,可以用server.ref()阻止程序退出.

当socket端口对象彻底关闭时候会触发close事件,我们可以指定当端口对象关闭时候做的处理

socket.on(''close',faction(had_error){

if(had_error){}

else{}

})


socket.writtenBytes表示写了多少个字节

我们tcp服务器与客户端连接了,但是突然间有一个断电了,来不及向另一端发送关闭连接的FIN包,这样另一边这个socket端口永远处于连接状态,我们用socket.setKeepAlive([enable],[inteval])定时向另一端发送监测包,



我们实现一个服务器读一个文件的信息,当有客户单连接上,吧这个信息传给客户端,输出在控制台

服务器代码

var net=require("net");
var fs=require("fs");
var server =net.createServer();
var op={
 flags:"r",
 encoding:"utf-8"
}
var file=fs.createReadStream('./socket.txt',op)
server.on('connection',function(socket){
   file.on('data',function(data){
       socket.write(data);
   })
 
    socket.on("end",function(){
       file.end("wanbi")
    })
})
server.on('listening',function(){
  console.log("监听开始")
})
server.listen('1111','192.168.0.3')

客户端代码

var net=require("net");
var client=new net.Socket();
client.connect(1111,'192.168.0.3')
client.on('connect',function(){
   console.log("ok")
   
})
client.on("data",function(data){
    console.log(data.toString())
})

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TCP(传输控制协议)是一种面向连接的协议,用于在网络上可靠地传输数据。它提供了数据的可靠传输、流量控制和拥塞控制等功能,是互联网的核心协议之一。 在Node.js中,使用内置的net模块可以轻松地创建TCP服务器和客户端。下面是一个简单的TCP服务器示例: ```javascript const net = require('net'); const server = net.createServer((socket) => { console.log('client connected'); socket.on('data', (data) => { console.log(`received data: ${data}`); socket.write(`echo: ${data}`); }); socket.on('close', () => { console.log('client disconnected'); }); }); server.listen(3000, () => { console.log('server started on port 3000'); }); ``` 这个服务器会监听本地的3000端口,当有客户端连接时,会打印出“client connected”的信息。当客户端发送数据时,服务器会收到这些数据并将其打印到控制台上,然后将“echo: ”加在数据前发送回客户端。当客户端断开连接时,服务器会打印“client disconnected”的信息。 下面是一个简单的TCP客户端示例: ```javascript const net = require('net'); const client = new net.Socket(); client.connect(3000, 'localhost', () => { console.log('connected to server'); client.write('hello, server'); }); client.on('data', (data) => { console.log(`received data: ${data}`); client.destroy(); }); client.on('close', () => { console.log('disconnected from server'); }); ``` 这个客户端会连接到本地的3000端口,并发送“hello, server”的消息。当客户端收到服务器的响应时,会打印出这些数据,并断开连接。 总的来说,TCP在网络通信中扮演着非常重要的角色,Node.js内置的net模块提供了简单易用的TCP套接字接口,使得我们可以轻松地创建TCP服务器和客户端。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值