我做了这个程序,我遇到了问题。当客户端断开服务器崩溃,我不知道如何解决这个问题。
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之后将if放在第一个类中,如果条件为true,那么sc.close并且break。但它没有做任何事情,我得到一个消息可能是因为这个套接字在第二个类的另一个线程中使用,我不知道如何停止所有这一切。我在关闭的客户端中收到此错误
java.net.SocketException:Socket关闭了 java.net.Socket.getInputStream(Socket.java:876)at citireserver.run(citireserver.java:15)
编辑:我用线程解决后,我得到另一个
错误:java.net.SocketException:Socket已关闭 在java.net.Socket.getOutputStream(Socket.java:916) 在handler.run(handler.java:41)
在断开一个客户端之后出现此错误,我认为它来自于这个套接字没有从arraylist中删除的事实,并且当它迭代时它继续该套接字。为什么它不会删除它? check()有什么问题?
答案 0 :(得分:1)
当readLine()
返回null时,您应该: