Отправка данных из Java в C с использованием программирования сокетов

Я делаю программу, которая отправляет строку от клиента Java на сервер C, используя WinSock2. Я использую DataOutputStream для отправки данных через сокет.

Сервер C подтверждает полученные байты, но когда я пытаюсь получить доступ к данным, ничего не отображается.

СЕРВЕР

Socket socket = null;
    DataOutputStream dataOutputStream = null;
    DataInputStream dataInputStream = null;
 try {
  socket = new Socket("10.40.0.86", 2007);
  dataOutputStream = new DataOutputStream(socket.getOutputStream());
  dataInputStream = new DataInputStream(socket.getInputStream());
  //dataOutputStream.writeUTF("How are you doing let us see what is the maximum possible length that can be supported by the protocal");
  String line = "hey";
  dataOutputStream.writeUTF(line);
  dataOutputStream.flush();

  //System.out.println(dataInputStream.readLine());
  System.out.println((String)dataInputStream.readLine().replaceAll("[^0-9]",""));
  //System.out.println(dataInputStream.readInt());
  //System.out.println(dataInputStream.readUTF());
 } catch (UnknownHostException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
 } catch (IOException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
 }

КЛИЕНТ

if (socket_type != SOCK_DGRAM)
            {
                retval = recv(msgsock, Buffer, sizeof(Buffer), 0);
                printf("Server: Received datagram from %s\n", inet_ntoa(from.sin_addr));

            }

вывод

Server: Received 5 bytes, data "" from client
BUFFER :
Server: Echoing the same data back to client...
BUFFER :
Server: send() is OK.

person user761968    schedule 20.05.2011    source источник


Ответы (2)


Ваш код C должен понимать формат данных, записанный с помощью writeUTF () (см. Javadoc), или, проще говоря, вам нужно использовать write (char []) или write (byte []) в конце Java.

person user207421    schedule 20.05.2011
comment
Правильный! Java отправляет 16-битный UNICODE x'0048 ', программа C ожидает 7-битный ASCII (или, что более вероятно, некоторая 8-битная кодировка Windows). printf интерпретирует первый байт x'00 'как конец строки. - person James Anderson; 20.05.2011
comment
@ Джеймс Андерсон: Неверно. Java отправляет двухбайтовый префикс, за которым следуют символы в модифицированном формате UTF-8: download.oracle.com/javase/6/docs/api/java/io/DataInput.html. См. Javadoc. - person user207421; 20.05.2011

Вот как я это решил :-)

dataOutputStream.write(line.getBytes());

Или, если быть более конкретным, вот мой код:

out.write(("Hello from " + client.getLocalSocketAddress()).getBytes());
person Muhammad Farag    schedule 20.11.2013