簡體   English   中英

Java Socket等待UTF8

[英]Java Socket waiting for UTF8

我正在嘗試自己實現客戶端服務器應用程序。 到目前為止,它的工作正常,但事實是,當我通過另一個應用程序(例如Web瀏覽器)訪問端口時,服務器應用程序正在阻塞。

如果連接的應用程序是“客戶端應用程序”,是否有任何簡單的方法/良好做法可以檢查?

這是套接字監聽端口8080的簡短示例。套接字等待2個字符串。 如果現在使用瀏覽器(localhost:8080)連接,則建立連接,但正在等待第一個UTF8。

public class MainSocket {

public static void main(String[] args) {
    ServerSocket serverSocket;
    try {            
        serverSocket = new ServerSocket(8080);
        while (true) {
            try {
                Socket clientSocket = serverSocket.accept();
                System.out.println("Connection established");
                DataInputStream in = new DataInputStream(clientSocket.getInputStream());
                System.out.println(in.readUTF());
                System.out.println(in.readUTF());
                in.close();
                clientSocket.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}
}

您正在調用DataInputStream.readUTF8 期望這樣的數據:

首先,讀取兩個字節,並以與readUnsignedShort方法完全相同的方式來構造一個無符號的16位整數。 此整數值稱為UTF長度,它指定要讀取的其他字節數。 然后,通過分組考慮將這些字節轉換為字符。 每個組的長度是根據該組的第一個字節的值計算的。 組之后的字節(如果有)是下一組的第一個字節。

(等等)

換句話說,這不只是UTF-8。 對於帶有length prefix的 UTF-8 這是一個微小的變化。 那不是瀏覽器將要寫入連接的內容。 基本上, DataInputDataOutput是對稱的,但不完全是通用的-它們通常一起使用,一側通過DataInput讀取另一側通過DataOutput編寫的內容。

如果您只想閱讀UTF-8行,則可以使用:

try (Reader inputReader = new InputStreamReader(clientSocket.getInputStream(), StandardCharsets.UTF_8);
    BufferedReader reader = new BufferedReader(inputReader)) {
    System.out.println(read.readLine());
    System.out.println(read.readLine());
}

(現在還不清楚您是否應該期望瀏覽器將UTF-8寫入套接字,但是我想說的是,以上可能使您進入下一步。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM