0

我想创建基于 HTML5 websocket 的 html5 网络多房间聊天。但我需要一些帮助才能开始。

我想在 c# 中做服务器端代码,但我找不到任何教程如何在 c# 中使用多房间聊天 websocket 服务器。

是否有任何服务器已经在 .net 中实现,或者我可以更新到多房间聊天?

这是一个小项目,一个房间可容纳 10 人。你能帮我怎么开始吗?

非常感谢你 !

我准备示例代码结构:

主服务器类:

    class Program
{

    // List of courses, which are currentli avalible ( REPRESENT CHAT ROOM) 
    protected static ConcurrentDictionary<Course, string> OnlineUsers = new ConcurrentDictionary<Course, string>();

    static void Main(string[] args)
    {
        // Initialize the server on port 81, accept any IPs, and bind events.
        var aServer = new WebSocketServer(81, IPAddress.Any)
        {
            OnReceive = OnReceive,
            OnSend = OnSend,
            OnConnected = OnConnect,
            OnDisconnect = OnDisconnect,
            TimeOut = new TimeSpan(0, 5, 0)
        };

        aServer.Start();

        // Accept commands on the console and keep it alive
        var command = string.Empty;
        while (command != "exit")
        {
            command = Console.ReadLine();
        }

        aServer.Stop();
    }

    // event when the clients connect to server 
    // Server send to client list of Lessons which are avalible, after 
    private static void OnConnect(UserContext context)
    {
        throw new NotImplementedException();
    }

    // event whent the client, want to disconnect from server
    private static void OnDisconnect(UserContext context)
    {
        throw new NotImplementedException();
    }

    // event, when client is sending some data
    private static void OnSend(UserContext context)
    {
        throw new NotImplementedException();
    }

    // event, when server receive data from client
    // client choose which room want to join and, we add cleint to list of lessons which he choose
    // another method ... Register, Rename, LogOff ...
    private static void OnReceive(UserContext context)
    {
        throw new NotImplementedException();
    }
}

课程等级:(房间)

    class Course
{
    // Every course has list of active users
    protected static ConcurrentDictionary<User, string> OnlineUsers = new ConcurrentDictionary<User, string>();

    // Name of course
    public String CourseName { get; set; }

}

用户等级:

    class User
{
    // Name of User
    public string Name = String.Empty;

    // UserContext  - Contains data we will export to the Event Delegates. 
    public UserContext Context { get; set; }
}

这对我的目的来说是个好结构吗?我有很多课程(房间),有一位老师,一门课程可以是 20 名学生的例子..在一门课程中,学生可以使用聊天(网络套接字)和绘图板与技术人员交谈..

4

2 回答 2

1

这就是我构建对象层次结构的方式:

聊天服务器应该有一个ChatRooms 列表。

每个都ChatRoom应该有一个ChatUsers 列表。

每个都ChatUser应该有一个或没有ChatRoom和一个出站套接字。

(这假设用户一次只在一个房间。允许多个房间会使事情变得更复杂一些)

这就是房间选择的工作方式:

当客户端连接时,ChatUser会创建一个。服务器做的第一件事是将聊天室列表发送给用户。然后,客户端用它想要加入的聊天室的名称进行响应。当该名称的聊天室不存在时,它会被创建并添加到房间的全局列表中。

然后将客户端添加到房间,并在客户端上设置房间。

这就是聊天的工作方式:

当用户的socket接收到聊天消息时,应该调用SendToAllClients用户当前所在房间的方法(当房间为空时,它应该向用户返回一个错误信息,用户必须先加入一个房间)。

然后房间的SendToAll方法应该调用SendToClient其用户列表中的所有用户。

然后该类的SendToClient方法会将聊天消息发送给客户端。

如何为每个用户扩展多个聊天室

要允许客户一次加入多个聊天室并在其中进行单独的对话,客户必须能够:

  • 随时请求房间列表,而不仅仅是在启动时
  • 随时加入房间,而不仅仅是在启动时
  • 离开房间
  • 发送消息时指定房间

这意味着客户端想要执行的操作无法从它当前所处的状态中推断出来。您需要将此信息添加到用户的消息中。例如,您可以将其用作前缀。像

!list

请求房间列表

!join:asdf

加入/创建房间 asdf

_asdf:Hello

将消息 Hello 发送到房间 asdf。

来自服务器的消息应该具有相似的前缀,以便客户端可以推断消息是房间列表还是聊天消息以及它来自哪个房间。

于 2012-12-10T14:04:20.860 回答
0

您应该尝试查看 SignalR for ASP.NET(例如:jabbr.net/)。这可能更有帮助和方便。

于 2012-12-10T14:19:20.353 回答