Java套接字处理客户端断开连接

Java套接字处理客户端断开连接,java,sockets,Java,Sockets,我正在尝试制作一个聊天程序。我遇到的问题是EchoThread中的循环总是认为连接是正确的。我曾尝试使用if(s.isConnected()==false)但这也不起作用,我也尝试过使用if(s.isClosed()==true)如果您能帮助提前谢谢您。这是我的密码 import java.io.*; import java.net.*; import java.util.ArrayList; public class server { public ObjectInputStream inp

我正在尝试制作一个聊天程序。我遇到的问题是EchoThread中的循环总是认为连接是正确的。我曾尝试使用
if(s.isConnected()==false)
但这也不起作用,我也尝试过使用
if(s.isClosed()==true)
如果您能帮助提前谢谢您。这是我的密码

import java.io.*;
import java.net.*;
import java.util.ArrayList;

public class server {
public ObjectInputStream input;
public ServerSocket server;
public Socket s;
public ObjectOutputStream output;
public ArrayList<ObjectOutputStream> outputs = new ArrayList<ObjectOutputStream>();
public ArrayList<Socket> users = new ArrayList<Socket>();
public class Accept implements Runnable {
    public void run() {
        try {
            server = new ServerSocket(55555, 100);
        } catch (IOException e) {
            e.printStackTrace();
        }
        while(true) {
            try {
                s = server.accept();
                new EchoThread(s).start();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
public class EchoThread extends Thread {
    private Socket s1;
    public EchoThread(Socket s) throws IOException {
        this.s1 = s;
    }
    public void run() {
        users.add(s1);
        try {
            outputs.add(new ObjectOutputStream(s1.getOutputStream()));
            newUser();
        } catch (IOException e) {
            System.out.println("Error 2");
        }
        while(s1.isConnected() == true) {
            // loops until socket looses connection
        }
        System.out.println("Disconnected");
        }
    }
public class check implements Runnable {

    public void run() {
    }

}
public void newUser() {
    try {
        for(ObjectOutputStream o: outputs) {
                o.writeObject(s.getInetAddress() + " Connected");
        }
    } catch (IOException e1) {
        System.out.println("Error 21");
    }
}
server() throws IOException {
    Thread t = new Thread(new Accept());
    t.start();
    Thread ch = new Thread(new check());
    ch.start();
    }
public static void main(String[] args) throws IOException {
    new server();
}
}
import java.io.*;
导入java.net。*;
导入java.util.ArrayList;
公共类服务器{
公共对象输入流输入;
公共服务器套接字服务器;
公共插座;
公共对象输出流输出;
public ArrayList outputs=new ArrayList();
public ArrayList users=new ArrayList();
公共类接受实现可运行{
公开募捐{
试一试{
服务器=新服务器套接字(55555100);
}捕获(IOE异常){
e、 printStackTrace();
}
while(true){
试一试{
s=server.accept();
新的EchoThread.start();
}捕获(IOE异常){
e、 printStackTrace();
}
}
}
}
公共类EchoThread扩展线程{
专用插座s1;
公共EchoThread(套接字)引发IOException{
这是1.s1=s;
}
公开募捐{
用户。添加(s1);
试一试{
add(新的ObjectOutputStream(s1.getOutputStream());
newUser();
}捕获(IOE异常){
System.out.println(“错误2”);
}
while(s1.isConnected()==true){
//循环,直到插座松开连接
}
系统输出打印项次(“断开”);
}
}
公共类检查实现可运行{
公开募捐{
}
}
public void newUser(){
试一试{
for(ObjectOutputStream o:outputs){
o、 writeObject(s.getInetAddress()+“已连接”);
}
}捕获(IOE1异常){
系统输出打印项次(“错误21”);
}
}
服务器()抛出IOException{
线程t=新线程(new Accept());
t、 start();
螺纹ch=新螺纹(新检查());
ch.start();
}
公共静态void main(字符串[]args)引发IOException{
新服务器();
}
}

您必须阅读此内容,您必须使用
read()
方法检查它是否返回
-1

这不是一个有效的循环
isConnected()
是真的,因为您接受了套接字,之后它不会神奇地变为假。当客户端断开连接时,您将从正在调用的读取方法中获得适当的流结束指示

while(s1.isConnected() == true) {