2016-05-16 3 views
1

Hallo Leute, ich habe eine App für Android gebaut, um die GPS-Koordination zu erhalten und ich möchte die Daten über TCP an meinen C# UWP-Server senden. Als Konzept habe ich einen Socket geöffnet und ich möchte mehrere Nachrichten senden, ohne den Socket zu schließen.TCP Mehrere Nachrichten senden, ohne die Verbindung zu schließen

socket = new java.net.Socket("192.168.2.10", 9999); 
printwriter = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true); 
printwriter.println("message1"); 
printwriter.println("message2"); 
printwriter.println("message3"); 
printwriter.println("message4"); 
printwriter.flush(); 

Das Problem ist, ich erhalte nur message1 oder manchmal auch messages2 auf dem Server. Die andere Nachricht wird nicht auf dem Server angezeigt. Ich möchte keine neue Verbindung herstellen, weil ich viele Nachrichten verschicken möchte. Wenn jemand von Ihnen weiß, dass eine Lösung wünschenswert wäre.

Ich verwende derzeit den Servercode für UWP in C# von https://msdn.microsoft.com/en-us/windows/uwp/networking/sockets.

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace Maps 
{ 

    class Connection 
    { 
     public async void Connectie() 
     { 
      try 
      { 
       System.Diagnostics.Debug.WriteLine("Waiting for connection................"); 

       //Create a StreamSocketListener to start listening for TCP connections. 
       Windows.Networking.Sockets.StreamSocketListener socketListener = new Windows.Networking.Sockets.StreamSocketListener(); 

       //Hook up an event handler to call when connections are received. 
       socketListener.ConnectionReceived += SocketListener_ConnectionReceived; 

       //Start listening for incoming TCP connections on the specified port. You can specify any port that' s not currently in use. 
       await socketListener.BindServiceNameAsync("9999"); 
       System.Diagnostics.Debug.WriteLine("Waiting for connection................"); 
      } 
      catch (Exception e) 
      { 
       //Handle exception. 
      } 
     } 

     private async void SocketListener_ConnectionReceived(Windows.Networking.Sockets.StreamSocketListener sender, 
    Windows.Networking.Sockets.StreamSocketListenerConnectionReceivedEventArgs args) 
     { 
      Stream inStream = args.Socket.InputStream.AsStreamForRead(); 
      StreamReader reader = new StreamReader(inStream); 
       reader = new StreamReader(args.Socket.InputStream.AsStreamForRead()); 
       System.Diagnostics.Debug.WriteLine("connection................"); 
       //Read line from the remote client. 
       string request = await reader.ReadLineAsync(); 
       System.Diagnostics.Debug.WriteLine(request);     
     } 
    } 
} 
+0

Post Ihren Server-Code auch – Eser

+0

Danke für die Antwort. Ich habe gerade meinen Post bearbeitet und den Servercode eingegeben. – Skyx

Antwort

0

Zusätzlich zu dem, was @Hasson über das Lesen aller Zeilen gesagt hat, sollten Sie sicherstellen, dass Sie den Stream ordnungsgemäß entsorgt haben (vorzugsweise mit einer Verwendung auf dem StreamReader, und Sie könnten das auch auf Stream tun, obwohl der StreamReader entsorgen würde es auch schließen). Es sieht so aus, als ob Ihr Code hofft, die gesamte Nachricht in einem Aufruf zu erhalten. Wenn Sie also keine while-Schleife verwenden möchten, die! Reader.EndOfStream vor jedem ReadLineAsync prüft, können Sie Folgendes tun:

using (Stream inStream = args.Socket.InputStream.AsStreamForRead()) 
using (StreamReader reader = new StreamReader(inStream)) 
{ 
    System.Diagnostics.Debug.WriteLine("connection................"); 
    //Read line from the remote client. 
    string request = await reader.ReadToEndAsync(); 
    System.Diagnostics.Debug.WriteLine(request); 
} 

Ich bin auch etwas besorgt über die Verwendung dieser Klasse. Wenn der Code, der eine neue Connection() instanziiert, keinen Verweis darauf verfügbar hält, verschlingt der Garbage Collector alles und Ihr Server hört nicht mehr zu.

Zum Beispiel, wenn Sie auf eine Schaltfläche klicken oder eine Seite zu laden, etwas zu tun, wie dies mit:

Connection conn = new Connection(); 
conn.Connectie(); 

Wo es nicht irgendeine Referenz Conn gehalten, dann danach Funktion wird getan genannt Der Garbage Collector entsorgt sie und Ihren StreamSocketListener automatisch.

+0

Die While-Schleife hat die Arbeit erledigt. Danke, Hasson und zfrank! – Skyx

0

Ihr Server-Code nicht korrekt ist, müssen Sie in der SocketListener_ConnectionReceived lesen Sie weiter, bis es nichts zu lesen, aber hier gibt es nur eine Zeile lesen, denken über eine while-Schleife hinzugefügt wird. Es gibt viele Beispiele für diese Art von Schleife, zum Beispiel here.