2017-01-09 10 views
1

Ich habe die folgenden paar Videos zum Erstellen einer TCP/IP-Verbindung angeschaut: Server und Client Was ich tun muss, ist ein Spiel (Flipcard) in erstellen Ich sende nur 2 Koordinaten für eine Matrix. Nichts mehr. Oder weniger.TCP/IP Kontinuierlich Nachricht empfangen, ohne die Verbindung zu schließen

(der Code folgt)

Von dem, was ich beobachtet habe, er schließt und wieder öffnet die Verbindung, jedes Mal wenn er eine Nachricht senden. Es funktioniert. Aber was kann ich in den Code ändern, um die Verbindung offen und zu erkennen, wenn eine Nachricht eintraf?

Alle meine Google-Suche brachte mich auf diese zwei Methoden:

  1. I have had luck using the socket object directly (rather than the TCP client). (Aber ich will nicht Steckdosen verwenden)
  2. Also uses sockets

Wenn ich das starten klicken Server

 private void bStartServer_Click(object sender, EventArgs e) 
    { 
     Thread tcpServerRunThread = new Thread(new ThreadStart(TCPServerRun)); 
     tcpServerRunThread.Start(); 
    } 

Server läuft und wartet auf eine Verbindung

private void TCPServerRun() 
    { 
     TcpListener tcpListener = new TcpListener(IPAddress.Any, 2016); 
     tcpListener.Start(); 
     updateUI("Listening"); 
     while (true) 
     { 

      TcpClient client = tcpListener.AcceptTcpClient(); 
      updateUI("Connected"); 
      Thread tcpHandlerThread = new Thread(new ParameterizedThreadStart(tcpHandler)); 
      tcpHandlerThread.Start(client); 
     } 
    } 

Ich behandle meine Botschaft

private void tcpHandler(object client) 
    { 
     TcpListener tcpListener = new TcpListener(IPAddress.Any, 5004); 
     TcpClient mClient = (TcpClient)client; 
     NetworkStream stream = mClient.GetStream(); 
     byte[] message = new byte[1024]; 
     stream.Read(message,0, message.Length); 
     updateUI("New message = " + Encoding.ASCII.GetString(message)); 
     stream.Close(); 
     mClient.Close(); 
    } 

HINWEIS: updateUI eine Funktion, die durch ihn zu aktualisieren, ein ListBox Artikel

gemacht ist Client-Seite - fast wie die Serverseite `private void button1_Click (Objekt Absender, EventArgs e) { Thread mThread = neuer Thread (neuer ThreadStart (ConnectAsClient)); mThread.Start(); }

private void ConnectAsClient() 
    { 
     //     aici putem inlocui cu adresa de IP dorita    
     //client.Connect(IPAddress.Parse(textBox.Text), 5004); 
     client = new TcpClient(); 
     //client.Connect(IPAddress.Parse("127.0.0.1"), 2016);  // for when I'm not connected to network 
     client.Connect(IPAddress.Parse("my_ip_here"), 2016); // for when I am connected to the network 
     updateUI("connected"); 
     NetworkStream stream = client.GetStream(); 
     string s = "Hello world!"; 
     byte[] message = Encoding.ASCII.GetBytes(s); 
     stream.Write(message, 0, message.Length); 
     this.updateUI("Message sent!"); 
     stream.Close(); 
     // client.Close(); 
    }` 

Wenn ich mich nicht falsch, verbindet jedes Mal er wieder schafft er eine neue Verbindung, und die alten nicht öffnen, nicht wahr? (Es ist mein erstes Mal, TCP/IP, auf meinem eigenen Lernen, so dass ich lieber nicht Sockets verwenden, wenn möglich)

----------------- -------------------------------------------------- ----

Voll Link zu meinem Code (slighty von den am Anfang vorgesehen Videos modifiziert):

  1. TCPClient
  2. TCPServer
+0

Sie müssen es nicht schließen. aber wenn ich mich recht erinnere, müssen Sie eine Antwortnachricht an den Client senden, bevor Sie die nächste Nachricht empfangen können – Steve

Antwort

0

Sie werden jedes Mal neu verbunden, wenn Sie die Nachricht senden. Verwenden Sie zwei verschiedene Methoden dafür; eine für die Verbindung mit dem Server und eine weitere für das Senden der Nachricht.Wie so:

TcpClient client; 
private void ConnectAsClient() 
{   
    //client.Connect(IPAddress.Parse(textBox.Text), 5004); 
    client = new TcpClient(); 
    //client.Connect(IPAddress.Parse("127.0.0.1"), 2016); 
    client.Connect(IPAddress.Parse("my_ip_here"), 2016); 
    updateUI("connected"); 
} 
void SendMessage() 
{ 
    NetworkStream stream = client.GetStream(); 
    string s = "Hello world!"; 
    byte[] message = Encoding.ASCII.GetBytes(s); 
    stream.Write(message, 0, message.Length); 
    this.updateUI("Message sent!"); 
} 
+0

Und wie erkenne ich, wenn meine Nachricht angekommen ist? – SnuKies

+0

in der "tcpHandler" -Methode ist bereits eingerichtet. Es wird in der Zeile "stream.Read (...") einfrieren, bis es eine Nachricht erhält. –

Verwandte Themen