ForeveroLo
2012-03-20 18:25
采纳率: 0%
浏览 594
已采纳

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

场景:多线程环境下,客户端通过Socket发送请求给ServerSocket,现在ServerSocket需要去取数据并返回给Socket。取数据的过程时间是不定的,现在要求设置一个超时时间,如果ServerSocket取数据的时间超过一个定值就通知客户端超时并关闭socket。
问题:请问如何设置这个超时时间。

注意:Socket和ServerSocket已经建立了连接。

我想通过一个定时器来实现,不知道可不可以;是否还有什么更好的办法?
求解!!!

  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

3条回答 默认 最新

  • ll89308839 2012-03-21 08:27
    已采纳

    [code="java"]
    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();
            }
        }
    }
    

    }
    [/code]

    已采纳该答案
    评论
    解决 无用
    打赏 举报
  • Aronlulu 2012-03-20 18:43

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

    评论
    解决 无用
    打赏 举报
  • Aronlulu 2012-03-20 19:03

    [quote]
    setSoTimeout(int timeout)不行吧.这个是在accept()时的超时.我现在是已经建立连接了的.
    [/quote]
    setSoTimeout(int timeout)是读取数据的超时,代表这段时间内没有接收到数据就断开。
    这个应该不满足你的要求,你的需求是socketserver取数据超过一段时间还没取到就断开。在这个层面的话只能用业务代码来搞了,因为tcp层不知道socketserver去其他地方取数据的行为。
    所以采用定时器结合回调函数来搞比较保险。

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题