使用Socket做了一个服务程序,与客户端建立连接后,首先由客户端发过来一个XML请求,服务器端接收到请求后,根据XML内容进行业务处理,处理完成后,再把处理结果返回给客户端,并关闭Socket链接。
目前,由于数据库压力问题,经常导致服务器端业务处理时间过长,客户端由于始终没有得到回应,认为处理已经超时,会主动断开Socket链接。
因此,当超时情况发生时,服务器端在向客户端回写数据时,系统应该能够弹出IO异常,以提示写入失败或链接断开的。但是目前代码中未有任何的提示,进行逐步代码排查时,发现客户端向服务器端写入数据后,主动关闭了scoket的输出流sock.shutdownOutput();如果把该行代码注释掉时,当出现超时时服务器端就可以正常检查出来回写失败,如果加入就检查不出来,现在想问问大家这到底是什么原因?
目前,由于数据库压力问题,经常导致服务器端业务处理时间过长,客户端由于始终没有得到回应,认为处理已经超时,会主动断开Socket链接。
因此,当超时情况发生时,服务器端在向客户端回写数据时,系统应该能够弹出IO异常,以提示写入失败或链接断开的。但是目前代码中未有任何的提示,进行逐步代码排查时,发现客户端向服务器端写入数据后,主动关闭了scoket的输出流sock.shutdownOutput();如果把该行代码注释掉时,当出现超时时服务器端就可以正常检查出来回写失败,如果加入就检查不出来,现在想问问大家这到底是什么原因?
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());
是的,加上client.shutdownOutput();
行代码后,客户端即使给关掉了,服务器仍然可以往客户端写数据,并且不提示任何异常
这个超时是在客户端设置的,服务器端并没有进行超时设置。
当客户端超时后,整个系统就立即退出,socket应该已经断开,但是断开后,服务器端在继续向socket流里面写数据的话,任何成功,没有任何提示。
不加就玩了呗
服务器端代码:
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方法就没有任何异常。