java closed_有关Java中isClosed()和isConnected()的一些误解

先说一个比较郁闷的事情,我一直以为Socket.isClose()和Socket.isConnected()是可以判断Socket是否连接的一个函数(这结论居然还是在CSDN上看到的,我就这么天真的相信了。),结果在一个项目上,我给学长指导的时候,告诉他这个地方是可以作为判断的。结果,他赤裸裸的躺枪了。我们可以看看JDK中是怎么说的:

/**

* Returns the closed state of the socket.

*

* @return true if the socket has been closed

* @since 1.4

* @see #close

*/

public boolean isClosed() {

synchronized(closeLock) {

return closed;

}

}

我们可以看到,这返回值只是一个boolean的变量,他并没有进行所谓的心跳,那么,这个closed变量又是在哪变修改的呢?

//注释就不贴出来了

public synchronized void close() throws IOException {

synchronized(closeLock) {

if (isClosed())

return;

if (created)

impl.close();

closed = true;

}

}

我们可以看到,除非你手动的close掉这个Socket连接,不然closed就一直处在false的初始量。所以,这个isClosed()方法并不能作为判断Socket是否还活着的依据,那么isConnected呢。

/**

* Returns the connection state of the socket.

*

* Note: Closing a socket doesn't clear its connection state, which means

* this method will return true for a closed socket

* (see {@link #isClosed()}) if it was successfuly connected prior

* to being closed.

*

* @return true if the socket was successfuly connected to a server

* @since 1.4

*/

public boolean isConnected() {

// Before 1.3 Sockets were always connected during creation

return connected || oldImpl;

}

我们可以仅从注释中看到:@return true if the socket was successfuly connected to a server.也就是说,这个返回值只是一个状态量,只是说明了这个Socket有没有成功的连接过,而并不是说现在有没有连接上。

综上所述,以下代码是没有一点意义的,在判断Socket是否连接的时候。各位慎重啊。不要再掉坑里了。。。。if(Socket.isClosed && Socket.isConnected()){

//Socket是连接的

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
java 大一课程设计 qq聊天程序socket=new Socket(); textPanel.send.setEnabled(false); thread=new Thread(this); setVisible(true); validate(); } public void actionPerformed(ActionEvent e) { if(e.getSource()==save) { savefile.setVisible(true); if(savefile.getFile()!=null) { try{ File file=new File(savefile.getDirectory(),savefile.getFile()); FileWriter tofile=new FileWriter(file); BufferedWriter out=new BufferedWriter(tofile); out.write(textPanel.getWholeText(), 0, textPanel.getWholeText().length()); out.close(); tofile.close(); } catch(IOException e2){} } } else if(e.getSource()==doodle) { thePaint.setVisible(true); } else if(e.getSource()==Disconnect) { if(socket.isConnected()) { try{ ps.writeUTF("QUIT:"); ps.flush(); socket.close();}catch(IOException ee){System.out.println("无法关闭");} } setTitle("用户"+name+"离线"); textPanel.send.setEnabled(false); nameList.removeAll(); nameLable.setText("在线用户: "+"人数: "+(nameList.getItemCount())); } else if(e.getSource()==connect) { try//请求和服务器建立套接字连接 { if(socket.isConnected()){} else { InetAddress address=InetAddress.getLocalHost(); InetSocketAddress socketAddress=new InetSocketAddress(address,8080); socket.connect(socketAddress); reader=new DataInputStream(socket.getInputStream()); ps=new DataOutputStream(socket.getOutputStream()); out=new ObjectOutputStream(socket.getOutputStream()); in=new ObjectInputStream(socket.getInputStream()); ps.writeUTF(name);//开始即传输用户名 ps.flush(); setTitle("用户"+name+"在线"); thread.start(); } }catch(IOException ee){} } else if(e.getSource()==groupChat) { groupMode=true; condition.setText("群 聊\n"); textPanel.send.setEnabled(true); } else if(e.getSource()==privateChat) { groupMode=false; condition.setText("私 聊\n"); textPanel.send.setEnabled(true); } else if(e.getSource()==nameList) { if(!groupMode) { indexName=nameList.getSelectedItem(); condition.setText("私 聊\n与"+nameList.getSelectedItem()+"聊天\n"); } } else if(e.getSource()==textPanel.send) { if(e.getSource()==textPanel.send) { textPanel.text=textPanel.in.getText(); Font f=textPanel.in.getFont(); textPanel.out.setFont(f); Color c=textPanel.in.getForeground(); textPanel.out.setForeground(c); textPanel.in.setText(""); if(!groupMode) { textPanel.out.append("\n"+"我说:"+textPanel.text+"\n"); } else { textPanel.out.append("\n"); } System.out.println("文本输出~~"); String text=textPanel.text; if(groupMode) { StringBuffer msg=new StringBuffer("MSG:"); msg.append(text); String s=msg.toString(); try{ ps.writeUTF(s); ps.flush();}catch(IOException ee){System.out.println("输出文本错误");} System.out.println("成功输出"); } else { StringBuffer msg=new StringBuffer("MSGTOONE:"); msg.append(indexName+":"+text); String s=msg.toString(); try{ ps.writeUTF(s); ps.flush();}catch(IOException ee){System.out.println("输出文本错误");} System.out.println("成功输出"); } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值