Socket中shutdownOutput问题

Hanyu94118 2009-09-15 08:34:08
使用Socket做了一个服务程序,与客户端建立连接后,首先由客户端发过来一个XML请求,服务器端接收到请求后,根据XML内容进行业务处理,处理完成后,再把处理结果返回给客户端,并关闭Socket链接。
目前,由于数据库压力问题,经常导致服务器端业务处理时间过长,客户端由于始终没有得到回应,认为处理已经超时,会主动断开Socket链接。
因此,当超时情况发生时,服务器端在向客户端回写数据时,系统应该能够弹出IO异常,以提示写入失败或链接断开的。但是目前代码中未有任何的提示,进行逐步代码排查时,发现客户端向服务器端写入数据后,主动关闭了scoket的输出流sock.shutdownOutput();如果把该行代码注释掉时,当出现超时时服务器端就可以正常检查出来回写失败,如果加入就检查不出来,现在想问问大家这到底是什么原因?
...全文
920 9 打赏 收藏 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Hanyu94118 2009-09-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 sgcl 的回复:]
服务器端的代码有问题。

lz可参考:http://www.blogjava.net/xuechen0721/archive/2006/04/29/44040.html


[/Quote]

服务器端代码:
InputStream in = clntSock.getInputStream();
OutputStream out = new OutputStream(clntSock.getOutputStream());

byte[] buffer = new byte[BUFSIZE]; // Allocate read/write buffer
int bytesRead; // Number of bytes read
if ((bytesRead = in.read(buffer)) != -1) {
out.write(buffer, 0, bytesRead); <--注意这行代码
}

当客户端没有写client.shutdownOutput(); 时,在服务器端读取数据成功后,在向客户端回写数据前,手动把客户端关掉,当调用write方法时会立刻弹出异常;
而当客户端写了client.shutdownOutput(); 的时候,其他条件相同,调用write方法就没有任何异常。
Hanyu94118 2009-09-17
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 snowingximen 的回复:]
client.shutdownOutput();

这条语句,本来也没必要加上去啊?
不加就玩了呗
[/Quote]

客户端代码是另外一个厂家编写的,很难进行修改,我希望尽可能通过修改服务器端代码就可以把该问题给屏蔽掉。
Hanyu94118 2009-09-16
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 sgcl 的回复:]
如果客户端加入sock.shutdownOutput(),那就说明客户端只是纯监听服务器端的socket,这样当然服务器端因为超时断开,客户端也就只是断开而已,不会有异常。如果不加入,那客户端继续会维持连接去服务器端,这样如果服务器超时断开,客户端就无法继续连到服务器,也就有异常出现了。
[/Quote]

这个超时是在客户端设置的,服务器端并没有进行超时设置。
当客户端超时后,整个系统就立即退出,socket应该已经断开,但是断开后,服务器端在继续向socket流里面写数据的话,任何成功,没有任何提示。
Hanyu94118 2009-09-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zhangpeixv 的回复:]
服务器一点反应都没有吗
加上那句的话
[/Quote]

是的,加上client.shutdownOutput();
行代码后,客户端即使给关掉了,服务器仍然可以往客户端写数据,并且不提示任何异常
SnowingXimen 2009-09-16
  • 打赏
  • 举报
回复
client.shutdownOutput();

这条语句,本来也没必要加上去啊?
不加就玩了呗
平淡面对 2009-09-16
  • 打赏
  • 举报
回复
服务器端的代码有问题。

lz可参考:http://www.blogjava.net/xuechen0721/archive/2006/04/29/44040.html

平淡面对 2009-09-15
  • 打赏
  • 举报
回复
如果客户端加入sock.shutdownOutput(),那就说明客户端只是纯监听服务器端的socket,这样当然服务器端因为超时断开,客户端也就只是断开而已,不会有异常。如果不加入,那客户端继续会维持连接去服务器端,这样如果服务器超时断开,客户端就无法继续连到服务器,也就有异常出现了。
Hanyu94118 2009-09-15
  • 打赏
  • 举报
回复
客户端代码示例:
client = new Socket(ip,9000);

client.setSoTimeout(0x927c0);
out = new DataOutputStream(client.getOutputStream());

byte request[] = RequestInfo.getStrInfo(strID).getBytes;
System.out.println(new Date());
System.out.println((new String(request, "GBK")).trim());
out.write(request);
out.flush();
client.shutdownOutput();

in = new DataInputStream(client.getInputStream());
byte reply[] = new byte[2048];
in.read(reply);
System.out.println(new Date());
System.out.println((new String(reply, "GBK")).trim());
zhangpeixv 2009-09-15
  • 打赏
  • 举报
回复
服务器一点反应都没有吗
加上那句的话

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