Node入门教程(11)第九章:Node 的网络模块

Node入门教程(11)第九章:Node 的网络模块

大家好,又见面了,我是你们的朋友全栈君。

net网络模块

net模块是node对TCP或者IPC开发的封装,包括了客户端和服务器端相关API。对于阅读本文,请您有一定的网络编程的基础。
您需要已经了解了:

  • ip协议,会配置ip地址
  • 了解dns解析过程,了解dns的概念
  • 了解基本的TCP的协议的
  • 了解Socket的编程相关概念
  • 了解node的事件处理、流、文件处理等
  • 了解HTTP协议

本文,仅对部分API和TCP开发做一些简单介绍。

创建TCP服务器端

net.Server 类用于创建TCP的server,而且继承了EventEmitter。通过net.createServer([options][, connectionListener])方法创建此类型实例。

const net = require('net'); // 创建服务器端的 const server = net.createServer(); // 监听异常错误事件 server.on('error', err => { // throw err; console.log(err); }); // 监听客户端的连接事件,客户端连接上后,会自动执行回调函数,回调函数的参数就是指向客户端的socket server.on('connection', clientSocket => { console.log('客户端:%s', clientSocket.remoteAddress); // 监听此客户端的end事件。 clientSocket.on('end', () => { console.log('client disconnected'); }); // 监听此客户端发送数据的事件。 clientSocket.on('data', data => { console.log('收到数据:%s', data); }); // 向客户端发送数据 clientSocket.write('Hi, aicoder.com '); // 2s后让客户端退出 setTimeout(() => { // 通知客户端退出,并发送数据。 clientSocket.end('bye!'); }, 2000); }); // 服务器开始监听60003端口(端口:0-65535之间的一个值) server.listen(60003, () => { console.log('opened server on', server.address()); }); // 以下为关闭监听的实例 // setTimeout(() => { // console.log('服务器端退出!!!'); // server.close(); // }, 5000); 

net.Server 是对服务器端的Socket的封装,可以监听close事件、error事件、connection 事件、listening 事件。还可以通过close()方法关闭服务的监听。其他用法参考官网文档

net.Socket 类是对客户端Socket的封装,可以监听 close 事件、 connect 事件 、data事件、drain 事件、end 事件、error 事件、lookup 事件、timeout 事件。可用的方法包括:write()发送数据、edn()结束连接等。其中可以同data事件来处理服务器端的数据。

创建TCP的客户端

net.createConnection()方法可以实现连接服务器端,并生成一个net.Socket 类实例,跟服务器端进行交互就是靠此实例。

const net = require('net'); // 创建连接到服务器的客户端 let client = net.createConnection('60003', '127.0.0.1', () => { client.write('Hi, client, for aicoder.com'); console.log('连接上服务器端!'); }); client.on('error', err => { console.log(err); }); client.on('end', () => { console.log('结束连接!'); }); client.on('close', () => { console.log('退出'); }); client.on('data', data => { console.log('收到数据: %s', data); }); 

通过Socket上传文件的例子

const net = require('net'); const path = require('path'); const fs = require('fs'); // 创建服务器端的 const server = net.createServer(); // 监听异常错误事件 server.on('error', err => { console.log(err); }); // 监听客户端的连接事件,客户端连接上后,会自动执行回调函数,回调函数的参数就是指向客户端的socket server.on('connection', clientSocket => { console.log('客户端:%s', clientSocket.remoteAddress); // 监听此客户端的end事件。 clientSocket.on('end', () => { console.log('client disconnected'); }); // 监听此客户端发送数据的事件。 clientSocket.on('data', data => { console.log('收到数据:%s', data); let fileName = path.join(__dirname, 'b.html'); let ws = fs.createWriteStream(fileName); ws.write(data, 'utf8'); }); // 向客户端发送数据 clientSocket.write('Hi, aicoder.com '); }); // 服务器开始监听60003端口(端口:0-65535之间的一个值) server.listen(60003, () => { console.log('opened server on', server.address()); }); // 以下是客户端代码 const client = net.createConnection(60003, '127.0.0.1', () => { console.log('连接上服务器端!'); let fileName = path.join(__dirname, 'a.html'); let rs = fs.createReadStream(fileName, { encoding: 'utf8' }); // socket本身是可读可写流,所以可以直接用管道。 rs.pipe(client); }); 

