java socket 客户端设置未接收到数据的超时问题

服务端是别人写的这里改不了;这里是一个网页,通过点按钮触发从客户端发送一个消息到服务端,然后客户端从服务端接收返回的消息反馈到网页上。
当然前面是背景不是重点……
现在想问一个问题就是:如何在客户端设置一个超时时间,发送消息过去之后一段时间没有接收到服务端返回的信息就断开这个连接???
现在已经确定服务端是卡在某个地方只有格式正确才能继续下去,但是人家服务端是封装的,不让改……
已经被这个卡了一个多月了,若有指点,不甚感激!解决必加分!
确定是socket,至于更新web则是通过ajax传数据,首先web传到后台,然后调用socket发送信息到服务端,服务端做出响应返回客户端,再return回前台页面,本质还是socket上的问题,这不是关键,只是介绍一下背景,说明无权更改服务端;然后,我已经在网上搜了好久,这个timeout设置应该是有的,但是现在代码卡在:BufferedReader is = new BufferedReader(new InputStreamReader(sendsocket.getInputStream()));这句上了,前面一句是:senddos.write(tempByte);senddos.flush();用来向服务端发送数据,现在是服务端卡死了,目标是在客户端这边做出设置,使得客户端可以在超出设置超时时间后未得到响应则自行断开连接;现在想求的就是这一段的具体代码,什么方法都可以,只要能在客户端达到上面提出的目的……不胜感激再具体请移步http://zhidao.baidu.com/question/175904057955128964.html

建议如果是长时间没有收到数据的话,或者是不想长时间等待的话,都可以通过设置超时时间来进行断开连接,之后继续处理逻辑(设置socket的setSoTimeout方法实现即可,时间单位是毫秒):

package socket;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.SocketException;
import java.net.SocketTimeoutException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
public class SocketService {
public static void main(String[] args) {
try {
SocketAddress address = new InetSocketAddress("192.168.9.155", 3000);
// 启动监听端口 8001
ServerSocket ss = new ServerSocket();
ss.bind(address);
// 接收请求
Socket s = ss.accept();
new Thread(new T(s)).start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
class T implements Runnable {
public void run() {
try {
System.out.println(socket.toString());
socket.setKeepAlive(true);
socket.setSoTimeout(5 * 1000);
String _pattern = "yyyy-MM-dd HH:mm:ss";
SimpleDateFormat format = new SimpleDateFormat(_pattern);
while (true) {
System.out.println("开始:" + format.format(new Date()));
try {
InputStream ips = socket.getInputStream();
ByteArrayOutputStream bops = new ByteArrayOutputStream();
int data = -1;
while((data = ips.read()) != -1){
System.out.println(data);
bops.write(data);
}
System.out.println(Arrays.toString(bops.toByteArray()));
}catch(SocketTimeoutException e){
e.printStackTrace();
}catch(SocketException e){
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
Thread.sleep(1000);
System.out.println(socket.isBound()); // 是否邦定
System.out.println(socket.isClosed()); // 是否关闭
System.out.println(socket.isConnected()); // 是否连接
System.out.println(socket.isInputShutdown()); // 是否关闭输入流
System.out.println(socket.isOutputShutdown()); // 是否关闭输出流
System.out.println("结束:" + format.format(new Date()));
}
} catch (Exception e) {
e.printStackTrace();
}
}
private Socket socket = null;
public T(Socket socket) {
this.socket = socket;
}
public Socket getSocket() {
return socket;
}
public void setSocket(Socket socket) {
this.socket = socket;
}
}

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-12-30
首先,确定你这是socket连接吗? 通过socket的连接然后去更新 web页面?

然后,不管是socket 还是 http连接, 都是有timeout时间设置的。追问

非常感谢您的回答,但是具体代码上面的问题我自己无法解决,问题补充大致说明了一下情况,如果再具体请移步http://zhidao.baidu.com/question/359893174320771692.html,谢谢

本回答被提问者采纳
相似回答