nodejs复习04
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的更多相关文章
- nodejs复习02
process 这个模块是单线程的,无法完全利用多核CPU 基本信息 //程序目录 process.cwd(); //应用程序当前目录 process.chdir('/home'); //改变应用程序 ...
- nodejs复习01
console 格式化 console.log("%s:%s", "a", "b") //字符串 console.log("%d. ...
- nodejs复习05
stream 可读流 fs.pause()方法会使处于流动模式的流停止触发data事件,切换到非流动模式并让后续数据流在内部缓冲区 var fs = require('fs') var rs = fs ...
- nodejs复习03
文件系统fs 重命名 fs.rename() fs.renameSync 优先选择异步,可以进行异常判断 打开关闭文件 fd = fs.openSync(file, flags) fs.closeSy ...
- nodeJs学习-04 POST数据请求,分段发送,分段接收
const http = require("http"); const querystring= require('querystring'); http.createServer ...
- 在虚拟机中安装Ubuntu Server 15.04
学Linux,上红联! 红联Linux门户|Linux通用技术|Linux发行版技术|Linux企业应用|Linux实验室|红联Linux论坛 Linux系统教程 Linux入门 Linux管理 Li ...
- NodeJS错误处理最佳实践
NodeJS的错误处理让人痛苦,在很长的一段时间里,大量的错误被放任不管.但是要想建立一个健壮的Node.js程序就必须正确的处理这些错误,而且这并不难学.如果你实在没有耐心,那就直接绕过长篇大论跳到 ...
- 如何提高NodeJS程序的运行的稳定性
如何提高NodeJS程序运行的稳定性 我们常通过node app.js方式运行nodejs程序,但总有一些异常或错误导致程序运行停止退出.如何保证node程序的稳定运行? 下面是一些可以考虑的方案: ...
- Ubuntu Server16.04 安装Odoo11
odoo11采用了python3实现的. 1.sudo adduser odoo //新建一个用户odoo 2.给odoo 用户root 权限 visudo //使用visudo 编辑 /et ...
随机推荐
- 思考JavaScript异常如何转为知识库?
线上 js 报错会变成一个邮件,发给前端开发 team,每个人自己认领.解决.其实这是一个不错的选择,也解决了最基本的问题:立即响应,修掉.不过也存在着一个问题,如何避免同样的错误?我的初步想法是这样 ...
- .Net Framework认知
在托管代码的世界里,应用程序首先被加载到应用程序域(AppDomain)中,然后将应用程序域加载到进程中,一个进程可以包含多个应用程序域,也就是说一个进程可以包含多个应用程序,毕竟应用程序域之间的切换 ...
- cacti汇总流量图-将数据合并后作图
在使用Cacti方便快捷的建立监控图时,往往根据实际应用必须监控几台甚至上百台服务器的汇总流量图来观察该应用服务器组的总流量等指标. 这里我们就来介绍如何用cacit快速的建立汇总流量图,其他汇总图建 ...
- JSon解析
1.解析总是犯糊涂 在图中,[] 中括号表示是jsonarray,{} 小括号 表示对象 这个解析可以写成: JSONArray array=new JSONArray(result); for( ...
- ORA-01502: index 'INDEX_NAME' or partition of such index is in unusable state
ORA-01502: index 'INDEX_NAME' or partition of such index is in unusable state 原因: 这个错误一般是因为索引状态为UNUS ...
- cocos2d-x宏定义
1 ccp : The "ccp" prefix means: "CoCos2d Point" //查看: ../cocos2d-x-2.2/cocos2dx/ ...
- python正则表达式re
Python正则表达式: re 正则表达式的元字符有. ^ $ * ? { [ ] | ( ).表示任意字符[]用来匹配一个指定的字符类别,所谓的字符类别就是你想匹配的一个字符集,对于字符集中的字符可 ...
- 如何在android studio 1.0 启动时设置代理【解决WARN - ateSettings.impl.UpdateChecker - Connection failed.】
今天第一次用android studio,下了个比较新的1.0.1 linux版本,结果启动时老是出现以下错误: [ 6987] WARN - ateSettings.impl.UpdateCheck ...
- SQL多表连接查询
SQL多表连接查询 本文主要列举两张和三张表来讲述多表连接查询. 新建两张表: 表1:student 截图如下: 表2:course 截图如下: (此时这样建表只是为了演示连接SQL语句,当然实际 ...
- SQL Server删除重复行的6个方法
SQL Server删除重复行是我们最常见的操作之一,下面就为您介绍六种适合不同情况的SQL Server删除重复行的方法,供您参考. 1.如果有ID字段,就是具有唯一性的字段 delect ta ...