0

クライアントからサーバーにメッセージを送信し、実際に多くのクライアントを同時に接続することができました。しかし、私がやりたいことは、つまり、2 つのクライアントを接続して、それらの間でチャットさせることです。そして、3 番目のクライアントが接続すると、そのクライアントは他の両方のクライアントとチャットを開始します。

今では、クライアント -> サーバー -> クライアントと別の c->s->c とは別にチャットする段階にあります。何が起こるか - client1 を実行すると、すべて問題ありません。次に、client2 を実行するとすべて問題ありませんが、1 番目のクライアントが動作を停止し、2 番目のクライアントで取得した最初のメッセージが、client1 から送信した最後のメッセージになります (ただし、実際にはサーバーから返信されませんでした)。 )。したがって、ストリームに問題があると思います-2つのクライアントが何らかの形でお互いのストリームを取得するということです。サーバーの一部 (関連するもの) は次のとおりです。

HandleClientComm(object client)は送受信操作を処理しています。

そして、送受信操作を処理するクライアント側のコード部分は次のとおりです。

そして、私 An unhandled exception of type 'System.OutOfMemoryException' occurred...はサーバーに 入るByte[] bData = new Byte[BitConverter.ToInt32(bSize, 0)];

すっごく...ええ、ストリームに何か問題があります(私の意見では)。しかし、サーバーがクライアントのスレッドを正しく区別する方法がよくわかりません。

私はどんな提案も受け付けています。

PSコードが長くなりすぎるため、ここにコードを直接投稿することはしません。

4

1 に答える 1

1

これは の最初の部分ですHandleClientComm():

private void HandleClientComm(object client)
{
    TcpClient tcpClient = (TcpClient)client;
    NetworkStream stm = clientList[n].GetStream();
    msg = new TheMessage();

tcpClientパラメータとして送信したクライアントである がありますが、はそのクライアント用でNetworkStreamはなく 用であり、クラス全体の変数です。そのメソッドの後半で、ループ内で次を使用します。clientList[n]nwhile

    stm = clientList[n].GetStream();

を増やすとすぐに、n実行中のすべてのスレッドHandleClientComm()が最後のクライアントとの間でメッセージを送受信します。

で使用NetworkStreamするは代わりにHandleClientComm()から作成する必要があるため、実行中の各スレッドは独自のクライアントにサービスを提供します。tpcClientHandleClientComm()

    stm = theClient.GetStream();
于 2013-04-29T07:31:07.573 に答える