WebSockets - 如何创建不同的消息?

时间:2011-09-25 05:19:28

标签: c# asp.net websocket

我正在创建一个websocket聊天应用程序,我设法将聊天消息转发到其他连接的浏览器。我有一个控制台应用程序在一个端口上侦听。

我的问题是......如果有人登录系统,我希望每个人都知道,我该怎么做?我正在使用Linq映射数据库,但如果日志记录正常,我该如何发送该消息,那个用户X已经登录?

最后我能够使用websockets创建一个聊天室,这是最终产品,感谢您的定位!

http://ukchatpoint.no-ip.org/Chatpoint/Pages/Uklobby.aspx

3 个答案:

答案 0 :(得分:4)

首先确保您以JSON(JavaScript Object Notation)的形式发送消息,因为这允许来回发送结构化数据,以及客户端&服务器可以区分聊天消息和指令(例如,新登录的人)。例如在客户端:

mySocket.onmessage = function(event) {
    var command = JSON.parse(event.data);

    if(command.type === 'message') {
        var message = command.message;
        // handle chat message
    }
    else if (command.type === 'newUser') {
        var username = command.username;
        // handle new user
    }
};

在ASP.NET C#中的服务器上,您将它们发送为:

public class ChatHandler : WebSocketHandler
{
    private JavaScriptSerializer serializer = new JavaScriptSerializer();
    private static WebSocketCollection chatapp = new WebSocketCollection();

    public override void OnMessage(string message)
    {
        var m = serializer.Deserialize<Message>(message);

        switch (m.Type)
        {
            case MessageType.NewUser:
                chatapp.Broadcast(serializer.Serialize(new
                {
                    type = "newUser",
                    username = m.username
                }));

                break;
            case MessageType.Message:
                chatapp.Broadcast(serializer.Serialize(new
                {
                    type = "message",
                    message = m.message
                }));

                break;
            default:
                return;
        }
    }
}

正如Hightechrider所说,您需要跟踪已连接客户端的列表,这就是WebSocketCollection类在上面的代码清单中的作用。

在这里查看Paul Batum在github上的WebSocket聊天示例(https://github.com/paulbatum/BUILD-2011-WebSocket-Chat-Samples/blob/master/BasicAspNetChat/ChatHandler.cs

他还在最近的MS BUILD会议上做了一个演讲(http://channel9.msdn.com/Events/BUILD/BUILD2011/SAC-807T

答案 1 :(得分:3)

您需要在应用程序级别跟踪连接,以便发送给所有人。但是请看一下SignalR,而不是为您编写WebSockets和长轮询所涉及的大量工作。使用SignalR,您可以使用GetClients将所有客户端连接到Hub

答案 2 :(得分:0)

使用PostgreSQL时,您可以使用数据库中的NOTIFY来通知应用层,该层可以生成通过WebSockets发送的消息。