net模块提供了一个异步网络包装器,用于TCP网络编程,它包含了创建服务器和客户端的方法。dgram模块用于UDP网络编程。

参考链接:https://nodejs.org/api/net.htmlhttps://nodejs.org/api/dgram.html

一、TCP Server

net模块通过net.createServer方法创建TCP服务器,通过net.connect方法创建客户端去连接服务器。

1、通过net模块创建一个TCP Server

// server.js

var net = require('net');

// 创建TCP服务器
var server = net.createServer(function(socket) {
console.log('client connected'); // 监听客户端的数据
socket.on('data', function(data) {
console.log('server got data from client: ', data.toString());
});
// 监听客户端断开连接事件
socket.on('end', function(data) {
console.log('connection closed');
});
// 发送数据给客户端
socket.write('Hello\r\n');
}); // 启动服务
server.listen(8080, function() {
console.log('server bound');
});

2、创建一个客户端

// client.js

var net = require('net');

// 连接服务器
var client = net.connect({port: 8080}, function() {
console.log('connected to server');
client.write('World!\r\n');
}); // 接收服务端的数据
client.on('data', function(data) {
console.log('client got data from server: ', data.toString());
// 断开连接
client.end();
}); // 断开连接
client.on('end', function() {
console.log('disconnected from server');
});

在一个终端运行TCP服务器代码,另一个终端运行TCP客户端代码,结果如下:

二、简易聊天室服务器

1、简易聊天室服务端

首先创建TCP服务器;然后是接收客户端连接请求;获取客户端发送过来的数据;允许多个客户端同时连接,所以需要接收所有的用户连接;服务器广播数据,把来自客户端的数据转发送给其他所有客户端;最后把关闭连接的客户端从服务器广播列表中给删除掉。

// chatServer.js

var net = require('net');

//第一步 创建TCP服务器
var server = net.createServer();
// 存储所有客户端socket
//第四步,服务器接收所有的用户连接
var sockets = [];

//第二步 接收客户端请求
server.on('connection', function(socket) {
console.log('Got a new connection');
  //第五步,服务器广播数据
sockets.push(socket);
  //第三步,获取客户端发送过来的数据
socket.on('data', function(data) {
console.log('Got data: ', data); sockets.forEach(function(otherSocket) {
if (otherSoecket !== socket) {
otherSocket.write(data);
}
});
]); // 第六步,关闭连接客户端从服务器广播列表删除
socket.on('close', function() {
console.log('A client connection closed');
var index = sockets.indexOf(socket);
sockets.splice(index, 1);
});
}); server.on('error', function(err) {
console.log('Server error: ', err.message);
}); server.on('close', function() {
console.log('Server closed');
}); server.listen(8080);

2、简易聊天室客户端

先解释process模块

process模块是Node.js的一个全局模块,可以在任何地方直接使用而无需通过require方法引入。process模块允许获得或修改当前Node.js进程的设置。

process.stdin用于获取来自标准输入的可读流(Readable Stream)。

客户端代码

// chatClient.js

var net = require('net');

process.stdin.resume();
process.stdin.setEncoding('utf8'); var client = net.connect({ port: 8080 }, function() {
console.log('Connected to server'); // 获取输入的字符串
console.log('input: ');
process.stdin.on('data', function(data) {
// 发送输入的字符串到服务器
console.log('input: ');
client.write(data); // 输入 'close' 字符串时关闭连接
if (data === 'close\n') {
client.end();
}
});
}); // 获取服务端发送过来的数据
client.on('data', function(data) {
console.log('Other user\'s input', data.toString());
}); client.on('end', function() {
console.log('Disconnected from server');
// 退出客户端程序
process.exit();
});

一个终端窗口执行$ node chatServer.js运行服务器代码。

另外两个终端窗口执行$ node chatClient.js运行客户端代码。

结果如下:

三、UDP编程

UDP通过dgram.createSocket创建服务。

1、服务器端代码

// udpServer.js

var dgram = require("dgram");

var server = dgram.createSocket("udp4");

server.on("error", function(err) {
console.log("server error:\n" + err.stack);
server.close();
}); // 接收来自客户端的消息
server.on("message", function(msg, rinfo) {
console.log("server got: " + msg.toString() + " from " + rinfo.address + ":" + rinfo.port);
}); // 监听服务
server.on("listening", function() {
var address = server.address();
console.log("server listening on " + address.address + ":" + address.port);
}); server.bind(41234);
// server listening 0.0.0.0:41234

2、客户端

发送消息必须通过Buffer创建。

// udpClient.js

var dgram = require('dgram');

var client = dgram.createSocket('udp4');
var message = new Buffer('hello shiyanlou'); client.send(message, 0, message.length, 41234, 'localhost', function(err, bytes) {
client.close();
});

运行结果如下

四、排错

1、Error: connect ECONNREFUSED 127.0.0.1:8080

服务器端口没开。

本文作者starof,因知识本身在变化,作者也在不断学习成长,文章内容也不定时更新,为避免误导读者,方便追根溯源,请诸位转载注明出处:http://www.cnblogs.com/starof/p/5056519.html有问题欢迎与我讨论,共同进步。

最新文章

  1. 跟随Rodolfo进入VR时代!
  2. ArrayList实现删除重复元素(元素不是对象类型的情况)
  3. Surprise团队第一周项目总结
  4. jQuery的$.get和$.ajax函数对比
  5. Linux Centos7下安装Python
  6. 06---Net基础加强
  7. libimobiledevice安装步骤
  8. texCUBE() to CubemapSampler.Sample()
  9. cojs 榴莲 题解报告
  10. Javaweb入门20160301 ---xml入门
  11. win2k,XP下用setupapi.dll自动安装Driver
  12. Spring + mybatis整合方案总结 结合实例应用
  13. ASM-51 宏汇编使用手册
  14. 转——iptables详细配置
  15. Hive HA使用说明
  16. Android 将Activity殴打jar包 对于由第三方使用 解决XML 图片 文本资源并不难过进入jar包装问题!
  17. onethink的熟悉
  18. FineUIMvc随笔(6)对比WebForms和MVC中表格的数据库分页
  19. Weex的环境搭建以及集成到Android项目
  20. win10 uwp 从StorageFile获取文件大小

热门文章

  1. ZOJ 4019 Schrödinger's Knapsack
  2. WebStrom直接启动VUE项目
  3. ARMCortex系列仿真调试器
  4. 20155332 2016-2017-2 《Java程序设计》第9周学习总结
  5. SRS+flv.js打造兼容性较高的直播、点播平台
  6. C 语言 register 关键字
  7. Python3学习笔记19-继承和多态
  8. 巧用CASE WHEN 验证用户登录信息
  9. nginx常见异常分析
  10. root权限使用vim不能修改权限