2016-07-22 88 views
0

我做了這個程序,我有一個問題。當客戶端斷開服務器崩潰,我不知道如何解決這個問題。套接字java斷開

import java.io.*; 
    import java.net.*; 
public class clientread extends Thread{ 

Socket sc; 
public int ver=0; 
public clientread(Socket sc) 
{ 
    this.sc=sc; 
} 
public void run() 
{ BufferedReader buf=new BufferedReader(new InputStreamReader(System.in)); 
    while(true){ 
    try{ 
    String mes=buf.readLine(); 
    if(mes.equals("END")) 
    { 
     sc.close(); 
     break; 
    } 

    if(mes!=null) 
    { 
     PrintStream ps=new PrintStream(sc.getOutputStream()); 
     ps.println(mes); 
    } 

    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 
} 

}

import java.net.*; 
    import java.io.*; 
    public class citireserver extends Thread{ 
    Socket sock; 

    public citireserver(Socket sr) 
    { 
     sock=sr; 
    } 
    public void run() 
    { 
     while(true) 
     { 
      try{ 
      BufferedReader buf=new BufferedReader(new InputStreamReader(sock.getInputStream())); 
      String mes=buf.readLine(); 
      if(mes!=null) 
       System.out.println(mes); 

      } 
      catch(Exception e) 
      { 
       e.printStackTrace(); 
      } 


     } 



    } 

} 

第一個從鍵盤讀取消息,並將其發送到服務器,並且服務器將其發送給客戶機的其餘部分,第二個讀出從服務器發送一切並打印出來。我想在第一類中放置一個條件,如果客戶端輸入「END」,它將終止,但不知道要結束所有這些。 這一點,其訪問此兩類

 import java.net.*; 
    public class client { 

    public static void disc(Socket sc) 
    { 
     try{ 
     sc.close(); 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 

    public static void main(String[] args) { 
     try{ 
     Socket sr=new Socket("192.168.0.105",1028); 

      new clientread(sr).start(); 
      new citireserver(sr).start(); 

     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 

    } 

} 


import java.net.*; 
public class server { 

/** 
* @param args 
*/ 
public static void main(String[] args) { 
    System.out.println("the server is running"); 
    try{ 
    ServerSocket sr=new ServerSocket(1028,100); 
    while(true) 
    { 
     new handler(sr.accept()).start(); 
    } 
    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 

}

import java.io.*; 
import java.util.*; 
import java.net.*; 
public class handler extends Thread { 
public static ArrayList<Socket> sock=new ArrayList<Socket>(); 
Socket sc; 
public handler(Socket sc) 
{ 
    this.sc=sc; 
} 
public void check() 
{ 
    if(!sc.isConnected()) 
    { 
     for(int i=0;i<sock.size();i++) 
     if(sock.get(i)==sc) 
      sock.remove(i); 
    } 
} 
public void run() 
{ 
    sock.add(sc); 
    System.out.println("connected"); 
    while(true) 
    { 
     try{ 
    BufferedReader io=new BufferedReader(new InputStreamReader(sc.getInputStream())); 
    String ms=io.readLine(); 
    System.out.println(ms); 
    if(ms.equals("END")) 
     { 

     break; 
     } 
     if(ms!=null) 
     { 
      Iterator<Socket> it=sock.iterator(); 
      while(it.hasNext()) 
      { 
       Socket vv=it.next(); 
       PrintStream ps=new PrintStream (vv.getOutputStream()); 
       ps.println(ms); 
      } 
     } 
    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 
    } 
    try{ 

     sc.close(); 
     check(); 
    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 

}

我認爲,如果把在第一類buf.readline後,如果條件是真的客戶端類然後sc.close並打破。但它什麼也沒做,我得到一個消息,可能是因爲這個套接字在第二類的另一個線程中使用,我不知道如何停止所有這些。我得到了我關閉

java.net.SocketException: Socket is closed at java.net.Socket.getInputStream(Socket.java:876) at citireserver.run(citireserver.java:15)

編輯客戶端這個錯誤:在我與線程解決我要找到另一個

​​

此錯誤出現後,我斷開一個客戶,我認爲它來自事實上,該套接字不會從數組列表中移除,並且它在迭代時會套接在該套接字上。爲什麼它不刪除它? check()有什麼問題?

+1

你能提供堆棧跟蹤嗎? – DAB

+0

你是什麼意思? – user6575913

+0

@ user6575913他意味着你在控制檯中遇到什麼錯誤? – Memfisto

回答

1

readLine()返回null你應該:

  • 終止閱讀
  • 退出循環
  • 關閉套接字。