#java #c #sockets #winsock2 #dataoutputstream
#java #c #сокеты #winsock2 #dataoutputstream
Вопрос:
я создаю программу, которая отправляет строку из клиента 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 %sn", 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.
Ответ №1:
Ваш код на C должен понимать формат данных, записанный с помощью writeUTF() (см. Javadoc), или, проще говоря, вам нужно использовать write(char[]) или write(byte[]) в конце Java.
Комментарии:
1. Правильно! Java отправляет 16-битный ЮНИКОД x ‘0048’, программа C ожидает 7-битный ASCII (или, что более вероятно, некоторую 8-битную кодировку Windows). printf интерпретирует первый байт x’00’ как конец строки.
2. @Джеймс Андерсон: Неверно. Java отправляет префикс длиной в два байта, за которым следуют символы в модифицированном формате UTF-8: download.oracle.com/javase/6/docs/api/java/io/DataInput.html . Смотрите Javadoc.
Ответ №2:
Вот как я решил это 🙂
dataOutputStream.write(line.getBytes());
Или, чтобы быть более конкретным, вот мой код:
out.write(("Hello from " client.getLocalSocketAddress()).getBytes());