Как обрабатывать и декодировать входящие байты с TCP-сервера - PullRequest
0 голосов
/ 09 ноября 2019

В настоящее время я работаю над консольным приложением Java. Он запускается через командную строку, подключается к серверному приложению, написанному на python, и связывается с этим сервером по TCP. Мое приложение отправляет строку «ISND» на сервер, который оно принимает, и в ответ сервер отправляет три изображения. Формат, в котором отправляются изображения:

Где "<" ">" на самом деле не включены. «ISND» кодируется в байтах с использованием ascii. Размер - это размер изображения, преобразованный в байты из целого числа, и он всегда состоит из 3 байтов независимо от размера изображения. Для каждого отдельного изображения отправляется сообщение в этом формате.

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

Это пришло ку меня такое чувство, будто я разбиваю голову об стену. Поэтому мне нужен совет от любого, кто более знаком с программированием на Java и Socket, как решить эту проблему.

Мой текущий код

public class ImageLabeler {
/**
 * @param args
 */
public static void main(String[] args) {
    String IP = args[0];
    System.out.println(IP + "\n");

    String port = args[1];
    System.out.println(port + "\n");

    Socket clientSocket;
    DataOutputStream outToServer = null;
    BufferedReader inFromServer = null;

    String serverResponse;



    try {
        clientSocket = new Socket(IP, Integer.parseInt(port));
        outToServer = new DataOutputStream(clientSocket.getOutputStream());
        inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        System.out.println("Connection success\n");
    } catch (IOException ex) {
        System.out.println("Connection failed\n");
        System.exit(0);
    }

    PrintWriter writer = new PrintWriter(outToServer, true);

    try {
        //outToServer.writeBytes("USER bilkentstu\\n");
        //outToServer.flush();
        //System.out.println("check\n");
        writer.println("USER bilkentstu");

        serverResponse = inFromServer.readLine();
        System.out.println(serverResponse + "\n");

        writer.println("PASS cs421f2019");

        //outToServer.writeBytes("PASS cs421f2019\\r\\n");
        //outToServer.flush();

        serverResponse = inFromServer.readLine();
        System.out.println(serverResponse + "\n");

        writer.println("IGET");
        //This is where I need to handle the incoming Image messages.

        writer.println("EXIT");
    } catch (IOException ex) {
        Logger.getLogger(ImageLabeler.class.getName()).log(Level.SEVERE, null, ex);
    }
    System.exit(0);
}

}

1 Ответ

0 голосов
/ 10 ноября 2019

Не используйте буферизованный ридер. Вам нужно написать код, читающий строку из InputStream сокета по одному байту за раз.

...