【问题标题】:Socket not closing when timeout set [closed]设置超时时套接字未关闭[关闭]
【发布时间】:2012-09-24 11:06:46
【问题描述】:

我是套接字编程的新手,并且有一段代码可以打开一个套接字并写入它。我将socket的超时时间设置为一分钟,达到一定条件后想关闭socket并退出。

满足条件时我的代码没有关闭套接字:

@Override
    public void run() {
        Socket socket =null; 
        PrintWriter writer = null; 
        BufferedReader reader = null;
        String host = ServiceProperties.getInstance().getControllerHost();
        String port = "1234;
        String info="";
        // TODO Auto-generated method stub

        try {   
            socket = new Socket(host, Integer.valueOf(port));
            socket.setSoTimeout(60000);
            writer = new PrintWriter(socket.getOutputStream(), true);
            reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            SampleBean sBean = (SampleBean) (FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("sampleBean"));
            info = ControllerDAO.getInstance().getControllerAndTimeScheduleInfo(sBean.getId());
            writer.println("set TimeSchedule "+ info +" value ["+str+"]");
        }
        catch(UnknownHostException ex) {
            ex.printStackTrace();
        }
        catch(IOException ex) {
            ex.printStackTrace();
        }
        String line="";
        try {
           System.out.println("BEFORE WHILE");
           System.out.println(new SimpleDateFormat("HH:mm:ss").format(Calendar.getInstance().getTime()));
           while((line= reader.readLine())!=null ) {
               System.out.println(line);
               if(line.contains("OK")){
                  System.out.println("line contains OK ");
                  break;
               }
               try {
                Thread.sleep(5000);
               }
               catch(InterruptedException ex) {
                ex.printStackTrace();
               }
            }
            System.out.println("AFTER WHILE");
            System.out.println(new SimpleDateFormat("HH:mm:ss").format(Calendar.getInstance().getTime()));
        }
        catch(IOException ex) {
            ex.printStackTrace();
        }
        try {
            writer.close();
            reader.close();
            socket.close();
        }
        catch(IOException ex) {
            ex.printStackTrace();
        }
    }
});
thread.run();

输出:

//"BEFORE WHILE"
// 14:54:55
// prints line
//               //prints empty line
// now it waits for like 40 seconds 
// line contains OK  //condition met here
// breakoutof the loop
    // "AFTER WHILE"
// 14:55:55

为什么要等待第三次迭代?第三次迭代是当条件满足时,等待大约 40 秒后。

我做错了什么?

【问题讨论】:

  • 40秒后对端发送OK。套接字不会在超时时自动关闭。不是一个真正的问题。

标签: java sockets jakarta-ee timeout


【解决方案1】:

SO_TIMEOUT does not affectclose(),尝试设置 SO_LINGER。

【讨论】:

    【解决方案2】:

    如果您的请求超时,您需要捕获SocketTimeoutException(请参阅doc),然后在该捕获中关闭套接字,因为即使超时,套接字仍然有效。

    【讨论】:

    • 我不想捕获异常。一旦在一段时间内满足条件,我想关闭套接字(看看是否有条件)即使套接字超时仍然有效
    • 你调试过,看看是否到达socket.close()
    • 是的,它到达了它.. lemme post my output to make it clear
    • mmh AFTER WHILE 打印出来了吗?您是否尝试在上一个 try 中输出一些内容?
    • 是的。我在问题中错过了它。一切都打印好了..但正如我在第 3 次迭代中所说,它只需等待 45 秒然后继续控制,第 3 次迭代是满足条件的地方。并检查已编辑的问题..
    【解决方案3】:

    这里有一些问题,但我认为主要是你没有正确关闭套接字。这应该在封装套接字的try 块的finally 块中,而不是在它自己的try 块中。

    【讨论】:

      猜你喜欢
      • 2020-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-27
      • 1970-01-01
      • 1970-01-01
      • 2013-11-18
      相关资源
      最近更新 更多