美文网首页
Node.js中的网络编程

Node.js中的网络编程

作者: 张金宇 | 来源:发表于2016-09-14 17:14 被阅读0次

    实验简介

    此实验主要讲解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基础的网络编程就讲到这里了。

    相关文章

      网友评论

          本文标题:Node.js中的网络编程

          本文链接:https://www.haomeiwen.com/subject/gnevettx.html