1.新建core版控制台程序引用
2.初始化websocket
class Program
{
//客户端url以及其对应的Socket对象字典
static IDictionary<string, IWebSocketConnection> dic_Sockets = new Dictionary<string, IWebSocketConnection>();
static ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("127.0.0.1:6379");
static void Main()
{
//创建
FleckLog.Level = LogLevel.Info;
WebSocketServer server = new WebSocketServer("ws://" + getLocalmachineIPAddress() + ":37280");//监听地址
//出错后进行重启
server.RestartAfterListenError = true;
//开始监听
server.Start(socket =>
{
socket.OnOpen = () => //连接建立事件
{
//获取客户端网页的url
string clientUrl = socket.ConnectionInfo.ClientIpAddress + ":" + socket.ConnectionInfo.ClientPort;
dic_Sockets.Add(clientUrl, socket);
Console.WriteLine(DateTime.Now.ToString() + "|服务器:和客户端网页:" + clientUrl + " 建立WebSock连接!");
};
socket.OnClose = () => //连接关闭事件
{
string clientUrl = socket.ConnectionInfo.ClientIpAddress + ":" + socket.ConnectionInfo.ClientPort;
//如果存在这个客户端,那么对这个socket进行移除
if (dic_Sockets.ContainsKey(clientUrl))
{
//注:Fleck中有释放
//关闭对象连接
if (dic_Sockets[clientUrl] != null)
{
dic_Sockets[clientUrl].Close();
}
dic_Sockets.Remove(clientUrl);
}
Console.WriteLine(DateTime.Now.ToString() + "|服务器:和客户端网页:" + clientUrl + " 断开WebSock连接!");
};
socket.OnMessage = message => //接受客户端网页消息事件
{
//allSockets.ToList().ForEach(s => s.Send("Echo: " + message));
string clientUrl = socket.ConnectionInfo.ClientIpAddress + ":" + socket.ConnectionInfo.ClientPort;
Console.WriteLine(DateTime.Now.ToString() + "|服务器:【收到】来客户端网页:" + clientUrl + "的信息:\n" + message);
};
socket.OnError = ex =>
{
string clientUrl = socket.ConnectionInfo.ClientIpAddress + ":" + socket.ConnectionInfo.ClientPort;
//如果存在这个客户端,那么对这个socket进行移除
if (dic_Sockets.ContainsKey(clientUrl))
{
//注:Fleck中有释放
//关闭对象连接
if (dic_Sockets[clientUrl] != null)
{
dic_Sockets[clientUrl].Close();
}
dic_Sockets.Remove(clientUrl);
}
Console.WriteLine(DateTime.Now.ToString() + "|服务器:和客户端网页:" + clientUrl + " 异常,断开WebSock连接!");
};
});
Task.Factory.StartNew(SubScribeToChannel);
//Tick();//业务逻辑
3.订阅
//订阅
static void SubScribeToChannel()
{
//创建连接
ISubscriber sub = redis.GetSubscriber();
//订阅名为 Channel1的通道
sub.Subscribe("Channel1", new Action<RedisChannel, RedisValue>((channel, message) =>
{
foreach (var socket in dic_Sockets.Values)
{
if (socket.IsAvailable == true)
{
//输出收到的消息
socket.Send(message.ToString());
}
}
}));
}
4. 发布
//发布
static void PubScribeToChannel(string msg)
{
ISubscriber sub = redis.GetSubscriber();
sub.Publish("Channel1", msg);
}
5.业务逻辑中调用发布数据
......
foreach (var tickInfo in ticks)
{
PubScribeToChannel("T:" + tickInfo.Ctm + " S:" + symbol + " A:" + tickInfo.Ask + " B:" + tickInfo.Bid);
}
......
6.客户端程序
var socket;
var host = "ws://192.168.0.108:37280";
socket = new WebSocket(host);
try {
socket.onopen = function () {
console.log("sucess");
};
socket.onmessage = function (msg) {
console.log(msg.data);
};
socket.onclose = function ()
{
console.log("Closed");
};
}
catch (ex) {
log(ex);
}