2013-12-18 85 views
0

这里是我的TcpClient类:不能断开插座

import java.io.*; 
import java.net.*; 

public class tcpClient 
{ 
private String _ip; 
private int _port; 
private Socket _clientSocket; 

public tcpClient(String IP, int Port) 
{ 
    _ip = IP; 
    _port = Port; 
} 

public boolean createSocket() 
{ 
    boolean retSt = false; 

    try 
    { 
     _clientSocket = new Socket(this._ip, this._port); 
     retSt = true; 
    } 
    catch (UnknownHostException e) 
    { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    catch (IOException e) 
    { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    return retSt; 
} 

public boolean disposeSocket() 
{ 
    boolean retSt = false; 

    try 
    { 
     _clientSocket.shutdownInput(); 
     _clientSocket.shutdownOutput(); 
     _clientSocket.close(); 

     retSt = true; 
    } 
    catch (IOException e) 
    { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    return retSt; 
} 

public boolean isConnected() 
{ 
    return _clientSocket.isConnected(); 
} 
} 

这里是我的主要方法:

import java.io.FileNotFoundException; 
import java.io.PrintWriter; 
import java.io.UnsupportedEncodingException; 
import java.util.Date; 

    public class cos 
    { 
    public static void main(String[] args) 
    { 
    tcpClient client = new tcpClient("192.168.10.39", 1234); 
    client.createSocket(); 
    System.out.println(client.isConnected()); 
    client.disposeSocket(); 
    System.out.println(client.isConnected()); 
    client.createSocket(); 
    System.out.println(client.isConnected()); 
    client.disposeSocket(); 
    System.out.println(client.isConnected()); 
     } 
    } 

这里是我的控制台输出:

true 
true 
true 
true 

为什么不能我从服务器断开连接?

+0

disposesocket正在运行并使用_clientSocket.close()关闭tcp;并且您在关闭时将retSt重置为true。所以它正在返回 –

+0

不!我不回来retSt。 – sanchop22

回答

1

java doc

注:关闭套接字不清除它的连接状态,这意味着 这种方法会为一个封闭的插座返回true(见isClosed())如果 它successfuly连接在被关闭之前。

+0

好的!我的方法是关闭套接字吗?首先关闭输入和输出通道,然后关闭插座。 – sanchop22

+1

是的,虽然调用'close()'会自动关闭输入/输出流,所以你不需要关闭它们。关于套接字是否关闭,请参阅['isClosed()'](http://docs.oracle.com/javase/7/docs/api/java/net/Socket.html#isClosed()) – vandale

+1

@ petre你应该关闭你在套接字周围包裹的最外层输出流或者写入器。你也不需要关闭。 – EJP