2

私はC#にあまり熟練していませんが、宿題に使用しています。サーバーに接続されているクライアントのリストを他のクライアントに送信する関数を作成しました

private void SendListToClients()
    {
        Socket userSocket=null;
        string username = null;
        string role = null;
        foreach (User Users in UserList)
        {
            userSocket = Users.getSocket();
            username = Users.getUsername();
            role = Users.getRole();
            userSocket.Send(Encoding.ASCII.GetBytes("!ListStart\n"));
            for(int i=0;i<UserList.Count;i++)
            {
                User UsersControl = (User)UserList[i];
                string roleU = UsersControl.getRole();
                string usernameU = UsersControl.getUsername();

                userSocket.Send(Encoding.ASCII.GetBytes("!ClientList:"+usernameU + ":" + roleU+"\n"));       
            }

        }
    }

私の問題はuserSocket.Send()の行にあります。これをクライアント側で受信すると、(たとえばリスト内のユーザーが5の場合)5送信は受信されませんが、5ユーザーすべてで1送信されます。どうすればこれを解決できますか?そうでなければ、私のオブジェクト(UserList)をソケットを介して入力的に送信する可能性がありますか?

4

2 に答える 2

1

Socket.Receive メソッドのドキュメントから:

接続指向の Socket を使用している場合、Receive メソッドは、バッファのサイズまで、利用可能なデータをすべて読み取ります。

したがって、サーバーが一度に 5 つのメッセージを送信したとしても、それらはすべてクライアントの入力バッファーに格納され、一度に読み取られます。

于 2012-12-30T12:33:09.920 に答える
0

あなたが見ているのは設計によるものです。これがTCPの仕組みです。または、他の人が言うように、「TCP はメッセージ プロトコルではなく、ストリーム プロトコルです」。

簡単な要約: N バイトを「送信」したからといって、N バイトを「受信」するとは限りません。TCP は、アプリがその「送信」呼び出しをどのように構造化したかに関係なく、バイトをストリーミングします。受信側のコードは、すべての異なるサイズの受信バイト チャンクを処理できるように準備する必要があり、必ずしもアプリケーションのメッセージ サイズと同じブロックにする必要はありません。

于 2012-12-30T12:44:36.910 に答える