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. GNU Radio Radar Toolbox

    GNU Radio Radar Toolbox Install guide Change to any folder in your home directory and enter followin ...

  2. Linux搭建Nginx

    1.Nginx安装 1.1 pcre (1)下载编译包 http://www.pcre.org/ (注意需要的是pcce,而非pcre2) (2)tar -zxvf pcre-8.36.tar.gz  ...

  3. AVPlayer

    AVPlayer     AVPlayerLayer是CALayer的一个子类,由于AVPlayer这个播放器只能安置在AVPlayerLayer 这个图层之上,所以我们需要实例化一个UIView,并 ...

  4. Jquery客户端校验——jquery.validate.js

    jQuery Validate 插件为表单提供了强大的验证功能,让客户端表单验证变得更简单,同时提供了大量的定制选项,满足应用程序各种需求.该插件捆绑了一套有用的验证方法,包括 URL 和电子邮件验证 ...

  5. java基础 绘图技术.坦克大战 之java绘图坐标体系(一)

    坐标体系介绍 下图说明了java坐标体系.坐标原点位于左上角,以像素为单位,像素是计算机屏幕上最小的显示单位.在java的坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素:第二个 ...

  6. 高程三:Array

    一:Array数组 1.Array.isArray(参数) 检测是否是数组,*不兼容IE8,兼容IE9及以上.Chrome.Firefox等,要兼容IE8,可以用 Object.prototype.t ...

  7. 新型的Hbb项目目录结构

    - Hbb - ComponentPacket (底层组件包) 数据库组件 网络组件 格式化组件 - Resources (存放所有图片资源文件) - ToolClass (工具类/Helper 独立 ...

  8. ARM概论(Advanced RISC Machines)

    简介 ARM7是32 位通用微处理器ARM(Advanced RISC Machines)家族中的一员,具有比较低的电源消耗和良好的性价比, 基于(精简指令)RISC结构,指令集和相关的译码机制与微程 ...

  9. ".NET Compact Framework v2.0 could not be found."

    参考: http://blog.csdn.net/godcyx/article/details/7348431 问题原因: That's a known issue where VS can't di ...

  10. Ubuntu16.04安装有道词典

    1.首先需要安装依赖包gstreamer0.10-plugins-ugly_0.10.19-2.1_amd64.deb,但是该依赖包 仍有两个依赖包需要提前安装,这三个依赖包都可以从这里下载 下载之后 ...