DataOutputStream,它会丢失一些位

时间:2010-05-09 12:16:22

标签: java networking

我正在编写客户端服务器应用程序,但是当从服务器端发送时,我在客户端没有收到相同的字节。 在服务器端,我使用了.write(bytes[])方法。在客户端,我使用.readFully(byte[])方法。 你有什么想法吗?

发送的代码:

     System.out.println("Server got connection from " + connectionFromClient.getPort());
        in = connectionFromClient.getInputStream();
        OutputStream out = connectionFromClient.getOutputStream();
        DataOutputStream dataOut = new DataOutputStream(out);
        LicenseList licenses = new LicenseList();
        String ValidIDs = licenses.getAllIDs();
        System.out.println(ValidIDs);
        Encryption enc = new Encryption();
        //byte[] dd = enc.encrypt(ValidIDs);
        byte[] dd = enc.encrypt(ValidIDs);
        String tobesent = new String(dd);
        //byte[] rsult =  enc.decrypt(dd);
        //String tt = String(rsult);
        System.out.println("The sent data**********************************************");
        System.out.println(dd);
        String temp = new String(dd);
        System.out.println(temp);
        System.out.println("*************************************************************");
        //BufferedWriter bf = new BufferedWriter(OutputStreamWriter(out));
        dataOut.write(ValidIDs.getBytes());
        dataOut.flush();
        System.out.println("********Testing**************");
        System.out.println("Here are the ids:::");
        System.out.println(licenses.getAllIDs());
        System.out.println("**********************");

客户端:

         Socket connectionToServer = new Socket("127.0.0.1", 7050);
        InputStream in = connectionToServer.getInputStream();
        DataInputStream dis = new DataInputStream(in);

        int available = dis.available();
        byte[] data = new byte[available];
      //  dis.readFully(data);
        dis.read(data);
        System.out.println("The received Data*****************************************");
        System.out.println(available);
        System.out.println(data);
        System.out.println("***********************************************************");

1 个答案:

答案 0 :(得分:2)

in.available()的合同不保证任何内容。请参阅以下API的摘录:

  

请注意,虽然InputStream的某些实现将返回流中的总字节数,但许多实现不会。使用此方法的返回值来分配用于保存此流中所有数据的缓冲区绝对不正确。

您的代码基本上依赖于/假设发送的所有数据都会立即可用,并由in.available()进行相应的报告。

为了确保获得所有数据,您可以在发送方一方通过发送一个整数开始,告知将发送多少字节:

dataOut.writeInt(theBytes.length);

然后在接收器端在创建数组时使用该整数:

byte[] data = new byte[dis.readInt()];

您发送的字节是来自String吗?在这种情况下,你应该小心charset。发件人和收件人可能有不同的默认字符集。

例如,您可以使用str.getBytes("UTF-8")new String(bytes, "UTF-8")来确保接收方以发送方的方式解释字节。