Сокет закрыт, а метод run продолжает работать (java.net.SocketException: Socket is closed)

Рейтинг: 0Ответов: 1Опубликовано: 17.03.2015
    package pq1;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
//java -jar GUIClient.jar localhost 8000

/**
 *
 * @author Даулет
 */
public class ChatServer{
    //public static Vector clients = new Vector();
    public static List clients = new ArrayList();
    public static void main(String[] args) throws Exception {
        ServerSocket server = null;
        Socket socket;
        try
        {
            server = new ServerSocket(8000);
            System.out.println("Server is listening..");
            while(true)
            {
            socket = server.accept();
            clients.add(socket);
            SingleClient ch = new SingleClient((Socket) clients.get(clients.size() -1),clients);
            Thread th = new Thread(ch);
            th.start();
            }
        }catch(Exception e)
        {
            e.printStackTrace();
        }
    }
}

class SingleClient implements Runnable
{
    public Socket s;
    public static List clients = new ArrayList();
    public SingleClient(Socket s, List client)
    {
        this.s = s;
        clients = client;
    }
    @Override
    public void run() { 
        while(true)
        {
            try
            {
                DataInputStream dis = new DataInputStream(s.getInputStream());
                String data = dis.readUTF();
                System.out.println(data);

                String[] mass = data.split("\\^");
                String type = mass[0];
                String alias_hostname = mass[1];
                String[] mass2 = alias_hostname.split("@");
                String alias = mass2[0];
                String hostname = mass2[1];
                switch (type) {
                    case "j":
                        {
                            Date date = new Date();
                            data = "m^Server" + s.getInetAddress() + "^-^" + alias + " has joined from " + hostname + "[" + date + "]";
                            break;
                        }
                    case "p":
                        {
                            Date date = new Date();
                            data = "m^Server" + s.getInetAddress() + "^-^" + alias + " has departed from " + hostname + "[" + date + "]";
                            clients.remove(s);
                            s.close();
                        }
                }
                for(Iterator i = clients.iterator(); i.hasNext();)
                {
                    Socket socket = (Socket) i.next();
                    DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
                    dos.writeUTF(data);
                }
            }catch(Exception e)
            {
                e.printStackTrace();
            }
        }
    }
}

В случае "p" socket закрывается, и я не знаю, как сделать так, чтобы данный поток, в котором выполняется данный метод run, закрылся. :(

Ругается на DataInputStream dis = new DataInputStream(s.getInputStream());.

Сокет-то закрыт.

Вот stacktrace:

java.net.SocketException: Socket is closed
    at java.net.Socket.getInputStream(Socket.java:903)
    at pq1.SingleClient.run(ChatServer.java:61)
    at java.lang.Thread.run(Thread.java:745)

Ответы

▲ 1Принят

Ну так вы реагируйте на исключение иначе, кроме как выводить его стектрейс. Например завершите бесконечный цикл метода run с помощью return/