实现思路:客户端js连接了nodejs服务,通过.net连接nodejs服务,通过.net发送消息到nodejs,然后通过nodejs将消息推送给(用户)客户端
1、先下载nodejs安装,至于怎么安装nodejs网上很多说明,这里就不做说明了
SocketIO4Net开源项目结构如下:
进入项目的目录:socketio4net-develop\samples\node.server 如图下图:
双击先 install.cmd运行这个文件安装nodejs需要的模块(这个步骤需要在已经连接网络下进行),在双击运行startServer.cmd文件启动nodejs服务,服务启动成功入下图:
使用nodejs可以快速搭建一个即时通讯的聊天室下载请点这里
使用下载SocketIO4Net开源类库可以快速链接nodejs通讯服务进行交互通讯
SocketIO4Net的项目里面有个控制台Console_Events项目下有个EventClient.cs类,进行二次开发主要参照这个类的写法去开发,加入自己的逻辑
我做测试修改的EventClient.cs类的代码如下:
using System; using System.Diagnostics; using System.Threading; using SocketIOClient; using Newtonsoft.Json.Linq; using System.Linq; using System.Text.RegularExpressions; using SocketIOClient.Messages; using System.Net; namespace ConsoleEvents { /// <summary> /// Example usage class for SocketIO4Net /// </summary> public class EventClient { Client socket; public void Execute() { Console.WriteLine("Starting SocketIO4Net Client Events Example..."); socket = new Client("http://127.0.0.1:3000/") { }; // url to the nodejs / socket.io instance //socket.TransportPeferenceTypes.Add(TransportType.XhrPolling); socket.Opened += SocketOpened; socket.Message += SocketMessage; socket.SocketConnectionClosed += SocketConnectionClosed; socket.Error += SocketError; // Optional to add HandShake headers - comment out if you do not have use socket.HandShake.Headers.Add("OrganizationId", "1034"); socket.HandShake.Headers.Add("UserId", "TestSample"); socket.HandShake.Headers.Add("Cookie", "somekookie=magicValue"); socket.HandShake.Headers.Add("token", "Fxt_ABCDEFGHIJKLMNOPQRSTUVWXYZ"); // Register for all On Events published from the server - prior to connecting // register for 'connect' event with io server socket.On("connect", (fn) => { Console.WriteLine("\r\nConnected event...{0}\r\n", socket.ioTransport.TransportType); socket.Emit("subscribe", new { room = "eventRoom" }); // client joins 'eventRoom' on server }); // register for 'update' events - message is a json 'Part' object socket.On("update", (data) => { Console.WriteLine("recv [socket].[update] event"); Console.WriteLine(" raw message: {0}", data.RawMessage); Console.WriteLine(" string message: {0}", data.MessageText); Console.WriteLine(" json data string: {0}", data.Json.ToJsonString()); // cast message as Part - use type cast helper Part part = data.Json.GetArgAs<Part>(); Console.WriteLine(" PartNumber: {0}\r\n", part.PartNumber); }); // register for 'alerts' events - broadcast only to clients joined to 'Room1' socket.On("log", (data) => { Console.WriteLine(" log: {0}", data.Json.ToJsonString()); }); socket.On("empty", (data) => { Console.WriteLine(" message 'empty'"); }); //socket.Connect(SocketIOClient.TransportType.XhrPolling); socket.Connect(); } public void SendMessageSamples() { // random examples of different styles of sending / recv payloads - will add to... //socket.Send(new TextMessage("Hello from C# !")); // send plain string message //socket.Emit("hello", new { msg = "My name is SocketIO4Net.Client!" }); // event w/string payload //socket.Emit("sendtodepartment", new { token = "Fxt_ABCDEFGHIJKLMNOPQRSTUVWXYZ", todepartmentids = "user_123_123,user_1234_1234,user_12345_12345", msg = "eeeeeeeeeeeeeeeeeeeeee" }); // socket.Emit("sendtousers", new { token = "Fxt_ABCDEFGHIJKLMNOPQRSTUVWXYZ", touserids = "user_123w_123q,user_1234_1234,user_12345_12345", msg = "xxxxxxxxxxxxxxxxxxxxxxxxx" }); socket.Emit("sendMsg", new { token = "qfefefedfwrfwefw4teryurtyewtwerwererererwe", UserId = "1", UserName = "test", msg = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" }); //socket.Emit("heartbeat"); // event w/o data payload (nothing to do with socket.io heartbeat) //socket.Emit("hello", "simple string msg"); //socket.Emit("partInfo", new { PartNumber = "AT80601000741AA", Code = "SLBEJ", Level = 1 }); // event w/json payload //Part newPart = new Part() { PartNumber = "K4P2G324EC", Code = "DDR2", Level = 1 }; //socket.Emit("partInfo", newPart); // event w/json payload // callback using namespace example //Console.WriteLine("Emit [socket.logger].[messageAck] - should recv callback [socket::logger].[messageAck]"); //socket.Emit("messageAck", new { hello = "papa" }, "", // (callback) => // { // var jsonMsg = callback as JsonEncodedEventMessage; // callback will be of type JsonEncodedEventMessage, cast for intellisense // Console.WriteLine(string.Format("callback [socket::logger].[messageAck]: {0} \r\n", jsonMsg.ToJsonString())); // }); } void SocketError(object sender, ErrorEventArgs e) { Console.WriteLine("socket client error:"); Console.WriteLine(e.Message); } void SocketConnectionClosed(object sender, EventArgs e) { Console.WriteLine("WebSocketConnection was terminated!"); } void SocketMessage(object sender, MessageEventArgs e) { // uncomment to show any non-registered messages if (string.IsNullOrEmpty(e.Message.Event)) Console.WriteLine("Generic SocketMessage: {0}", e.Message.MessageText); else Console.WriteLine("Generic SocketMessage: {0} : {1}", e.Message.Event, e.Message.JsonEncodedMessage.ToJsonString()); } void SocketOpened(object sender, EventArgs e) { } public void Close() { if (this.socket != null) { socket.Opened -= SocketOpened; socket.Message -= SocketMessage; socket.SocketConnectionClosed -= SocketConnectionClosed; socket.Error -= SocketError; this.socket.Dispose(); // close & dispose of socket client } } } }