[英]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 ,這是一個微小的變化。 那不是瀏覽器將要寫入連接的內容。 基本上, DataInput
和DataOutput
是對稱的,但不完全是通用的-它們通常一起使用,一側通過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.