簡體   English   中英

java套接字數據輸入流

[英]java socket DataInputStream

我有一個多線程程序 java java socket,我收到了奇怪的信息。 像這樣的

public void run() 
       {
            try {

                byte[] bs = new byte[64];

                 // read data into buffer
                 dataReception.read(bs);

                 // for each byte in the buffer
                 for (byte b:bs)
                 {
                    // convert byte into character
                    char c = (char)b;

                    // print the character
                    System.out.print(c);
                 }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

問題在這里:

// read data into buffer
dataReception.read(bs);

Read 不會准確讀取您想要在該數組中包含的字節數。 它可以讀取任意數量的字節。 因此,您必須始終檢查讀取操作的返回值; 並且只有當所有預期的字節都被讀取時......你應該繼續!

您的輸出看起來像垃圾的原因不是因為您會收到特殊字符。

發生的事情是:

  • 您創建一個新數組(用零值初始化)。
  • 然后您讀取了一些字節,很可能沒有足夠的字節來填充該數組。
  • 在第一次讀取之后,您打印現在包含初始零值的數組; 和一些類似於可打印字符的字節。

這可以通過讀取之前打印您的數組來驗證。 您將看到僅包含那些“特殊”字符。

如果您期望正好是 64 個字節,請使用readFully()而不是read(),或者至少注意它的返回值。

嘗試:

public void run() 
       {
            try {

                byte[] bs = new byte[64];

                 // read data into buffer
                 int readed = dataReception.read(bs);

                 // for each byte in the buffer
                 for (int n=0; n<readed;n++)

                 {
                    byte b=bs[n];

                    // convert byte into character
                    char c = (char)b;

                    // print the character
                    System.out.print(c);
                 }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

DataInputStream 通常用於需要通過套接字共享文本信息時。 如果使用 DataOutputStream.writeUTF(String str) 從另一端發送傳輸的數據,則使用 DataInputStream.readUTF() 方法。 DataInputStream 和 DataOutputStream 在發送實際數據之前發送兩個字節(無符號)長度的數據。

final String data = din.readUTF();

暫無
暫無

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

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