2013-11-23 4 views
-2

После установления соединения с клиентом, если данные не получены в течение некоторого времени, как закрыть клиентское соединение?Как закрыть клиентский сокет в java?

public class Server_X_Client { 
public static void main(String args[]){ 


Socket s=null; 
ServerSocket ss2=null; 
System.out.println("Server Listening......"); 
try{ 
    ss2 = new ServerSocket(4445); // can also use static final PORT_NUM , when defined 
ss2.setSoTimeout(5000); 
} 
catch(IOException e){ 
e.printStackTrace(); 
System.out.println("Server error"); 

} 

while(true){ 
    try{ 
     s= ss2.accept(); 
     System.out.println("connection Established with --> "+s.getRemoteSocketAddress()); 
     ServerThread st=new ServerThread(s); 
     st.start(); 

    } 

catch(Exception e){ 
    e.printStackTrace(); 
    System.out.println("Connection Error"); 

} 
} 

} 

} 

класс ServerThread расширяет тему {

String line=null; 
BufferedReader is = null; 
PrintWriter os=null; 
Socket s=null; 

public ServerThread(Socket s){ 
    this.s=s; 
} 

public void run() { 
try{ 
    is= new BufferedReader(new InputStreamReader(s.getInputStream())); 
// 
    os=new PrintWriter(s.getOutputStream()); 

}catch(IOException e){ 
    System.out.println("IO error in server thread"); 
} 

try { 
    line=is.readLine(); 

    while(line.compareTo("QUIT")!=0){ 

     os.println(line); 
     os.flush(); 
    System.out.println("Data recieved is : "+ line); 

     line=is.readLine(); 
    } 
} catch (IOException e) { 

    line=this.getName(); //reused String line for getting thread name 
    System.out.println("IO Error/ Client "+line+" terminated abruptly"); 
} 
catch(NullPointerException e){ 
    line=this.getName(); //reused String line for getting thread name 
    System.out.println("Client "+line+" Closed"); 
} 

finally{  
try{ 
    System.out.println("Connection Closing.."); 
    if (is!=null){ 
     is.close(); 
     System.out.println(" Socket Input Stream Closed"); 
    } 

    if(os!=null){ 
     os.close(); 
     System.out.println("Socket Out Closed"); 
    } 
    if (s!=null){ 
    s.close(); 
    System.out.println("Socket Closed"); 
    } 

    } 
catch(IOException ie){ 
    System.out.println("Socket Close Error"); 
} 
}//end finally 
} 
} 

ответ

1

Вы можете использовать setSoTimeOut(int timeout) функцию. Смотрите здесь Socket как использовать setSoTimeOut функция.

Включить/отключить SO_TIMEOUT с указанным таймаутом в миллисекундах. С этим параметром, установленным на ненулевой тайм-аут, вызов read() в InputStream , связанный с этим гнездом, будет блокировать только это время . Если истекает время ожидания, возникает java.net.SocketTimeoutException, хотя сокет по-прежнему равен . Опция должна быть активирована до того, как будет введена операция блокировки . Тайм-аут должен быть> 0. Время ожидания интерпретируется как бесконечный тайм-аут.

+0

спасибо за Ваш ответ ... –

+0

Я сделал это раньше, но он постоянно печатать «исключение гнезда» –

+0

какого времени вы дали внутри функции setSoTimeOut()? –

Смежные вопросы