2013-12-18 87 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