2015-03-25 9 views
0

У меня есть два приложения, одно из которых написано на Java, а другое - на C#. Я пытаюсь отправить строку из приложения Java в приложение C#.Сокет, связанный между приложениями java и C#

Мой Java-код для отправки строки выглядит следующим образом:

String response; 
try { 
    DataOutputStream outToServer = 
     new DataOutputStream(outGoingSocket.getOutputStream()); 
    BufferedReader inFromServer = 
     new BufferedReader(new InputStreamReader(outGoingSocket.getInputStream())); 

    outToServer.writeBytes(message + '\n'); 
    outToServer.flush(); 

    response = inFromServer.readLine(); 

    System.out.println("Received: " + response);   
} catch (Exception ex) { 
    System.err.println("Exception in incoming socket: " + ex.getMessage()); 
} 

Мой C# код для получения данных выглядит следующим образом:

Byte[] bytes = new Byte[1000]; 
String data = null; 
try { 
    Console.Write("Waiting for a connection... "); 
    TcpClient client = incomingSocket.AcceptTcpClient(); 
    Console.WriteLine("Connected!"); 

    data = null; 
    NetworkStream stream = client.GetStream(); 

    int i; 
    while (true) { 
     while ((i = stream.Read(bytes, 0, bytes.Length)) != 0) { 
      data = System.Text.Encoding.ASCII.GetString(bytes, 0, i); 
      Console.WriteLine("Received:", data); 
      processReceivedMessage(data); 
      ackSocket(stream, "OK"); 
     } 
    } 
} catch (Exception ex) { 
    Console.WriteLine("Exception: ", ex); 
} 

У меня есть проблема с получением данных в C#. Когда я посылаю строку «Data» в приложении Java, и попытаться распечатать данные, полученные с помощью приложения C# с использованием Console.WriteLine("Received: {0}", data), выход:

Received: D 
Received: ata 

Если я использую Console.WriteLine("Received: ", data), выход:

Received: 
Received: 

Я хочу, чтобы мое приложение C# получало полную строку, отправленную приложением Java. Я попытался увеличить размер байтового массива буфера до 1000, но это не помогает. У меня нет опыта использования сокетов, может кто-нибудь показать мне, что я сделал неправильно?

+0

Hi @spender, пожалуйста, оставьте свои комментарии как ответ, чтобы я мог его принять, большое спасибо за StreamReader – Xitrum

+0

Да, я, кажется, трачу много времени на отправку ответов в комментариях ... Перемещали все в ответьте за вас. – spender

ответ

2

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

Вы не должны пытаться изменить это поведение ... это факт сетевого программирования. Это ваша задача снова приклеить их обратно.

«Я хочу, чтобы мой C# приложение получить полную строку»

Итак, как ваше получающее приложение означало знать, что он получил полную строку? Вы отправили поле длины, чтобы указать, сколько данных идет? Возможно, вы ожидаете \ n указать конец сообщения? Нулевой байт?

Если ваш терминатор действительно является символом новой строки, вам может потребоваться передать ваш NetworkStream на номер StreamReader и позвонить по телефону ReadLine. Теперь StreamReader будет продолжать чтение из потока до тех пор, пока он не достигнет новой строки, а затем передаст вам линию.

Смежные вопросы