我最近写一个JAVA通信程序,为什么我才服务器端发送一次的消息,到客户端 会分多次把这个消息读出来? 请大家给我讲讲read()方法的机制,它一次读多少数据是什么决定的? 急,谢谢了。
我传输的数据并不大,比如说我在服务器端用write方法写“WWWWWWWWWWWWWWW” 这么个字符串,客户端的read方法可能会分3次或4次读这个字符串。

解决方案 »

  1.   

    不带参数的read()一次读一个字节
      

  2.   

    public int read(char[] cbuf,
                    int offset,
                    int length)
             throws IOException将字符读入数组中的某一部分。 指定者:
    类 Reader 中的 read
    参数:
    cbuf - 目标缓冲区
    offset - 以其处开始存储字符的偏移量
    length - 要读取的最大字符数 
    返回:
    读取的字符数,如果已到达流的末尾,则返回 -1
    API上找到,设置好最大字符数就可以了,read是按字节读的
      

  3.   

    我用的是SocketChannel中的  int read(ByteBuffer dst)方法,已经看了API了 没有找到答案,楼上的朋友,我这种情况很特殊吧,按理说不是应该一下把所有的数据读到 dst里吗 它为什么会读了好几次,每次读一部分?  比如说我在服务器端用write方法写“WWWWWWWWWWWWWWW” 这么个字符串,客户端的read方法可能会分3次或4次读这个字符串。
      

  4.   

    楼主现在的迷惑在socket的传输机制,要明白socket的传输机制就可以了
    socket传输的字节流,它的传输不是一次完成的,而是分包发送完成的。
    只是所有字节之间先后顺序不变
    但每次从缓存区接收的只是缓存收到的数据
    在服务器端发送数据后,假如客户端不停的读,每次可能只会读到一部分就是这个原因了不知道有没有说明白
      

  5.   

    read()是堵塞式的
    你让它一直读就是贝!
      

  6.   

    呵呵,
    read()一次只读一个字节
    我一般用BufferedReader readLine()
      

  7.   

    问5楼的一个问题,我发送的数据是"wwwwwwwwwwwwwwwwwww" 这么短的数据,也会分几个包过来吗?  我想是不是数据是一个包过来的,到了客户端,JVM好像维护一个管道之类的东西,他会一个一个向管道里写这些字符,这个时候read 方法可能已经在读了。所以会分多次返回? 不知道我表达清楚没
      

  8.   

    使用WriterUTF写,然后使用readUTF()读就好了
      

  9.   

    read(ByteBuffer dst);将字节读入指定的缓冲区,一次读一个字节,读入缓冲区,知道缓冲区满,你把ByteBuffer的大小设置大点不就可以了吗
      

  10.   

    是不是读取的地方速度太快了,你试一试在读取端先sleep一会儿,然后再读
      

  11.   

    我想知道JAVA 是如何封装IO的,socket中IO的原始形态是什么样的?一个数据包应该能携带很长的数据,如“wwwwwwwwwwwww”应该是一个包发过来的,但是用read(buffer)方法一读,就要多次读取。这说明,java在接到数据之后又做了别的处理,哪位高人可以详细的说明一下。大家也踊跃的讨论一下吧。
      

  12.   

    read(byte[],int offset,int len)方法不保证一次能够读到len长度的数据,因此必须坚持返回值,确定是否需要循环读