TCP/UDP网络应用

创建TCP服务器客户端

  • socket套接字对象实例,是对TCP协议的一个基本封装接口
  • clientt套接字对象实例
//server.js
var net = require('net');
var HOST = '127.0.0.1';
var PORT = 9694; var server = net.createServer(function (socket) { console.log('Server listening on ' + HOST + ':' + PORT);
console.log('CONNECTED: ' + socket.remoteAddress + ':' + socket.remotePort); socket.on('data', function (data) {
console.log('DATA ' + socket.remoteAddress + ':"' + data + '"');
socket.write('Server write: this is server')
}) socket.on('close', function (data) {
console.log('CLOSED: ' + socket.remoteAddress + ' ' + socket.remotePort);
})
}) server.listen(PORT, HOST) //client.js
var net = require('net');
var HOST = '127.0.0.1';
var PORT = 9694; var client = net.connect(PORT, HOST, function () {
console.log('client connected');
client.write('client write: this is client');
}) client.on('data', function (data) {
console.log(data.toString());
client.end();
}) client.on('end', function () {
console.log('client disconnected');
})
  • 关闭端口的方法
List open files on a port and copy PID

lsof -i :<port>
Kill it with fire :) kill -9 <PID>

另一种方法创建服务器

var net = require('net');
var HOST = '127.0.0.1';
var PORT = 9694; var server = net.createServer() server.listen(PORT, HOST) server.on('listening', function () {
var addr = server.address() //获取服务器地址,必须在listening事件之后
console.log('Server listening on ' + addr.address + ':' + addr.port);
}) server.on('connection', function (socket) {
console.log('CONNECTED: ' + socket.remoteAddress + ':' + socket.remotePort); socket.on('data', function (data) {
console.log(data.toString());
socket.write('server write: this is server')
}) socket.on('close', function () {
console.log('CLOSED: ' + socket.remoteAddress + ' ' + socket.remotePort);
server.close();
})
}) server.on('error', function (err) {
console.log('Error occurred: ' + err.message);
}) server.on('close', function () {
console.log('server is closed');
})

获得当前服务器连接数

server.getConnections(function (err, count) {
console.log(count);
})

套接字地址

//套接字绑定的IP地址,端口
socket.localAddress
socket.localPort
socket.address() //与server.address()相同 //远程地址
socket.remoteAddress
socket.remotePort //套接字接受和发送数据的字节长度
socket.on('data', function (data) {
console.log(socket.bytesRead); //
console.log(data.toString());
socket.write('server write: this is server')
console.log(socket.bytesWritten); //
})

控制套接字数据流

var bSockData = true

server.on('connection', function (socket) {

	if(bSockData) {
sock.resume(); //暂停data事件
bSockData = false
} else {
socket.pause(); //继续data事件
bSockData = true
} socket.on('data', function (data) {}) socket.on('close', function () {})
})

创建UDP服务器客户端

  • 创建socket使用参数udp4/udp6,分别对应Ipv4/Ipv6,前者使用更多
  • UDP数据报发送给服务器后,服务器一般不能回写,因为该协议就是为例快速发送数据包
//server.js
var dgram = require('dgram')
var HOST = '127.0.0.1'
var PORT = 12345; //创建一个udp4类型的数据报套接字 var server = dgram.createSocket('udp4') server.on('listening', function () {
var address = server.address();
console.log('UDP Server listening on ' + address.address + ":" + address.port);
}) server.on('message', function (message, remote) {
console.log('UDP Server received from ' + remote.address + ':' + remote.port);
console.log('-' + message);
server.close()
}) server.on('error', function (err) {
console.log('server error: ' + err.stack);
server.close()
}) server.on('close', function () {
console.log('server closed');
}) //绑定主机和端口
server.bind(PORT, HOST) //client.js
var dgram = require('dgram')
var HOST = '127.0.0.1'
var PORT = 12345; var message = new Buffer('UDO Client to server'); var client = dgram.createSocket('udp4') client.send(message, 0, message.length, PORT, HOST,
function (err, bytes) {
if(err) throw err;
console.log('client send to: ' + HOST + ":" + PORT);
console.log('-' + bytes);
client.close();
}) client.on('close', function () {
console.log('client closed');
})

UDP广播服务

  • UDP广播和单播的不同就是通信IP地址不同,广播使用255.255.255.255发送到同一广播上的每个主机
  • 广播不会被路由器转发
//server.js
.....
//由于接受客户端广播数据报,仅仅绑定端口号
server.bind(PORT) //client.js
var HOST = '255.255.255.255'
.....
client.bind(function () {
client.setBroadcast(true) //广播
})

简单的聊天应用

