liunx上的nodejs使用exe

liunx上的nodejs使用exe,第1张

1.通过下面的命令可以调用exe。

const child = require('child_process')child.exec(`${path路局悔没径}`, (err, stdout, stderr) =>{console.log(err, stdout, stderr)})。桐纳前森

node.dll放到exe方法。

1、从嵌入老羡的DLL加载字节数据data。运清

2、将data写至一个临时文件中,使用Assembly.LoadFile(path)进行加载旁含前即可。

完成 Sever -->Client 的单向通讯。

[javascript] view plain copy

// Sever -->Client 的单向通讯

var net = require('net')

var chatServer = net.createServer()

chatServer.on('connection', function(client) {

client.write('Hi!\n')// 服务端客户端输出信息,使用 write() 方穗困法

client.write('Bye!\n')

client.end()// 服务端结束该次会话

})

chatServer.listen(9000)

客户端可以是系统自带的 Telnet:

[plain] view plain copy

telnet 127.0.0.1 9000

执行 telnet 后,与服务点连接,反馈 Hi! Bye! 的字符,并立刻结束服务端程序终止连接。如果我们要服务端接到到客户端的信息?可以监听 server.data 事件并且不要中止连接(否则会碧族备立刻结束无法接受来自客户端的消息):

[javascript] view plain copy

// 在前者的基础上,实现 Client -->Sever 的通讯,如此悔毁一来便是双向通讯

var net = require('net')

var chatServer = net.createServer(),

clientList = []

chatServer.on('connection', function(client) {

// JS 可以为对象自由添加属性。这里我们添加一个 name 的自定义属性,用于表示哪个客户端(客户端的地址+端口为依据)

client.name = client.remoteAddress + ':' + client.remotePort

client.write('Hi ' + client.name + '!\n')

clientList.push(client)

client.on('data', function(data) {

broadcast(data, client)// 接受来自客户端的信息

})

})

function broadcast(message, client) {

for(var i=0i<clientList.lengthi+=1) {

if(client !== clientList[i]) {

clientList[i].write(client.name + " says " + message)

}

}

}

chatServer.listen(9000)

这里要说明一下的是,不不同 *** 作系统对端口范围的限制不一样,有可能是随机的。

那么上面是不是一个完整功能的代码呢?我们说还有一个问题没有考虑进去:那就是一旦某个客户端退出,却仍保留在 clientList 里面,这明显是一个空指针(NullPoint)。如果是在这样的话我们写程序太脆弱了,能不能更健壮一些?——请接着看。

首先我们简单地把 client 从数组 clientList 中移除掉。完成这工作一点都不困难。Node TCP API 已经为我们提供了 end 事件,即客户端中止与服务端连接的时候发生。移除 client 对象的代码如下:

[javascript] view plain copy

chatServer.on('connection', function(client) {

client.name = client.remoteAddress + ':' + client.remotePort

client.write('Hi ' + client.name + '!\n')

clientList.push(client)

client.on('data', function(data) {

broadcast(data, client)

})

client.on('end', function() {

clientList.splice(clientList.indexOf(client), 1)// 删除数组中的制定元素。这是 JS 基本功哦~

})

})

但是我们还不敢说上述代码很健壮,因为一旦 end 没有被触发,异常仍然存在着。下面我们看看解决之道:重写 broadcast():

[javascript] view plain copy

function broadcast(message, client) {

var cleanup = []

for(var i=0i<clientList.lengthi+=1) {

if(client !== clientList[i]) {

if(clientList[i].writable) { // 先检查 sockets 是否可写

clientList[i].write(client.name + " says " + message)

} else {

cleanup.push(clientList[i]) // 如果不可写,收集起来销毁。销毁之前要 Socket.destroy() 用 API 的方法销毁。

clientList[i].destroy()

}

}

} //Remove dead Nodes out of write loop to avoid trashing loop index

for(i=0i<cleanup.lengthi+=1) {

clientList.splice(clientList.indexOf(cleanup[i]), 1)

}

}

TCP API 中还提供一个 error 事件,用于捕捉客户端的异常:

[javascript] view plain copy

client.on('error', function(e) {

console.log(e)

})