模拟一个WEB服务器软件

如果您已经了解了HTTP协议的话,而且已经掌握如何做TCP的发送数据和接受处理数据,再有您稍微掌握一点字符串处理的技巧,那么您就很容易做一个简单的静态web服务器出啦。当然这里是说用底层的API,不是用http模块。

限于篇幅,在此不再赘述,请直接看我的github源码,仅仅是demo,不要用于生产环境中。

总结

node中对socket的封装,还是比较像node的开发风格的,可能跟其他平台的socket编程的风格不一致,但是原理和开发方式都是一样的。这里仅仅是简单介绍一下Node下面网络编程的基本方法,细节请参考官网文档。


老马免费视频教程

返回教程列表首页

github地址:https://github.com/malun666/aicoder_node

 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/107582.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • gulp pipe缓存_gulp使用教程

    gulp pipe缓存_gulp使用教程首先,gulp的源码里没有任何一部分是定义pipe的。gulp的pipe方法是来自nodejsstreamAPI的。gulp本身是由一系列vinyl模块组织起来的。pipe方法到底是什么呢?pipe跟他字面意思一样只是一个管道例如我有一堆文件var s=gulp.src(["fileA","fileB","fileC"])src方法实际上是’vinyl-fs’模…

    2025年5月22日
    2
  • oracle创建用户与分配权限

    oracle创建用户与分配权限oracle创建用户与分配权限我们要在有最高权限的system用户创建用户,再赋予新建用户权限,只有给新建用户权限,新建用户才能干什么。CREATEUSER创建用户DBA(数据库管理者)使用CREATEUSER语句创建用户注意刚刚创建用户,仅仅是有这个用户的存在,还没有创建会话窗口的权限,进不了oracle界面CREATEUSERTestUser-…

    2022年5月19日
    38
  • vuex mapGetters的使用「建议收藏」

    vuex mapGetters的使用「建议收藏」importVuefrom’vue’;importVuexfrom’vuex’;Vue.use(Vuex);conststore=newVuex.Store({state:{name:’张三’,number:0,list:[{id:1,name:’111′},{id:2,name:’222′},{id:3,

    2022年5月29日
    44
  • 英语发音规则—ea字母组合发音规律「建议收藏」

    英语发音规则—ea字母组合发音规律「建议收藏」英语发音规则ea字母组合发音规律一、总结一句话总结:字母组合ea的发音规律,在学习字母组合在单词中的发音规律以前,一定要熟练撑握什么是开音节,什么是闭音节,否则你就不撑握这些发音规律。1、ea

    2022年8月5日
    6
  • LARGE_INTEGER解析和使用

    LARGE_INTEGER解析和使用这里解释前面碰到的LARGE_INTEGER结构。与可能的误解不同,64位数据并非要在64位操作系统下才能使用。在VC中,64位数据的类型为__int64。定义写法如下:     __int64file_offset;     上面之所以定义的变量名为file_offset,是因为文件中的偏移量是一种常见的要使用64位数据的情况。同时,文件的大小也是如此(回忆上一

    2022年7月25日
    16
  • matlab画图颜色属性「建议收藏」

    matlab画图颜色属性「建议收藏」各种颜色属性选项选项意义选项意义’r’红色’m’粉红’g’绿色’c’青色32’b’兰色’w’白色’y’黄色’k’黑色各种线型属性选项选项意义选项意义’-‘实线’–‘虚线’:’点线’-.’点划线各种标记点属性选项选项意义选项意义’.’用点号绘制各数据点’^’用上三角绘制各数据点’+’用’+’号绘制各数据点’v’…

    2022年5月6日
    89

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号