如何在c#

时间:2016-09-02 12:20:00

标签: c# serversocket

我有一个客户端(Windows应用程序)和服务器(类文件)都没有实现多线程。 所以现在我有一对一连接工作正常,但当第二个客户端尝试连接时没有任何反应,当我尝试通信它没有响应。

但我想要这个功能:

当第二个客户端尝试连接服务器时,应将状态回复为第二个客户端。我想把代码放在服务器中,通过检查服务器的状态来回复第二个客户端。

我怎样才能做到这一点?

提供以下完整代码以便更好地理解: 服务器代码

enum ServerStatus { Available, Busy };
    static void Main(string[] args)
    {
        TcpListener tcplistener = null;
        ServerStatus serverstatus = ServerStatus.Available;
        try
        {
            tcplistener = new TcpListener(IPAddress.Parse("127.0.0.1"), 4000);
            tcplistener.Start();
            Console.WriteLine("Server socket started at 127.0.0.1 and port no: 4000");
            Console.WriteLine("Server is " + serverstatus + " and waiting for a client to connect....");
            while (true)
            {
                TcpClient tcpclient = tcplistener.AcceptTcpClient();
                serverstatus = ServerStatus.Busy;
                Console.WriteLine(" >> " + "New client connection started and server is " + serverstatus);
                StreamReader streamreader = new StreamReader(tcpclient.GetStream());
                StreamWriter streamwriter = new StreamWriter(tcpclient.GetStream());
                String datafromclient = String.Empty;
                String datatoclient = String.Empty;
                while (!(datafromclient = streamreader.ReadLine()).Equals(String.Empty))
                {
                    int number;
                    if (int.TryParse(datafromclient, out number))
                    {
                        datatoclient = (Convert.ToInt16(datafromclient) * Convert.ToInt16(datafromclient)).ToString();
                        Console.WriteLine("From client -> " + datafromclient + "   To client -> " + datatoclient);
                        streamwriter.WriteLine(datatoclient);
                        streamwriter.Flush();
                    }
                    else if (datafromclient == "End connection")
                    {
                        streamreader.Close();
                        streamwriter.Close();
                        serverstatus = ServerStatus.Available;
                        Console.WriteLine("Server is back to " + serverstatus + " and waiting for a client to connect....");
                        break;
                    }
                    else
                    {
                        streamwriter.WriteLine("Number not valid.");
                        streamwriter.Flush();
                    }
                }
            }
        }
        catch (Exception exception)
        {
            Console.WriteLine(exception);
        }
        finally
        {
            if (tcplistener != null)
            {
                tcplistener.Stop();
            }
        }

客户端代码:

private void button1_Click(object sender, EventArgs e)
    {
        try
        {
            tcpclient = new TcpClient("127.0.0.1", 4000);
            if (tcpclient != null)
            {
                label1.Text = "Connected to server";
                textBox1.Enabled = true;
                button1.Enabled = false;
                button2.Enabled = true;
                button3.Enabled = true;
                streamreader = new StreamReader(tcpclient.GetStream());
                streamwriter = new StreamWriter(tcpclient.GetStream());
            }
        }
        catch (Exception exception)
        {
            MessageBox.Show(exception.Message);
        }
    }

    private void button2_Click(object sender, EventArgs e)
    {
        int number;
        if (int.TryParse(textBox1.Text, out number))
        {
            streamwriter.WriteLine(textBox1.Text);
            streamwriter.Flush();
            textBox2.Text = textBox2.Text + "To server -> " + textBox1.Text + "     From server -> " + streamreader.ReadLine() + Environment.NewLine;
        }
        else
        {
            MessageBox.Show("Enter valid number.");
        }
    }

    private void button3_Click(object sender, EventArgs e)
    {
        streamwriter.WriteLine("End connection");
        streamwriter.Flush();
        streamreader.Close();
        streamwriter.Close();
        tcpclient.Close();
        label1.Text = "Disconnected to server";
        textBox1.Text = "";
        textBox2.Text = "";
        textBox1.Enabled = false;
        button1.Enabled = true;
        button2.Enabled = false;
        button3.Enabled = false;
    }

1 个答案:

答案 0 :(得分:2)

如果您的应用程序是单线程的,那么当一个线程正在执行其他操作时,您无法响应某些内容......

你有两个选择:

a)多线程,并且在忙碌状态下有一些其他线程响应 b)不要让你的线程处于热循环中:这很可能是你想做的事情

您可能希望阅读此内容:https://scatteredcode.wordpress.com/2013/04/29/creating-a-single-threaded-multi-user-tcp-server-in-net/