Чтение данных из сокета tcp, опубликованного другим инструментом - PullRequest
0 голосов
/ 04 января 2019

Один инструмент отправляет данные в порт, и java-сокет должен их прочитать.Я проверяю, получены ли данные с помощью Netcat nc -lv ip port

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

ServerSocket server = new ServerSocket(port);
System.out.println("Server started"); 
System.out.println("Waiting for a client ..."); 

Socket socket = server.accept(); 
System.out.println("Client accepted"); 

// takes input from the client socket 
DataInputStream in = new DataInputStream(new BufferedInputStream(socket.getInputStream())); 
while (true) {
     String line = in.readUTF(); 
     System.out.println(line); 
}

Программы всегда ждут запросов, хотяКоманда Netcat показывает данные.Любая помощь очень ценится.

Заранее спасибо

Шакти

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Контракт DataInput.readUTF () заключается в том, что длина строки для чтения содержится в первых двух байтах:

First, twoбайты считываются и используются для создания 16-разрядного целого без знака точно так же, как метод readUnsignedShort. Это целочисленное значение называется длиной UTF и определяет количество дополнительных байтов, которые нужно прочитать .

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

Например, предположим, что ваш инструмент отправляет строку «Hello World», закодированную в ASCII .В шестнадцатеричном формате это

48 65 6C 6C 6F 20 57 6F 72 6C 64

Ваш сервер получает данные, и класс DataInput начинает декодировать их как UTF8 в соответствии с контрактом.Первые два байта читаются как короткие без знака:

utf_length = (((48 & 0xff) << 8) | (65 & 0xff))

Это дает длину 18533 байтов.После считывания оставшихся 9 байтов потока сервер просто заблокирует ожидание поступления оставшихся 18524 ​​ байтов, как это и ожидается.Я думаю, это причина, по которой ваша программа просто зависает.

Поскольку вы не говорите, что такое клиентский инструмент или как он кодирует данные, которые вы читаете, трудно понять, является ли это причинойили нет.

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

0 голосов
/ 04 января 2019

В идеале server.accept ();вызов будет ожидать некоторого запроса на этот порт.Server.accept () следует использовать в случае серверной части, где вы будете прослушивать какой-либо порт, и клиенты будут отправлять запросы на этот порт.

В вашем случае вы должны читать из сокета вместосоздание сокета сервера.

Чтобы решить свою задачу, воспользуйтесь ссылками ниже

Чтение данных из сокета Java

https://docs.oracle.com/javase/tutorial/networking/sockets/readingWriting.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...