2015-04-27 111 views
0

我正試圖自己實現客戶端 - 服務器應用程序。目前爲止,除了事實上,當我通過另一個應用程序(例如Web瀏覽器)訪問端口時,服務器應用程序被阻止。Java Socket等待UTF8

如果連接應用程序是「客戶端應用程序」,是否有任何簡單的方法/好的實踐來檢查?

下面是偵聽端口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(); 
    } 
} 
} 
+0

DataInputStream是專爲讀*二進制*數據,而不是文本。我建議使用許多Reader實現之一來閱讀文本。 –

回答

1

您在致電DataInputStream.readUTF8。一個期望的數據是這樣的:

首先,兩個字節被讀出並用於構建在readUnsignedShort方法完全相同的方式一個無符號的16位整數。該整數值稱爲UTF長度,並指定要讀取的附加字節數。這些字節然後通過分組考慮將它們轉換爲字符。每個組的長度根據組的第一個字節的值計算。一個組後面的字節(如果有的話)是下一個組的第一個字節。

(等)

換句話說,這不僅僅是UTF-8。這是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到插座或者,但以上更可能讓你到下一步,我會說...)

+0

感謝您的答覆。這正是我面臨的問題。在我的客戶端應用程序中,我正在向服務器寫入2 * UTF和1 *文件。但是現在,如果我通過瀏覽器訪問服務器的端口,則服務器將被阻塞,因爲它正在等待第一個readUTF。 –

+0

@AndreasFreitag:嗯,是的 - 如果你的客戶端應用程序和瀏覽器要發出不同的請求,爲什麼你會嘗試在同一個端口上處理它們? –

+0

他們使用不同的端口,但如果用戶正在訪問8080端口,則服務器被阻止。在真正的服務器應用程序中,我使用了帶有10個套接字的套接字池,所以它不是一個大問題。但在我看來,這不是一個好習慣。 –