2016-07-22 86 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你应该:

  • 终止阅读
  • 退出循环
  • 关闭套接字。