为了账号安全,请及时绑定邮箱和手机立即绑定

ServerSocket返回数据给客户端数据的超时问题

ServerSocket返回数据给客户端数据的超时问题

慕丝7291255 2019-03-21 18:19:13
场景:多线程环境下,客户端通过Socket发送请求给ServerSocket,现在ServerSocket需要去取数据并返回给Socket。取数据的过程时间是不定的,现在要求设置一个超时时间,如果ServerSocket取数据的时间超过一个定值就通知客户端超时并关闭socket。问题:请问如何设置这个超时时间。注意:Socket和ServerSocket已经建立了连接。我想通过一个定时器来实现,不知道可不可以;是否还有什么更好的办法?求解!!!
查看完整描述

3 回答

?
慕后森

TA贡献1802条经验 获得超5个赞

public class MyServerSocket extends Thread
{
public MyServerSocket(ServerSocket serverSocket,long timeout){
this.serverSocket=serverSocket;
this.timeout=timeout;
}
private ServerSocket serverSocket;
private Socket socket;
private Thread thread ;private long timeout=1000000;

public Socket accept() throws Exception{
   this.start();
    thread =   new Thread() {
            public void run() {
                    acc();
              }
     };
     thread.start();
     while(thread.isAlive()){
         if(!this.isAlive()){
             //这里想让它停止取数好像有点不容易,直接stop进程有点不靠谱
             thread.stop();
             throw new Exception("accpet time out");
         }
     }
   return socket;
}
private void acc() 
{
    try {
        socket=serverSocket.accept();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
@Override
public void run()
{
    while(timeout>0){
        try {
            sleep(1000);
            timeout-=1000;
        } catch (InterruptedException e)  {
            e.printStackTrace();
        }
    }
}
}


查看完整回答
反对 回复 2019-04-26
?
qq_笑_17

TA贡献1818条经验 获得超7个赞

setSoTimeout(int timeout)可以试一下。
也可以用定时器。
写一个TimerTask,socketserver接收到这个连接的时候就可以把这个连接与timertask绑定。
TimerTask run里面就是判断连接有没有关闭,没关闭就把它关闭。

查看完整回答
反对 回复 2019-04-26
  • 3 回答
  • 0 关注
  • 1108 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信