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

3

我正在尝试制作一个聊天程序。我遇到的问题是,我的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();
}
}
2个回答

5

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

这不是一个有效的循环。 isConnected() 是 true,因为你接受了套接字,它不会在此后神奇地变为 false。当客户端断开连接时,无论你调用哪个读取方法,都会得到适当的流结束指示。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接