2014-11-03 2 views
0

Я подключаюсь к удаленному прослушивателю TCP, который получает строку и отвечает ответом.TCPClient - Send & Receive Response

Переход от моего приложения для Windows 8 Phone к Java Jar. Jar IS получает сообщение, но приложение Windows 8 Phone не получает ответа.

C# Код

outputClient.Connect (/IP ADDRESS/, /Port/); 

     using (Socket sock = outputClient.Client) { 
      sock.Send (UTF8Encoding.ASCII.GetBytes (broadcastMessage)); 

      var response = new byte[100]; 

      sock.Receive (response); 
      var str = Encoding.ASCII.GetString (response).Replace ("\0", ""); 
      Console.WriteLine ("[RECV] {0}", str); 
     } <-- JAVA CODE DOESN'T GET HIT UNTIL THIS LINE IS COMPLETED 

Java Code

String clientSentence; 
     ServerSocket socketServer = new ServerSocket(/* PORT */); 

     while (true) 
     { 
      Socket connectionSocket = socketServer.accept(); 
      connectionSocket.setKeepAlive(true); 

      BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream())); 
      clientSentence = inFromClient.readLine(); 

      BufferedWriter outToClient = new BufferedWriter(new OutputStreamWriter(connectionSocket.getOutputStream())); 

      if (clientSentence != null) 
      { 
       try 
       { 
        JsonObject json = new JsonParser().parse(clientSentence).getAsJsonObject(); 
        String un = json.get("Username").toString(); 
        String uuid = "2c9c79a096ef4d869fb1d1e07469bb41".replaceAll(           
          "(\\w{8})(\\w{4})(\\w{4})(\\w{4})(\\w{12})",        
          "$1-$2-$3-$4-$5"); 
        var val = /* Get val */ 

        String response = gson.toJson(val); 
        outToClient.write(response); 
        outToClient.newLine(); 
        outToClient.flush(); 
       } 
       catch (Exception ex) 
       { 
        ex.printStackTrace(); 
        outToClient.write(response); 
        outToClient.newLine(); 
        outToClient.flush(); 
       } 
      } 

      connectionSocket.close(); 
     } 

Чуть больше объяснений: JAVA КОД НЕ ПОЛУЧИТЬ ХИТ ПОКА ЭТА ЛИНИЯ НЕ ВЫПОЛНЕНО означает, что сокет, как представляется, не отправлять до используя (Socket sock = outputClient.Client) больше не используется.

+0

Что это значит: «JAVA КОД НЕ ПОЛУЧИТЬ ХИТ ПОКА ЭТА ЛИНИЯ НЕ ВЫПОЛНЕНО»? Как ваша программа C# могла получать какие-либо данные, если в этот момент Java-код не выполнялся? И почему ваш вопрос, похоже, указывает на то, что получение C# не завершено? Этот вопрос нуждается в большой очистке, так что это имеет смысл. Что касается кода C#, то одна основная ошибка, которую вы сделали, - не проверять количество байтов для приема. Более того, если вы используете TcpClient (как вам кажется), почему бы не получить из него NetworkStream и не включить StreamReader, как в Java-коде? –

+0

Я сделал быстрое редактирование, чтобы объяснить это дальше. –

+0

Извините, это не поможет. Если вы не установили сокет неблокирующимся, вы не сможете добраться до закрывающей скобки блока 'using', пока не будут получены некоторые данные, что не может произойти до тех пор, пока некоторые данные не будут отправлены. Невозможно, чтобы сторона Java не отправляла до тех пор, пока не дошла до закрывающего блока оператора 'using'. –

ответ

0

Я установил его, заменив код C# с:

using (TcpClient client = new TcpClient (/IP ADDRESS/, /PORT/)) 
     using (NetworkStream stream = client.GetStream()) 
     using (StreamReader reader = new StreamReader (stream)) 
     using (StreamWriter writer = new StreamWriter (stream)) { 
      writer.AutoFlush = true; 

      foreach (string lineToSend in linesToSend) { 
       Console.WriteLine ("Sending to server: {0}", lineToSend); 
       writer.WriteLine (lineToSend); 
       string lineWeRead = reader.ReadLine(); 
       Console.WriteLine ("Received from server: {0}", lineWeRead); 
       Thread.Sleep (2000); // just for effect 
      } 
      Console.WriteLine ("Client is disconnecting from server"); 
     } 
Смежные вопросы