0

私はマルチ スレッド サーバーと C# で記述されたクライアントに取り組んでいます。そのため、マルチ クライアント用にサーバーでマルチ スレッドを作成する方法を教えてください。


これは私のサーバーコードです

class Program
            {
                static byte[] Buffer
                {

                    get; 
                    set; 
                }
                static void Main(string[] args)
                {
                    Program obj = new Program();
                    Console.WriteLine("Server");
                    obj.server_reciver();


                }
              static Socket sck;

                public void server_reciver()
                {
                    try
                    {
                        sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                        IPEndPoint localEndPoint;
                        localEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.2"), 1);
                        sck.Bind(localEndPoint);

                        sck.Listen(100);
                        while (true)
                        {
                            Socket accepted = sck.Accept();
                            // Buffer = new byte[accepted.ReceiveBufferSize];
                            Buffer = new byte[accepted.SendBufferSize];
                            int bytesRead = accepted.Receive(Buffer);

                            byte[] formatted = new byte[bytesRead];

                            //for (int i = 0; i < bytesRead; i++)
                            for (int i = 0; i < bytesRead; i++)
                            {
                                formatted[i] = Buffer[i];
                                //Console.WriteLine(Buffer[i] + "\r\n");
                            }
                            //string strData = Encoding.ASCII.GetString(Buffer);
                            string strData = Encoding.ASCII.GetString(formatted);
                            Console.Write("From Client=>" + strData + "\n");
                            Console.WriteLine("Enter the text:");
                            string data = Console.ReadLine();
                            byte[] reply = Encoding.ASCII.GetBytes(data);
                            accepted.Send(reply);
                            //accepted.Close();
                            accepted.Close();
                        }


                        sck.Close();
                        Console.Read();

                    }
                    catch (Exception ex)
                        {

                        }
                }

            }

これは私のクライアント側であり、ここで複数のクライアントを作成します。

class Program
                {
                    static byte[] Buffer
                    {

                        get;
                        set;
                    }

                    static Socket sck;
                    static void Main(string[] args)
                    {

                        Program obj = new Program();
                        obj.client_send();
                    }

                    public void client_send()
                    {
                        while (true)
                        {
                            sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);


                            IPEndPoint localEndPoint;
                            localEndPoint = new IPEndPoint(IPAddress.Parse("182.188.247.244"), 1);
                            //localEndPoint = new IPEndPoint(IPAddress.Parse("192.168.1.45"), 1);
                            try
                            {
                                sck.Connect(localEndPoint);

                            }
                            catch
                            {
                                Console.Write("Unable to connect to remote end point!\r\n");
                                //Main(args);
                            }

                            try
                            {
                                Console.Write("Enter Text: ");
                                string text = Console.ReadLine();
                                byte[] data = Encoding.ASCII.GetBytes(text);
                                sck.Send(data);

                                Buffer = new byte[sck.SendBufferSize];
                                int bytesRead = sck.Receive(Buffer);

                                byte[] formatted = new byte[bytesRead];


                                for (int i = 0; i < bytesRead; i++)
                                {
                                    formatted[i] = Buffer[i];
                                    //Console.WriteLine(Buffer[i] + "\r\n");
                                }
                                string strData = Encoding.ASCII.GetString(formatted);
                                Console.Write("From Server=>" + strData + "\n");

                                sck.Close();
                            }
                            catch(Exception )
                            {

                            }
                        }

                        Console.ReadLine();
                    }
                }
4

1 に答える 1

0

通常、Socket accepted = sck.Accept();メイン スレッドを維持しますが、要求を受信すると、それをサービスのために別のスレッドに渡します。これにより、メイン スレッドを別の着信要求にリストできます。ThreadPool.QueueUserWorkItem作業をバックグラウンド スレッドに移動するために使用できます。応答はコンソールから読み取られるため、マルチスレッド化すると問題が発生することに注意してください。各ワーカー スレッドは、正しいデータを取得したことをどのように認識していますか? しかし、それを実際のサーバーロジックに置き換えると思います。

ある時点で、これがスケーリングしないことに気付くかもしれません。ブロック IO 呼び出し ( Sendand Receive) を使用しているため、スレッドは待機に多くの時間を費やします。ノンブロッキング IO が理想的ですが、書くのはもっと複雑です。

于 2013-07-18T15:19:39.350 に答える