[英]Java socket not closing
好吧...我是java的新手,这是我的第一个应用程序。 我正在整理一个Java套接字应用程序。 连接后,它将按钮标签从“连接”更改为“断开”。 如果按钮标签=断开连接,则为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);
}
}
我不明白您的程序应该如何工作。 套接字s
对于操作处理程序而言是本地的,因此,您可以连接新分配的套接字,或者关闭一个从未使用过的套接字。 我认为您应该重新访问程序并将套接字保留为某些对象的字段,以便可以查询其状态并根据程序的当前状态和来自GUI的用户请求进行相应操作。
另外,请注意,应该将字符串与Object.equals()
进行比较,而不是与==
进行比较,因为==
检查对象身份,并且对运行时检查不可靠(即使有时当参数是编译时常量或内在字符串时也可以使用)。
另外,您的程序应保留一个内部布尔标志,而不是检查标签的值(例如,如果这是一个真实的应用程序,并且您添加了翻译,该怎么办?)
可能是因为String
比较。
尝试
if(jLabel4.getText().equals("Disconnected"))
如果这不能解决您的问题,请保留一个指示是否连接的boolean
,而不是从标签中读取字符串。
如
boolean connected;
\\ something
if(connected)
\\ do this
else
\\do that
编辑:此外,您应该使套接字超出类范围。 它必须是班级成员。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.