Java socket没有关闭

时间:2014-05-21 20:28:20

标签: java sockets

好的......我是java新手,这是我的第一个应用程序。我正在组装一个java套接字应用程序。连接后,它会更改" Connect"的按钮标签。到"断开"。如果button label = disconnect,则socket.close。不确定为什么它没有关闭。是因为它是私人的吗?我知道可能有更好的方法来确定插座是否打开等。但我真的是第一个,试图理解为什么以下不工作。任何帮助,将不胜感激。谢谢!

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    Socket s = new Socket();
    String host = jTextField1.getText();
    double d = Double.parseDouble(jTextField2.getText());
    int port = (int) d;
    if (jLabel4.getText() == "Disconnected") {
        try {
            s.connect(new InetSocketAddress(host, port), 60);
            jLabel4.setText("Connected");
            jButton1.setText("Disconnect");
        } catch (IOException ex) {
            Logger.getLogger(SARP_UI.class.getName()).log(Level.SEVERE, null, ex);
        }
    } else {
        try {
            s.close();
            jLabel4.setText("Disconnected");
            jButton1.setText("Connect");
        } catch (IOException ex) {
            Logger.getLogger(SARP_UI.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

2 个答案:

答案 0 :(得分:2)

我无法理解你的程序应该如何工作。套接字s是操作处理程序的本地,因此要么连接新分配的套接字,要么关闭从未使用过的套接字。我认为你应该重新访问你的程序并将套接字保存为某个对象的字段,这样你就可以查询它的state并相应地操作程序的当前状态和来自GUI的用户请求。

另请注意,字符串应与Object.equals()进行比较,而不是与==进行比较,因为==检查对象标识并且对于运行时检查是不可靠的(即使有时它在参数为编译时常量或实习字符串)。

此外,您的程序应该保留一个内部布尔标志,而不是检查标签的值(例如,如果这是一个真正的应用程序并且您添加了翻译?)

答案 1 :(得分:0)

这可能是因为String比较 试试

if(jLabel4.getText().equals("Disconnected"))

如果这不能解决您的问题,请保留一个表示已连接或未连接的boolean,而不是从标签中读取字符串。

boolean connected;
\\ something
if(connected)
\\ do this
else
\\do that

编辑:此外,您应该在类范围内创建套接字。它必须是集体成员。