2016-05-16 38 views
1

嗨,大家好,我已经为Android构建了一个应用程序来获得GPS协调,并且我想通过TCP将数据发送到我的C#UWP服务器。作为概念,我打开了一个套接字,我想发送多个消息而不关闭套接字。TCP发送多条消息而不关闭连接

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

问题是我只收到message1或有时也在服务器上的messages2。另一条消息不显示在服务器上。我不想建立新的连接,因为我打算发送很多消息。如果您有任何人知道解决方案,将不胜感激。

我目前在C#中使用UWP的服务器代码,从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

发布您的服务器代码也 – Eser

+0

感谢您的答复。我刚刚编辑我的文章,并把服务器代码。 – Skyx

回答

0

除了@Hasson关于读取所有行的内容之外,您应该确保正确地处理流(最好在StreamReader上使用using,并且可以在Stream上执行相同操作,但StreamReader处置也会关闭它)。它看起来像你的代码希望能够在一次调用中获得整个消息,所以如果你不想在每次ReadLineAsync之前使用while循环来检查reader.EndOfStream,你可以这样做:

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

我也有点担心这个班的用法。如果实例化一个新的Connection()的代码没有保留对它的引用,那么垃圾收集器将把它吞噬一下,你的服务器将不再监听。

举例来说,如果你有一个按钮,点击或页面加载做这样的事情:

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

如果没有一定的参考CONN维持,则该函数完成之后被称为,垃圾收集器会自动处理它和你的StreamSocketListener。

+0

while循环完成了这项工作。感谢Hasson和zfrank! – Skyx

0

你的服务器代码不正确,你必须保持阅读的SocketListener_ConnectionReceived直到有东西可读,但在这里,你正在阅读的只有一条线路,考虑增加一个while循环。这种循环有很多例子,例如here

相关问题