实验简介
此实验主要讲解TCP和UDP的网络编程,net模块提供了一个异步网络包装器,用于TCP网络编程,它包含了创建服务器和客户端的方法。dgram模块用于UDP网络编程。
参考链接:https://nodejs.org/api/net.html, https://nodejs.org/api/dgram.html
TCP Server
net模块通过net.createServer方法创建TCP服务器,通过net.connect方法创建客户端去连接服务器。
通过net模块创建一个TCP Server:
<pre>
// 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');
});
</pre>
然后再创建一个客户端:
<pre>
// 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');
});
</pre>
运行测试:
在虚拟机中打开两个终端,先运行TCP服务器代码:
<pre>$ node server.js</pre>
然后在另一个终端运行TCP客户端代码:
<pre>$ node client.js</pre>
即可看到两个终端运行结果。
简易聊天室服务端
了解了基础的东西,下面我们来做一个简单的聊天室吧。
首先创建TCP服务器,和前面一样:
<pre>
// 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);
</pre>
简易聊天室客户端
聊天室的服务端功能基本就实现了,下面我们来写一个简单的客户端吧:
<pre>
// 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();
});
</pre>
客户端中用到了process这个模块,process是一个Node.js的全局模块,可以在任何地方
直接使用而无需通过require方法引入。process模块允许你获得或者修改当前Node.js
进程的设置。process.stdin用于获取来自标准输入的可读流(Readable Stream)。
现在来运行这个聊天室吧:
<pre>$ node chatServer.js</pre>
在打开多个终端窗口,运行:
<pre>$ node chatClient.js</pre>
然后在任意运行的客户端输入字符串并按回车键,会在服务端和其他客户端开到这个客户端的输入内容。这样就实现了一个简单的聊天室了_。
UDP Server
UDP和TCP类似,通过dgram.createSocket创建服务。
UDP服务器:
<pre>
// 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
</pre>
UDP客户端:
<pre>
// 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();
});
</pre>
发送的消息必须通过Buffer创建。
然后运行服务端:
<pre>$ node server.js</pre>
再运行客户端:
<pre>$ node client.js</pre>
此时,服务端就会收到来自客户端的消息。
Node.js基础的网络编程就讲到这里了。