2010-05-09 91 views
1

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

的发送代码:

 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("***********************************************************"); 
+0

你能举一些你发送的字节和接收到的字节吗? – 2010-05-09 12:18:38

+0

你能发表写作和阅读的代码吗? – Zaki 2010-05-09 12:19:35

+0

你在下面说过,这是一个班级项目。请在将来使用'homework'标签来处理这类事情。它可以帮助人们通过正确定位他们的答案来更好地帮助你。 – 2010-05-09 12:45:55

回答

2

in.available()合同并不能保证任何事情。请参阅以下API的摘录:

请注意,尽管InputStream的某些实现将返回流中的总字节数,但许多实现将不会。使用此方法的返回值分配旨在保存此流中所有数据的缓冲区永远是不正确的。

您的代码基本上依赖/假设发送的所有数据都将立即可用并据此报告in.available()

要确保你得到的所有数据,你可以,在发送端通过发送一个整数,告诉多少字节将被发送启动:

dataOut.writeInt(theBytes.length); 

,然后在接收端使用该整数创建阵列时:

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

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

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

+0

以及此应用程序只适用于类项目,客户端和服务器应用程序都运行在同一台计算机上(我的电脑) – 2010-05-09 12:24:53

+0

因此如何获取所有发送的数据?你能否发布一段代码 – 2010-05-09 12:29:07

+0

更新了答案。 – aioobe 2010-05-09 12:35:04