2012-11-02 61 views
3

我在通過Java中的套接字傳輸字符串時遇到了問題。當我嘗試從服務器接收數據時,數據成功傳輸,但已損壞。我無法找出發生了什麼問題。通過java中的套接字損壞的字符串

這裏是客戶端的代碼:

public String getUserNameServerResult(String userNameParameter) { 
    Socket socket; 
    BufferedReader socketReader; 
    PrintWriter socketWriter; 
    String userNameResultParameter = null; 
    try { 
     socket = new Socket(HOST_NAME, PORT_NUMBER); 
     socket.setSoTimeout(SERVER_REQUEST_TIMEOUT); 
     socketReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     socketWriter = new PrintWriter(socket.getOutputStream()); 
     socketWriter.println(numberRequest); 
     socketWriter.flush(); 
     socketWriter.println(userNameParameter); 
     socketWriter.flush(); 
     userNameResultParameter = socketReader.readLine(); 
     socketReader.close(); 
     socketWriter.close(); 
     socket.close(); 
     System.out.println(userNameResultParameter); 
    } catch(IOException ioEx) { 
     ioEx.printStackTrace(); 
    } 
     return userNameResultParameter; 
} 

的readLine從讀線()方法傳輸已損壞的字符串。

這裏是服務器的代碼:

public synchronized void run(){ 
    System.out.println(new Date().toString()+" :\nAccepted client: " 
      +socket.getInetAddress()+":"+socket.getPort()+"\n"); 
    try { 
     while(!isInterrupted()) { 
      String numberRequest = socketReader.readLine(); 
      if(numberRequest == null) { 
       break; 
      } 
      switch(numberRequest) { 
       case "1": // Determines if the user name exists in the Database. 
        String userName = socketReader.readLine(); 
        boolean isUserName = ServerRequest.isUserNameExists(userName); 
        socketWriter.println(isUserName); 
        socketWriter.flush(); 
        break; 
       default: break; 
      } 
     } 
    } catch(IOException ex) { 
     System.err.println(ex.getMessage()); 
    } 
} 

的「isUserName」變量轉移和它被在客戶端已損壞。

你能幫忙解決這個問題嗎? 謝謝!

+0

損壞怎麼辦?此外,您是否嘗試並設置代理來轉儲在客戶端和服務器之間傳輸的數據,以確定哪一端正在破壞數據? – millimoose

+0

另外,你**絕對**需要使用原始套接字?在各種抽象層次上有很多中間件來幫助編寫服務器。如果您不需要Web服務/遠程處理機制,ZeroMQ,RabbitMQ,QuickServer都是不錯的選擇。 – millimoose

+0

isUserName是一個布爾變量,用於確定用戶名是否存在於數據庫中,並且在socketWriter.println(isUserName)之前具有正確的形式:true或false。但是當它通過套接字傳輸時,結果變成「[] [] [] false」或「[] [] [] true」,其中「[] [] []」是某些不可讀的數據。 –

回答

1

isUserNameboolean。也許你的意思是socketWriter.println(userName);

請使用下面的代碼向我們展示損壞的字符串的樣子!

System.out.println(userNameResultParameter); 
System.out.print("Chars:"); 
for (char c : userNameResultParameter.toCharArray()) 
    System.out.print(" 0x" + Integer.toHexString((int)c)); 
+0

不,我想調用isUserName。據我所知,println()方法將所有東西都轉換爲字符串,所以它應該將「真」或「假」作爲字符串傳遞,但是當我在客戶端接收它們時會損壞。結果就像「[] [] [] false」,其中「[] [] []」是一些不可讀的數據。我不明白是什麼問題。 –

+0

兩個問題:是[] [] []每次都一樣嗎?其次,你可以使用我編輯過的代碼將我們可以看到的字節數組轉換爲字符串嗎? – durron597

+0

是的,每次不可讀的數據都是一樣的。當我把你的代碼的結果是: 0xfffd 0xfffd 0x0 0x5 0x74 0x72 0x75 0x65 當我第二次運行程序時,結果是一樣的。 –

0

這個問題,我認爲是與InputStreamReader的建設。默認情況下,讀者假定傳入字符數據的編碼是您平臺的默認編碼,但Writer(在服務器端)正在發送UTF-8數據。

嘗試構建InputStreamReader這樣的:

new InputStreamReader(socket.getInputStream(), "UTF-8")

+0

我試着修改InputStreamReader的構造函數,但結果是一樣的。 –