小弟用Java做了一个模拟握手的协议,利用Socket来传输,其中双方都利用了BigInteger这个大数类进行了模幂计算,但是在对中间结果进行传输以及再次计算的时候出现了客户端和服务器端不相同的情况。简单来说就是客户端有个大数c,服务器有个大数s,双方互发一下,都计算c乘s,通过socket的readLine和pringln传输的c和s,双方计算的c乘s不相等,我搜索了一下相关的帖子,看到了这里的一个朋友也问了类似的问题,有朋友解答说“readLine在读到一个字符串后,通过println发出去,会在最后加上一个\r\s,而这个死符串本身可能就在末尾,也就没有\r\n,或者只有\n”还有朋友解答说“socket传输的都是byte流,你按照一定长度来读取byte流,再组合就可以了。”“先读取10个byte,然后组成String,trim一下,然后用long   txtLen=Long.parseLong得到long值。这个就是下面内容的长度。在byte   buf[]=new   byte[txtLen];is.read(buf);String   txt=new   String(buf);这样就得到完整的text了。”我最后对c乘s进行了DES加解密,出现了Input   length   must   be   multiple   of   8   when   decrypting   with   padded   cipher的报错,估计也是传输过程中出现的问题。那么怎么做能保证传输的准确呢?恳请各位前辈指点一下!小弟是个新手,希望能解释的具体一些,非常感谢!

解决方案 »

  1.   

    用DataInputStream和DataOutptStream一般是不会出现这个问题的啊
      

  2.   

    在网络传输中不要用PrintWriter(println的就是用了PrintWriter)。
    用ObjectInputStream和ObjectPutputStream
      

  3.   

    我客户端用的是BufferedReader和DataOutputStream
    服务器端用的是BufferedReader和PrintWriter
    开始就是传输一些小信息,模拟测试一下,没考虑到后来能传大的数值,是这个原因么??
      

  4.   

    用ObjectInputStream和ObjectPutputStream?那我现在用的PrintWriter需要做什么大改动么?因为小弟刚开始学,ObjectInputStream还没用过
      

  5.   

    已经不存在不准确的问题了,但是Input  length  must  be  multiple  of  8  when  decrypting  with  padded  cipher的问题依然存在,不知道为什么在单文件下测试没问题,一经过socket传输就不行了...
      

  6.   

    Reader 和 Writer 不要用于处理非字符串内容的流!这两个类及其派生类都是用来处理字符串的。