关闭连接后,Socket和SwingWorker不起作用

时间:2013-04-11 11:16:58

标签: java multithreading swing

我正在运行TCP / IP套接字,它发送SOAP消息然后获取响应然后读取它。

问题在于这种情况:首先一切都很好,我发送消息,然后使用swingworker得到响应。如果我关闭套接字,并尝试再次连接,我会通过布尔值停止swing工作者。当我再次连接时,我让线程运行,但是当我发送SOAP消息时,我没有从套接字获得任何输出,但是当我在那时进行调试,然后我逐步调试代码时,我得到一个响应和输出!怎么会发生这种情况?

这是我的代码:

protected Object doInBackground() throws Exception {

        Integer result = 1;
        while (true) {

            if (startReading && !this.server.isSocketClosed()) {
                // send the SOAP Message based on which message is selected
                SendSOAPRequestMessage();
                //Thread.sleep(5);
                String responseMessage = null;
                try {
                    // get the response from the client/server
                    responseMessage = Utils.convertStreamToString(this.server);
                    System.out.println(responseMessage);
                    // give the message without the header + and check the content length and if the header is corrupted
                    fullMsg = decoder.DecodeSoapHeader(new String(responseMessage.getBytes("UTF-8")));
                } catch (Exception ex) {
                    Logger.getLogger(MainWindow.class.getName()).log(Level.SEVERE, null, ex);

                }


            }

        }
}

1 个答案:

答案 0 :(得分:1)

如上所述here," SwingWorker仅设计为执行一次。"此外,您的工作人员不会同步this.server的访问权限,因此工作人员的后台线程可能无法看到外部更改。一些替代方案:

  • 为每个请求创建一个新的worker实例。

  • 让工作人员管理套接字。

附录:对于第一个解决方案,我是否也应该创建一个新的套接字?

没有。如上所述here,"在线程上启动调用发生在启动线程中的任何操作之前。"将引用作为构造函数参数传递给example

可能更清楚

另一方面,套接字开销可能无关紧要。 Profile可以肯定。