请教朋友:
    怎么把一个Socket服务端的输出流结束(服务端与客户端双向通信问题),即避免客户端阻塞.
    这种机制的原理我还不是很清楚(IO有一些原理我还不是很熟),我对shutdownInput()用法还不了解,怎么样让它置于流的结束.

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【rocket_2008】截止到2008-06-26 09:31:22的历史汇总数据(不包括此帖):
    发帖数:1                  发帖分:5                  
    结贴数:1                  结贴分:5                  
    未结数:0                  未结分:0                  
    结贴率:100.00%            结分率:100.00%            
    敬礼!
      

  2.   

    不懂  客户端怎么阻塞的关Socket就close()
      

  3.   

    楼上的朋友,你考虑到两各问题没有
    1、我要源源不断的读取,也就是客户端与服务端的通讯
    2、当我用字节读取的时候,不是可以用while((num = in.read(by)) != -1)这种情况么,当我们定义的by字节数组的长度的长度为1024,但当数据源的长度刚好为1024的倍数时,那么这样的情况是会阻塞的,这就是我要解决的问题。用一种比较好的办法来解决用字节数组的情况。
      

  4.   

    你可以一段一段的发送,没发送一次就刷新一次,发送结束直接关闭Socket连接。
      

  5.   

    http://topic.csdn.net/u/20080620/11/478e7d71-e92a-4aca-8156-c9cfcb401bef.html
    参考这个
      

  6.   

    shutdownInput() 关闭相应的输入流, 不能再读数据,但还能写数据。
    shutdownOutput() 关闭相应的输出流, 不能再写数据,但还能读数据。
    close() 关闭并释放Socket
      

  7.   

    所有的贴子看完了,我觉得本质的一些问题还没有解决掉.
    可以看http://topic.csdn.net/u/20080626/09/18db2301-f672-4ec8-aaa8-bf8c75489893.html
    SUN公司就是因为这样的结束流的方式不好处理,才让我们用包装流来解决.
    我们用字节流来读取数据的时候,就因为返回不了-1这种情况需要做很多的判断,首先一点,连接是不能是短连接.
    这样的问题有时候讨论可以看着是多余的,我其实不这么看,但有人告诉我他是这样的看法,既然是readLine()方法,就不必用read()方法.
    但是原理我们还是要知道.
    流的结束如果不是文件的话是不以-1结尾的,所以不可能返回-1,所以当没有关闭连接时或没有调用shutdownInput()方法时是一直阻塞的.
    我想过用什么办法从服务端写一个-1过来,但是事实告诉我这种方法是很行不通的.
    有两种方案来结束流:
    1\让客服端自己来判断流是束结束(根据读取的信息)
    2\从服务端告诉客服端一个信息
    在第一种方法中,有一个问题(或者说我们自己制造的一个问题):
        byte  [] by = new byte[1024];
        while((num = in.read(by)) != -1){
            if(num < by.length){//当读取的数据的长度小于by的长度时,认为读到了末尾了.
                 //do something
                 break;
            }
        }这里的问题是我们能不能判断出数据的长度刚好了by数组长度的倍数的情况呢.
    为是解决这个办法,应可能的用包装流来读写,好处是速度快,方便.