我做了這個程序,我有一個問題。當客戶端斷開服務器崩潰,我不知道如何解決這個問題。套接字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()有什麼問題?
你能提供堆棧跟蹤嗎? – DAB
你是什麼意思? – user6575913
@ user6575913他意味着你在控制檯中遇到什麼錯誤? – Memfisto