Halo saya mencoba menjalankan klien soket di Jawa, tetapi klien masih membaca data dan tidak melanjutkan dengan eksekusi program. Ada ide?

Berikut kodenya:

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);
        }
    }
}

Saya tidak berpikir jika itu penting, tetapi server soket adalah server soket PHP.

0
Giulliano Rossi 17 April 2020, 19:04

1 menjawab

Jawaban Terbaik

DataInputStream.readUTF mengharapkan format pesan yang unik dan aneh. Dua byte pertama yang dibacanya ditafsirkan sebagai panjang string yang akan dibaca, dalam format biner big endian. Ini kemudian diikuti oleh pengkodean teks non-standar aneh yang mirip dengan tetapi tidak kompatibel dengan UTF-8. Kemungkinan besar Anda harus tidak menggunakan DataInputStream.readUTF untuk membaca data dalam suatu program, kecuali jika Anda menggunakan mitranya DataOutputStream.writeUTF untuk menulisnya terlebih dahulu.

Berdasarkan komentar Anda, sepertinya protokol komunikasi Anda didasarkan pada baris teks. Untuk membaca baris teks, Anda dapat menggunakan misalnya kelas BufferedReader.

BufferedReader handshake = new BufferedReader(new InputStreamReader(client.getInputStream(), StandardCharsets.UTF_8));
String handshakePure = handshake.readLine();
0
Joni 17 April 2020, 19:41