Java клиент сокетов не прекращает чтение данных - PullRequest
0 голосов
/ 17 апреля 2020

Здравствуйте, я пытаюсь выполнить клиент сокета в Java, но клиент все еще читает данные и не продолжает выполнение программы. Любые идеи?

Вот код:

import java.io.*;
import java.net.Socket;

public class SocketTeste {

    public static void main(String[] args) {
        try {
            Socket client = new Socket("127.0.0.1", 1987);
            System.out.println("Got connection");
            DataInputStream handshake = new DataInputStream(client.getInputStream());
            String handshakePure = handshake.readUTF();
            System.out.println("Got the handshake");
            System.out.println(handshakePure);
            DataOutputStream saida = new DataOutputStream(client.getOutputStream());
            saida.writeUTF("Got it!");
            saida.flush();
            saida.close();
            String returnedData = handshake.readUTF();
            System.out.println(returnedData);
            handshake.close();
            client.close();
        } catch (Exception e) {
            System.out.println("ERROR: " + e);
        }
    }
}

Не думаю, что это имеет значение, но сервер сокетов является PHP сервером сокетов.

1 Ответ

0 голосов
/ 17 апреля 2020

DataInputStream.readUTF ожидает необычно странный формат сообщения. Первые два байта, которые он читает, интерпретируются как длина строки для чтения в двоичном формате с прямым порядком байтов. Затем следует странная нестандартная кодировка текста, похожая, но несовместимая с UTF-8. Скорее всего, вам следует , а не использовать DataInputStream.readUTF для чтения данных в программе, если только вы не использовали его аналог DataOutputStream.writeUTF для записи в первую очередь.

На основании ваших комментариев Похоже, ваш протокол связи основан на строках текста. Для чтения строк текста вы можете использовать, например, класс BufferedReader.

BufferedReader handshake = new BufferedReader(new InputStreamReader(client.getInputStream(), StandardCharsets.UTF_8));
String handshakePure = handshake.readLine();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...