怎么把一个Socket服务端的输出流结束(服务端与客户端双向通信问题),即避免客户端阻塞. 请教朋友: 怎么把一个Socket服务端的输出流结束(服务端与客户端双向通信问题),即避免客户端阻塞. 这种机制的原理我还不是很清楚(IO有一些原理我还不是很熟),我对shutdownInput()用法还不了解,怎么样让它置于流的结束. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 此回复为自动发出,仅用于显示而已,并无任何其他特殊作用楼主【rocket_2008】截止到2008-06-26 09:31:22的历史汇总数据(不包括此帖):发帖数:1 发帖分:5 结贴数:1 结贴分:5 未结数:0 未结分:0 结贴率:100.00% 结分率:100.00% 敬礼! 不懂 客户端怎么阻塞的关Socket就close() 楼上的朋友,你考虑到两各问题没有1、我要源源不断的读取,也就是客户端与服务端的通讯2、当我用字节读取的时候,不是可以用while((num = in.read(by)) != -1)这种情况么,当我们定义的by字节数组的长度的长度为1024,但当数据源的长度刚好为1024的倍数时,那么这样的情况是会阻塞的,这就是我要解决的问题。用一种比较好的办法来解决用字节数组的情况。 你可以一段一段的发送,没发送一次就刷新一次,发送结束直接关闭Socket连接。 http://topic.csdn.net/u/20080620/11/478e7d71-e92a-4aca-8156-c9cfcb401bef.html参考这个 shutdownInput() 关闭相应的输入流, 不能再读数据,但还能写数据。shutdownOutput() 关闭相应的输出流, 不能再写数据,但还能读数据。close() 关闭并释放Socket 所有的贴子看完了,我觉得本质的一些问题还没有解决掉.可以看http://topic.csdn.net/u/20080626/09/18db2301-f672-4ec8-aaa8-bf8c75489893.htmlSUN公司就是因为这样的结束流的方式不好处理,才让我们用包装流来解决.我们用字节流来读取数据的时候,就因为返回不了-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数组长度的倍数的情况呢.为是解决这个办法,应可能的用包装流来读写,好处是速度快,方便. 求助关于Comparator接口排序的问题!! 实例化接口的问题 重开一贴,百分请教PreparedStatement模糊查询问题,立结! 在applet中已经处理好得到1个Image img,如何将其存入服务器文件中? 求助关于HashTable的问题? 請問誰有jdk1.4的類庫參考的電子書? 请问?我是新手。 安装求助 寻找rational Rose下载地址 Applet中this.add(new Label("kk"));只能在init()事件中有效吗? 急求java火柴游戏参考程序 在一个vm里面,同一个类的static变量在什么情况下会出现不同的实例?
楼主【rocket_2008】截止到2008-06-26 09:31:22的历史汇总数据(不包括此帖):
发帖数:1 发帖分:5
结贴数:1 结贴分:5
未结数:0 未结分:0
结贴率:100.00% 结分率:100.00%
敬礼!
1、我要源源不断的读取,也就是客户端与服务端的通讯
2、当我用字节读取的时候,不是可以用while((num = in.read(by)) != -1)这种情况么,当我们定义的by字节数组的长度的长度为1024,但当数据源的长度刚好为1024的倍数时,那么这样的情况是会阻塞的,这就是我要解决的问题。用一种比较好的办法来解决用字节数组的情况。
参考这个
shutdownOutput() 关闭相应的输出流, 不能再写数据,但还能读数据。
close() 关闭并释放Socket
可以看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数组长度的倍数的情况呢.
为是解决这个办法,应可能的用包装流来读写,好处是速度快,方便.