1

スレッドとソケットを使用して、サーバーと複数のクライアント用のコードを作成しました。通常、クライアントは「exit」キーワードをサーバーに送信して終了しますが、クライアントが「exit」キーワードをサーバーに送信せずに強制的に終了した場合、たとえばサーバーにメッセージを送信している最中にユーザーが十字ボタンを押した場合など、サーバーに状況を検出させたいクライアント ウィンドウの。私が望むのは、サーバーがこの状況を検出し、何らかのエラー コードを表示し、接続されている他のクライアントからメッセージを受信し続けることです。

2番目の問題は、複数のクライアントが接続されている場合でも、サーバーを切断する方法です。私のコードでは tcpListener.Stop() を使用していますが、このメソッドを使用すると、「server failed to start at ipaddress」というエラー メッセージが表示され、そのようなウィンドウを開く数は、サーバーがリッスンしているクライアントの数と同じです。たとえば、サーバーが 1000 のクライアントをリッスンしている場合、1000 のウィンドウが開き、前述のエラー メッセージが表示されます。では、どうすればこの状況に対処できますか? また、この状況で、クライアントがサーバーへのメッセージの送信を再度開始すると、サーバーを切断したにもかかわらず、メッセージの受信も開始されます。ユーザーがサーバーを再起動するまで、サーバーは切断されたままにする必要があります。

以下は、サーバー用の私のコードです。

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
    // Constants IP address of server and maximum number of clients server can connect.
    static class Constants
    {
        public const string IP = "127.0.0.1";
        public const int No_Of_Clients = 2;
    }

    // server port number
    int port_number;

    static IPAddress ipAddress = IPAddress.Parse(Constants.IP);

    TcpListener tcpListener;

    public Form1()
    {
        InitializeComponent();
        button1.Click += button1_Click;
        button2.Click += button2_Click;
        //this.FormClosing += Form1_FormClosing;
    }

    //Socket socketForClient;
    private void button1_Click(object sender, EventArgs e)
    {
        if (String.IsNullOrEmpty(textBox1.Text.Trim()))
        {
            System.Windows.Forms.MessageBox.Show("Port Number Empty", "Error");
        }
        else
        {
            port_number = int.Parse(textBox1.Text);
            createserver(Constants.No_Of_Clients);
            serveripaddress();
            infoBox1.Text = string.Format("The server is now listening at port {0} at ip address {1}", port_number, Constants.IP);
            infoBox1.Text = infoBox1.Text + "\r\n" + string.Format("The server can listen to maximum {0} number of clients", Constants.No_Of_Clients);
        }
    }

// this code disconnects the server
    private void button2_Click(object sender, EventArgs e)
    {
        try
        {
            tcpListener.Stop();
        }
        catch (Exception f)
        {
            MessageBox.Show(f.Message);
        }
    }

    public void serveripaddress()
    {
        serverip.Text = "Server IP : " + Constants.IP;
        //serverport.Text = "Port Number : " + port.ToString();
    }

    // Starts server
    private void createserver(int no_of_clients)
    {
        tcpListener = new TcpListener(ipAddress, port_number);
        tcpListener.Start();

        for (int i = 0; i < no_of_clients; i++)
        {
            Thread newThread = new Thread(new ThreadStart(Listeners));
            newThread.Start();
        }
    } // end of createserver();

//listen to client receiving messages     
public void Listeners()
    {
        Socket socketForClient;
        try
        {
            socketForClient = tcpListener.AcceptSocket();
        }
        catch
        {
            System.Windows.Forms.MessageBox.Show(string.Format("Server failed to start at {0}:{1}", Constants.IP, port_number), "Error");
            return;
        }

        if (socketForClient.Connected)
        {
            //System.Windows.Forms.MessageBox.Show("hello");
            string string1 = string.Format("Client : " + socketForClient.RemoteEndPoint + " is now connected to server.");
            infoBox1.Text = infoBox1.Text + "\r\n" + string1;
            NetworkStream networkStream = new NetworkStream(socketForClient);
            System.IO.StreamWriter streamWriter = new System.IO.StreamWriter(networkStream);
            System.IO.StreamReader streamReader = new System.IO.StreamReader(networkStream);
            string theString = "";
            while (true)
            {
                try
                {
                    theString = streamReader.ReadLine();
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.Message);

                }
               // if (streamReader.ReadLine() == null )
                //{
                  //  System.Windows.Forms.MessageBox.Show(string.Format("Server failed to start at {0}:{1}", Constants.IP, port_number), "Error");
               // }
                    if (theString != "exit")
                {
                    textBox2.Text = textBox2.Text + "\r\n" + "-----------------------------------------------------------------------------------";
                    string string2 = string.Format("Message recieved from client(" + socketForClient.RemoteEndPoint + ") : " + theString);
                    textBox2.Text = textBox2.Text + "\r\n" + string2;

                    // ASCII code for the message from client
                    string string3 = string.Format("ASCII Code for message is : ");
                    textBox2.Text = textBox2.Text + "\r\n" + string3;
                    string string4 = "";
                    foreach (char c in theString)
                    {
                        string4 += string.Format(System.Convert.ToInt32(c) + " ");

                    }
                    textBox2.Text = textBox2.Text + string4;

                    // Hex value of message from client
                    string hex = "";
                    foreach (char c in theString)
                    {
                        int tmp = c;
                        hex += String.Format("{0:x2}", (uint)System.Convert.ToUInt32(tmp.ToString()));
                    }
                    string string5 = string.Format("Hex Code for the message from client : " + hex);
                    textBox2.Text = textBox2.Text + "\r\n" + string5;

                    //sending acknowledgement to client
                    try
                    {
                        socketForClient.Send(new ASCIIEncoding().GetBytes("The string was recieved from Client(" + socketForClient.RemoteEndPoint + ") : " + theString));
                    }
                    catch (Exception e)
                    {
                        MessageBox.Show(e.Message);
                    }
                } // end of if loop

                // if exit from client
                else
                {
                    string string7 = string.Format("Client " + socketForClient.RemoteEndPoint + " has exited");
                    infoBox1.Text = infoBox1.Text + "\r\n" + string7;
                    break;
                }

            } // end of  while loop

            streamReader.Close();
            networkStream.Close();
            streamWriter.Close();

        } // end of if loop

        socketForClient.Close();

    }
}
} 
4

1 に答える 1