java socket DataInputStream

时间:2015-05-27 10:41:34

标签: java sockets datainputstream

我有一个多线程程序java java socket,我收到了bizare的信息。 像这样 ¤¤¤¤¤¤23456718900263678722¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤

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();
            }
        }

4 个答案:

答案 0 :(得分:3)

问题在于:

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

Read并不能准确读取您希望在该数组中拥有的字节数。它可以读取任何个字节数。因此,您始终必须检查读取操作的返回值;并且只有当读取了所有预期的字节时......你应该继续!

您的输出看起来像垃圾的原因是您将接收特殊字符。

会发生什么:

  • 您创建一个新数组(使用零值初始化)。
  • 然后你读了一些字节,很可能是没有足够的字节来填充那个数组。
  • 在第一次读取后,打印出现在包含初始零值的数组;和一些类似于可打印字符的字节。

这可以通过在读取之前打印阵列来验证。您将看到只包含那些“特殊”字符。

答案 1 :(得分:1)

如果您预计恰好有64个byes,请使用readFully()代替read(),或至少注意其返回值。

答案 2 :(得分:0)

尝试:

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();
            }
        }

答案 3 :(得分:0)

DataInputStream通常在需要通过套接字共享文本信息时使用。如果从另一端使用DataOutputStream.writeUTF(String str)发送传输的数据,请使用DataInputStream.readUTF()方法。在发送实际数据之前,DataInputStream和DataOutputStream发送两个字节(无符号)长度的数据。

final String data = din.readUTF();