双方采用tcp/ip进行通讯,如果采用winsock的方式,对于对方发过来的数据包,我可以直接在dataarrive事件中通过getdata方法捕获。然后对捕获的内容进行解析,这种方法根本无须知道要传过来的包有多长,有什么特殊字符。
那么java中如何实现这种方式呢???
举个例子:也就是说对方发送了一个消息,但是接收方并不知道消息的字节数,那么这种情况下如何完整的捕获消息呢???因为java中的输入流InputStream或者是BufferReader、InputStreamReader只能循环等待,但不知道等待到什么时候才是满足条件的???

解决方案 »

  1.   

    协议定制一般为 int + byte[] .
    这样就好办多了。
    如果不是这样的话, 很简单,循环读到返回值为-1,或为null.
      

  2.   

    使用
    while((..read)!=-1)
    {
      ...
    }但是,如果接受了socket连接,这个方法一直是处于阻塞状态吧?除非连接断开,否则这个方法一直在运行
      

  3.   

                                                                                                                                        
                                                                                                                                        
                                                                                                                                        
              gzgzgzgz                 gzgzgzgz                 gzgzgzgzgzgzgzgzgzgz                   
              gzgzgz                         gzgz                         gzgzgz                 gzgzgz               
              gzgzgz                         gzgz                         gzgzgz                 gzgzgzgz           
              gzgzgz                         gzgz                         gzgzgz                     gzgzgz           
              gzgzgz                         gzgz                         gzgzgz                     gzgzgz           
              gzgzgz                         gzgz                         gzgzgz                     gzgzgz           
              gzgzgz                         gzgz                         gzgzgz                     gzgzgz           
              gzgzgz                         gzgz                         gzgzgz                 gzgzgz               
              gzgzgz                         gzgz                         gzgzgz             gzgzgzgz               
              gzgzgz                         gzgz                         gzgzgzgzgzgzgzgzgz                   
              gzgzgz                         gzgz                         gzgzgz                                           
              gzgzgz                         gzgz                         gzgzgz                                           
              gzgzgz                         gzgz                         gzgzgz                                           
                  gzgz                         gzgz                         gzgzgz                                           
                  gzgzgz                 gzgz                             gzgzgz                                           
                  gzgzgz                 gzgz                             gzgzgz                                           
                  gzgzgz                 gzgz                             gzgzgz                                           
                      gzgzgz         gzgz                                 gzgzgz                                           
                          gzgzgzgzgzgz                         gzgzgzgzgzgzgz                             
      

  4.   


    java和.net还是有些差别的,如果你要是介意IO的同步,你可以看一下java的NIO.
      

  5.   

    蝈蝈,我的意思是说。对方通过socket发过来一个未知长度的包,我如何解析。
      

  6.   

    你看一下Stream和Reader的read()吧。
    当对方写入的数据被读尽后,read()返回-1,退出while().
      

  7.   

    关键问题是这个read()方法并不知道什么时候读尽。因为socket连接还在,所以这个read()方法会一直在阻塞,除非是连接断开,否则read()方法不会是-1.
      

  8.   

    楼主:
    对方的socket(我想应该是服务端),不是你们自己开发的吗?
    如果是你们自己开发的,最好定义好消息的格式以及相关的信息。“关键问题是这个read()方法并不知道什么时候读尽。因为socket连接还在,所以这个read()方法会一直在阻塞,除非是连接断开,否则read()方法不会是-1.”
    这种模式是网络通讯的标准模式,需要通讯一直保持。另楼主可以测试下,在空闲状态,是否会有消息过来,忘记细节了。可以换以字节方式接收试试。
      

  9.   

    客户端是我们开发,服务端不是。
    有一个方法,通过InputStream的available方法来探测buffer中是否有发过来的数据包,如果有则把buffer中的数据读出来,buffer继续阻塞等待。
      

  10.   

    如果协议中定义了包的具体长度字段,那么可以通过输入流中read的相关方法获取消息内容。如果未知长度则只能通过available方法来先探测再取。
    所以我现在明白了为什么在进行socket通讯时一般要求是消息阻塞,也就是说只有收到结果后才能发送下一次消息。