2016-09-02 1 views
0

Ich habe einen Client (Windows app) und Server (Class-Datei) beide nicht Multi Threading implementieren. So, jetzt habe ich eins zu eins Verbindung funktioniert gut, aber wenn der zweite Client versucht, eine Verbindung herzustellen passiert nichts und wenn ich versuche zu kommunizieren, reagiert es.Wie Status als Server vom TCP-Server in c besetzt zu antworten #

Aber ich will diese Funktionalitäten:

Wenn der zweite Client versucht, den Server verbinden sollte Status als beschäftigt zweiten Client antworten. Ich möchte Code irgendwo in Server setzen, der den zweiten Klienten antwortet, indem er den Status des Servers überprüft.

Wie kann ich das erreichen?

bereitgestellt vollständigen Code unten zum besseren Verständnis: Server Code

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(); 
      } 
     } 

Client-Seite Code:

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; 
    } 

Antwort

2

, wenn Ihre Anwendung Single-Threaded ist, Sie etwas nicht reagieren während dieser eine Thread etwas anderes macht ...

Sie haben 2 Möglichkeiten:

a) Multithreading und einige andere Gewinde in Belegtzustand
b) reagiert, während nicht halten Ihr Gewinde in einer heißen Schleife: die am wahrscheinlichsten ist, was Sie

tun wollen

Sie können wollen, dies zu lesen: https://scatteredcode.wordpress.com/2013/04/29/creating-a-single-threaded-multi-user-tcp-server-in-net/

+0

Im Moment wird es akzeptiert zweiten Client sobald der erste Client getrennt ist. Dies wird erreicht, indem diese unendliche Schleife verwendet wird. Mein Zweifel ist, wenn der zweite Client versucht, zu verbinden, wird diese Zeile TcpClient tcpclient = tcplistener.AcceptTcpClient(); wird vom neuen Client überschrieben oder nicht, weil die unendliche While-Schleife noch läuft? –

+0

Ich würde mit "a" gehen. Erstellen Sie nach dem Akzeptieren eines Clients einen neuen Thread für diesen Client und starten Sie ihn. Auf diese Weise sind Sie fast sofort mit dem zweiten Client fertig. – FishySwede

+0

AcceptTcpClient() akzeptiert die Verbindung und gibt Ihnen das entsprechende Client-Objekt ... Wenn Sie etwas damit überschreiben, ist das Ihre Entscheidung ... Sie könnten es einfügen eine Sammlung, und regelmäßig überprüfen, ob einer der verbundenen Clients Daten hat .... – DarkSquirrel42

Verwandte Themen