-1

2 つの異なるクライアントからの接続を受け入れる基本的な C# TCP コンソール サーバーを作成しています。その後、サーバーは 2 つのクライアントが接続した後にメッセージを受信できる必要があります。これは、接続が終了するまで続けられる必要があります。これまでのところ、クライアントにメッセージを送信することはできますが、2 つのクライアントが同時にサーバーと通信することに問題があります。ここにいくつかのスレッドを追加する必要があると確信していますが、私はそれが初めてなので、それを機能させる方法がわかりません。そこで助けが必要です。

string str1 = "";
            string str2 = "";
            Socket soc1;
            Socket soc2;
            NetworkStream straumur1;
            NetworkStream straumur2;
            BinaryReader lesari1;
            BinaryReader lesari2;
            BinaryWriter skrifari1;
            BinaryWriter skrifari2;
            IPAddress ipTala = IPAddress.Parse("127.0.0.1");
            TcpListener hlustari = new TcpListener(ipTala, 50000);
            Lesa lesa = new Lesa();
            hlustari.Start();


            //Notandi 1 tengist
            soc1 = hlustari.AcceptSocket();
            straumur1 = new NetworkStream(soc1);
            skrifari1 = new BinaryWriter(straumur1);
            lesari1 = new BinaryReader(straumur1);
            skrifari1.Write("Leikmaður 1");
            Console.WriteLine(">> Leikmaður 1 tengdist");

            //Notnadi 2 tengist
            soc2 = hlustari.AcceptSocket();
            straumur2 = new NetworkStream(soc2);
            skrifari2 = new BinaryWriter(straumur2);
            lesari2 = new BinaryReader(straumur2);
            skrifari2.Write("Leikmaður 2");
            Console.WriteLine(">> Leikmaður 2 tengdist");

            do //this is the part that needs fixing.
            {
                str1 = lesari1.ReadString();
                skrifari1.Write(str1);
                Console.WriteLine(str1);
            } while (true);

            do
            {
                str2 = lesari2.ReadString();
                skrifari2.Write(str2);
                Console.WriteLine(str2);
            } while (true);
4

1 に答える 1

0

最初の BinaryReader で無限ループすることにより、実行フローをブロックしました。単純なアプローチは、それらを異なるスレッドでループし、メインスレッドから両方を待機することです。現在、Visual Studio にアクセスできませんが、次のような方法でうまくいく可能性があります。

//create the threads with an anonymous method (you may extract them to named methods, if you prefer)
Thread t1 = new Thread(new ThreadStart(()=>{
    do //this is the part that needs fixing.
        {
            str1 = lesari1.ReadString();
            Console.WriteLine(str1);
        } while (true);
    }
   ));

 Thread t2 = new Thread(new ThreadStart(()=>{
    do //this is the part that needs fixing.
        {
            str2 = lesari2.ReadString();
            Console.WriteLine(str2);
        } while (true);
    }
   ));

  t1.Start(); //start threads
  t2.Start();
  t1.Join(); //wait for them to finish
  t2.Join();

繰り返しますが、タイプミスや命名エラーがあるかどうかはわかりませんが、このようなものがうまくいきます. また、共有データ (両方のスレッドからアクセスできるオブジェクト) にアクセスするときは常に、競合状態にならないように注意してください。これは、.NET スレッド化に関するすばらしいチュートリアル/リソースです: http://www.albahari.com/threading/

于 2012-12-01T13:25:01.103 に答える