2015-11-07 60 views
0

我有一個TCP套接字,我在Raspberry Pi上用Java打開,並且一個遠程硬件向它發送數據。不幸的是,提供給控制檯的數據對於sser是不可讀的。Java TCP Socket - 人類可讀取輸出

Data at the Console

的Java代碼如下:

import java.io.*; 
import java.net.*; 
class TCPServer { 
    public static void main(String argv[]) throws Exception  { 
     String clientSentence; 
     String capitalizedSentence; 
     ServerSocket welcomeSocket = new ServerSocket(11111); 
     while(true)   { 
      Socket connectionSocket = welcomeSocket.accept(); 
      BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream())); 

      DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream()); 
      clientSentence = inFromClient.readLine(); 

      System.out.println("Received: " + clientSentence); 

      capitalizedSentence = clientSentence.toUpperCase() + '\n'; 

      outToClient.writeBytes(capitalizedSentence); 
     } 
    } 
} 

我與tcpdump的檢查和硬件本身,該數據正由樹莓裨發送的和接收。我的預感是行:

clientSentence = inFromClient.readLine(); 

最終的要求是採取發送的數據,並將其轉儲到SQL表,所以我需要的TCP數據包轉換爲人類可讀的字符串,因此我的絆腳石這裏塊。

+0

如果您的硬件發送二進制數據流的raspi,你應該找出使用哪種協議。如果設備發送文本到raspi,那麼你應該知道他們使用什麼字符編碼。 (它當然不是ASCII)也許是UTF-16或UTF-32。在文件'file.txt'中寫入輸入流,並在shell中輸入'file '。如果Java知道字符集,則可以將輸入流配置爲轉換爲Java字符串。 –

回答

0

如果您的遠程硬件正在發送的二進制數據,你應該用一個普通的InputStream閱讀:

InputStream input=connectionSocket.getInputStream(); 

...這不會是可讀的人類用戶。

相反,如果你肯定知道它是文本,你必須知道,然後在該字符集已編碼,並將其設置爲使用InputStreamReader作爲第二個參數:

new InputStreamReader(connectionSocket.getInputStream(), "UTF-16") 

可能的編碼:

  • ASCII
  • UTF-8
  • UTF-16
  • ISO-8859-1
  • ISO-8859-2
  • BIG-5(對中國)