【问题标题】:Programing HTML5 websocket chat with rooms用房间编程 HTML5 websocket 聊天
【发布时间】:2012-11-27 20:16:31
【问题描述】:

我想创建基于 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 名学生的例子..在一门课程中,学生可以使用聊天(网络套接字)和绘图板与技术人员交谈..

【问题讨论】:

  • 是的 alchemywebsockets,看起来不错。它也有聊天应用程序的示例,如果我想进行多房间聊天怎么办?我需要更新什么?谢谢你!
  • 不要指望我们为您编写代码。继续努力,如果你在某个地方遇到困难,stackoverflow 可以为您提供帮助。
  • 对不起,我不想要你的代码..我的英语不好,所以可能看起来像你写的..但我只想知道如何解决这个问题,因为我不知道我必须从哪里开始编程.. 我搜索有关他的问题的主题,但我没有找到任何好的解决方案如何做到这一点。因此,如果您能从理论上帮助我从多房间聊天开始需要什么,我将非常感激。

标签: c# asp.net html websocket


【解决方案1】:

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

【讨论】:

  • 链接已失效。
【解决方案2】:

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

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

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

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

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

这就是房间选择的工作原理:

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

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

这就是聊天的方式:

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

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

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

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

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

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

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

!list

请求房间列表

!join:asdf

加入/创建房间 asdf

_asdf:Hello

将消息 Hello 发送到房间 asdf。

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

【讨论】:

  • 是的,这就是我需要的。非常感谢菲利普。关于客户,我的想法是,创建技术应用程序,其中讲师有自己的课程。班级人数约为 20 人,讲师将有一个板(HTML5 画布)和当前班级的聊天。问题是客户可以同时上两节课,做什么会更好?我认为这没有意义。所以他需要注销当前课程。因此,一位客户一次只能访问一堂课。你认为这是一个好的解决方案吗?
  • 所以对我来说聊天室是一个老师有板子的课,它使用websocket与学生(客户)共享板子,每节课都有可能聊天。你认为 Alchemy Websockets 服务器是我服务器端架构的良好基础吗?
  • 关于炼金术:不知道,没用过。
猜你喜欢
  • 1970-01-01
  • 2017-12-06
  • 1970-01-01
  • 1970-01-01
  • 2015-06-14
  • 2011-11-18
  • 2011-03-25
  • 1970-01-01
  • 2020-12-15
相关资源
最近更新 更多