Node 网络编程的 API 还丰富,此次仅仅是个入门,更多的内容请接着看,关于浏览器 Socket 应用。

Socket.IO

前面说到,浏览器虽然也属于客户端的一种,但仅支持“单工”的 HTTP 通讯。有见及此,HTML5 新规范中推出了基于浏览器的 WebSocket,开发了底层的接口,允许我们能进行 更强大的 *** 作,超越以往的 XHR。

如第一个例子那般,我们无须第三方框架就可以直接与 Node TCP 服务器 进行 Socket 通讯。

但我们又要认清一个事实,不是每个浏览器都可以顺利支持 WebSocket 的。于是 Socket.IO (http://socket.io)出现了,它提供了不支持 WebSocket 时候的降级支持,同时使得一些旧版本的浏览器也可以“全双工”地工作。优先使用的顺序如下:

WebSocket

Socket over Flash API

XHR Polling 长连接

XHR Multipart Streaming

Forever Iframe

JSONP Polling

经过封装,我们可以不探究客户端使用上述哪一种技术达致“全双工”;而我们编写代码时,亦无论考虑哪种放法,因为 Socket.IO 给我们的 API 只有一套。了解 Socket.IO 其用法就可以了。

先在浏览器部署 Socket.IO 的前端代码:

[html] view plain copy

<!DOCTYPE html>

<html>

<body>

<script src="/socket.io/socket.io.js"></script>

<script>

var socket = io.connect('http://localhost:8080')

// 当服务端发送一条消息到客户端,message 事件即被触发。我们把消息在控制台打印出来

socket.on('message', function(data){ console.log(data) })

</script>

</body>

</html>

服务端 Node 代码:

[javascript] view plain copy

var http = require('http'),

io = require('socket.io'),

fs = require('fs')

// 虽然我们这里使用了同步的方法,那会阻塞 Node 的事件循环,但是这是合理的,因为 readFileSync() 在程序周期中只执行一次,而且更重要的是,同步方法能够避免异步方法所带来的“与 SocketIO 之间额外同步的问题”。当 HTML 文件读取完毕,而且服务器准备好之后,如此按照顺序去执行就能让客户端马上得到 HTML 内容。

var sockFile = fs.readFileSync('socket.html')

// Socket 服务器还是构建于 HTTP 服务器之上,因此先调用 http.createServer()

server = http.createServer()

server.on('request', function(req, res){

// 一般 HTTP 输出的格式

res.writeHead(200, {'content-type': 'text/html'})

res.end(sockFile)

})

server.listen(8080)

var socket = io.listen(server)// 交由 Socket.io 接管

// Socket.io 真正的连接事件

socket.on('connection', function(client){

console.log('Client connected')

client.send('Welcome client ' + client.sessionId)// 向客户端发送文本

})

当客户端连接时,服务端会同时出发两个事件:server.onRequest 和 Socket.onConnection。它们之间有什么区别呢?区别在于 Socket 的是持久性的。

多个 Socket 连接,先是客户端代码:

[html] view plain copy

<!DOCTYPE html>

<html>

<body>

<script src="/socket.io/socket.io.js"></script>

<script>

var upandrunning = io.connect('http://localhost:8080/upandrunning')

var weather = io.connect('http://localhost:8080/weather')

upandrunning.on('message', function(data){

document.write('<br /><br />Node: Up and Running Update<br />')

document.write(data)

})

weather.on('message', function(data){

document.write('<br /><br />Weather Update<br />')

document.write(data)

})

</script>

</body>

</html>

服务端代码:

[javascript] view plain copy

var sockFile = fs.readFileSync('socket.html')

server = http.createServer()

server.on('request', function(req, res){

res.writeHead(200, {'content-type': 'text/html'})

res.end(sockFile)

})

server.listen(8080)

var socket = io.listen(server)

socket.of('/upandrunning')

.on('connection', function(client){

console.log('Client connected to Up and Running namespace.')

client.send("Welcome to 'Up and Running'")

})

socket.of('/weather')

.on('connection', function(client){

console.log('Client connected to Weather namespace.')

client.send("Welcome to 'Weather Updates'")

})

如上代码,我们可以划分多个命名空间,分别是 upandrunning 和 weather。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12537322.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存