var net = require('net')
var HOST = '127.0.0.1'
var PORT = 6688 var clientList = [] var server = net.createServer(); server.on('connection', function(client) {
clientList.push(client);
client.name = client.remoteAddress + ":" + client.remotePort
broadcast('him ' + client.name + ' join in!\r\n', client)
client.write('hi, ' + client.name + '!\r\n') client.on('data', function (data) {
broadcast(client.name + ' say:' + data + '\r\n', client)
}) client.on('end', function () {
broadcast('hi,' + client.name + ' quit!\r\n', client)
clientList.splice(clientList.indexOf(client), 1)
})
}) function broadcast(message, client) {
var cleanup = [];
for (var i = 0, len = clientList.length; i < len; i++) {
var o_client = clientList[i]
if(client !== o_client) {
if(o_client.writable) {
o_client.write(message)
} else {
cleanup.push(o_client)
o_client.destroy()
}
}
}
for (var i = 0; i < cleanup.length; i++) {
clientList.splice(clientList.indexOf(cleanup[i]), 1)
}
} server.listen(PORT, HOST)
  • 测试telnet 127.0.0.1 6688

nodejs复习04的更多相关文章

  1. nodejs复习02

    process 这个模块是单线程的,无法完全利用多核CPU 基本信息 //程序目录 process.cwd(); //应用程序当前目录 process.chdir('/home'); //改变应用程序 ...

  2. nodejs复习01

    console 格式化 console.log("%s:%s", "a", "b") //字符串 console.log("%d. ...

  3. nodejs复习05

    stream 可读流 fs.pause()方法会使处于流动模式的流停止触发data事件,切换到非流动模式并让后续数据流在内部缓冲区 var fs = require('fs') var rs = fs ...

  4. nodejs复习03

    文件系统fs 重命名 fs.rename() fs.renameSync 优先选择异步,可以进行异常判断 打开关闭文件 fd = fs.openSync(file, flags) fs.closeSy ...

  5. nodeJs学习-04 POST数据请求,分段发送,分段接收

    const http = require("http"); const querystring= require('querystring'); http.createServer ...

  6. 在虚拟机中安装Ubuntu Server 15.04

    学Linux,上红联! 红联Linux门户|Linux通用技术|Linux发行版技术|Linux企业应用|Linux实验室|红联Linux论坛 Linux系统教程 Linux入门 Linux管理 Li ...

  7. NodeJS错误处理最佳实践

    NodeJS的错误处理让人痛苦,在很长的一段时间里,大量的错误被放任不管.但是要想建立一个健壮的Node.js程序就必须正确的处理这些错误,而且这并不难学.如果你实在没有耐心,那就直接绕过长篇大论跳到 ...

  8. 如何提高NodeJS程序的运行的稳定性

    如何提高NodeJS程序运行的稳定性 我们常通过node app.js方式运行nodejs程序,但总有一些异常或错误导致程序运行停止退出.如何保证node程序的稳定运行? 下面是一些可以考虑的方案: ...

  9. Ubuntu Server16.04 安装Odoo11

    odoo11采用了python3实现的. 1.sudo adduser odoo   //新建一个用户odoo 2.给odoo 用户root 权限 visudo   //使用visudo 编辑 /et ...

随机推荐

  1. js div及table首行顶部吸附示例

    js div顶部吸附示例,例如这样: 以下为DIV顶部吸附示例:(此示例来自于网络,在此记录与分享!感谢原作者!) 示例1:兼容IE6 <div style="height:300px ...

  2. ps命令

    Linux中的ps命令是Process Status的缩写.ps命令用来列出系统中当前运行的那些进程.ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信 ...

  3. IOS原生地图与高德地图

    原生地图 1.什么是LBS LBS: 基于位置的服务   Location Based Service 实际应用:大众点评,陌陌,微信,美团等需要用到地图或定位的App 2.定位方式 1.GPS定位  ...

  4. Android基础 : Android ContentProvider

    Android 应用程序通过ContentProvider实现方式统一的数据共享功能. 外界的程序通过ContentResolver接口可以访问ContentProvider提供的数据,在Activi ...

  5. PHP代码 如何网页获取用户的openid

    public function getOpenid($appid, $appsecret) { $SERVER_NAME = $_SERVER['SERVER_NAME']; $REQUEST_URI ...

  6. TCP/IP模型详解

    上述为TCP/IP的协议模型,主机到网络层又被称为网络接口层,网络互联层又被称为网间层. 网络接口层:实际上,TCP/IP参考模型并没有真正描述这一层的实现,只是要求能够提供给其上层一个访问接口,以便 ...

  7. 打不死的redis集群

    导读 最近遇到部分系统因为redis服务挂掉,导致部分服务不可用.所以希望搭建一个redis集群镜像,把原先散落各处的redis服务器统一管理起来,并且保障高可用和故障自动迁移. 最近遇到部分系统因为 ...

  8. WebService -- Java 实现之 CXF ( 添加系统预定义的拦截器)

    1. 概述 CXF允许我们在webservice的in/out位置添加拦截器.拦截器有两大分类,一类是系统预定义的:另一类是自定义拦截器. 2. 在server端添加拦截器. JaxWsServerF ...

  9. LruCache算法原理及实现

    LruCache算法原理及实现 LruCache算法原理 LRU为Least Recently Used的缩写,意思也就是近期最少使用算法.LruCache将LinkedHashMap的顺序设置为LR ...

  10. mysqldump和xtrabackup备份原理实现说明

    背景: MySQL数据库备份分为逻辑备份和物理备份两大类,犹豫到底用那种备份方式的时候先了解下它们的差异: 逻辑备份的特点是:直接生成SQL语句,在恢复的时候执行备份的SQL语句实现数据库数据的重现. ...