使用nodejs有一段时间,但主要应用场景就是nodejs通过socket.io实现web客户端与nodejs服务端的实时交互,今天遇到一个问题,就是其他的系统监控数据实时推送给nodejs,nodejs再推送给web客户端,网上找了很多资料,看了superwebsocket,websoketio4net,按代码测试就是通不过,看了一个websocketoi4net引用的文件有8个,感觉一个小功能而以,引用这么多dll太不划算了,说白了websocket的底层还是soket了,于是就想能不能使用nodejs自带的soket功能来实现了,马上进入nodejs官网一看,原来是有net模块的,带了socket方法,一看使用示例,简单得很,区区几行代码就可以实现socket服务端的端口监听;
第三方系统是.net的,.net也有using System.Net.Sockets,创建一个客户端也只有区区几行,不用引用任何第三方dll,代码整简,功能清晰;
实现思路很清晰了,即第三方系统socket 客户端将数据转成json格式的string,nodejs socket服务端接收同时转成json,然后socket.io广播给web客户端,搞定收工!
上.net代码:
/// <summary>
/// 发送消息
/// </summary>
public void Execute()
{
if (this.clientSocket == null) {
clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
clientSocket.Connect(new IPEndPoint(IPAddress.Parse(_ip), _port)); //配置服务器IP与端口
}
try
{
//string tmpstr = "{"success":true,"msg":"","datas":{"custlist":[],"cardphoto":"","worklist":[{"code":"G02","name":"大工"},{"code":"G03","name":"技师"},{"code":"G04","name":"助理"}],"mastercode":"M0000000005","companycode":"M0003","currdate":"2017 - 04 - 03"}}";
JObject jobj = new JObject();
jobj.Add("success",true);
jobj.Add("msg", "");
jobj.Add("datas", "code");
jobj.Add("code", "大工");
jobj.Add("date", DateTime.Now);
clientSocket.Send(Encoding.UTF8.GetBytes(jobj.ToString()));
}
catch(Exception ex)
{
listBox1.Items.Insert(0,"发送数据包失败"+ex.StackTrace);
}
}
nodejs 服务端js
var app = require('express')();var http = require('http').Server(app);
var io = require('socket.io')(http);
var net = require('net');
var HOST = '127.0.0.1';
var PORT = 6969;
// 创建一个TCP服务器实例,调用listen函数开始监听指定端口
// 传入net.createServer()的回调函数将作为”connection“事件的处理函数
// 在每一个“connection”事件中,该回调函数接收到的socket对象是唯一的
net.createServer(function(sock) {
// 我们获得一个连接 - 该连接自动关联一个socket对象
console.log('CONNECTED: ' +
sock.remoteAddress + ':' + sock.remotePort);
// 为这个socket实例添加一个"data"事件处理函数
sock.on('data', function(data) {
console.log('DATA ' + sock.remoteAddress + ': ' + data);
//将数据广播给所有Web客户端
if (Buffer.isBuffer(data)){
io.sockets.emit('data',JSON.parse(data));
}else{
io.sockets.emit('data',data);
}
// 回发该数据,客户端将收到来自服务端的数据
//sock.write('You said "' + data + '"');
});
// 为这个socket实例添加一个"close"事件处理函数
sock.on('close', function(data) {
console.log('CLOSED: ' +
sock.remoteAddress + ' ' + sock.remotePort);
});
}).listen(PORT, HOST);