0

HTML5 websocket に基づいて、html5 Web マルチルーム チャットを作成したいと考えています。しかし、始めるには少し助けが必要です。

C# でサーバー側のコードを実行したいのですが、C# でマルチ ルームを使用してチャット Websocket サーバーを実行する方法のチュートリアルが見つかりません。

.net に既に実装されているサーバー、またはマルチ ルーム チャットに更新できるサーバーはありますか?

それは小さなプロジェクトで、10 人用の 1 つの部屋です。開始方法を教えていただけますか?

どうもありがとうございました !

コード構造の例を用意します。

メインサーバークラス:

    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();
    }
}

コースクラス: (ROOMS)

    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; }
}

それは私の目的のために良い構造ですか?私は多くのコース (部屋) を持っており、1 人の教師がいて、1 つのコースで 20 人の生徒を受け入れることができます..

4

2 に答える 2

1

それがオブジェクト階層を構築する方法です。

チャット サーバーには のリストが必要ChatRoomです。

それぞれChatRoomに のリストが必要ChatUserです。

それぞれChatUserに 1 つまたはまったくなくChatRoom、アウトバウンド ソケットが必要です。

(これは、ユーザーが一度に 1 つの部屋だけにいることを前提としています。複数の部屋を許可すると、状況が少し複雑になります)

部屋の選択は次のように機能します。

クライアントが接続すると、ChatUserが作成されます。サーバーが最初に行うことは、チャットルームのリストをユーザーに送信することです。次にクライアントは、参加したいチャットルームの名前で応答します。その名前のチャットルームが存在しない場合は、作成され、ルームのグローバル リストに追加されます。

その後、クライアントがルームに追加され、ルームがクライアントに設定されます。

チャットは次のように機能します。

ユーザーのソケットがチャット メッセージを受信するとSendToAllClients、ユーザーが現在いるルームのメソッドを呼び出す必要があります (ルームが null の場合、まずルームに参加する必要があるというエラー メッセージをユーザーに返す必要があります)。

ルームの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 に答える