EOF- и SocketException в простой серверной клиентской программе - PullRequest
0 голосов
/ 16 марта 2019

Сегодня я написал простую серверную клиентскую программу, но у меня есть проблема, и я не знаю почему.Вот мои 3 важных класса (все методы вызываются правильно):

    public class Server {
    private ServerSocket server;
    private ArrayList<Client> clients = new ArrayList<Client>();
    public Server(int port) {
        try {
            server = new ServerSocket(port);
            server.setSoTimeout(900000);
        } catch (IOException e) {
            e.printStackTrace();
        }
        acceptClients();
        Main.frame.log("Server started on port "+port);
    }
    public void acceptClients() {
        Thread t = new Thread() {
            @Override
            public void run() {
                System.out.println("Accepting");
                while(true) {
                    try {
                        Socket client = server.accept();
                        System.out.println("Accepted: "+client.getLocalSocketAddress());
                        clients.add(new Client(client));
                    } catch (IOException e) {
                        e.printStackTrace();
                        break;
                    }
                }
            };
        };
        t.start();
    }

}

    public class Client {
    private static Socket client;
    private static DataOutputStream out;
    private static DataInputStream in;
    public static void main(String[] args) throws UnknownHostException, IOException {
        client = new Socket("localhost", 1567);
        client.setSoTimeout(900000);
        in = new DataInputStream(client.getInputStream());
        out = new DataOutputStream(client.getOutputStream());
        receive();
        send("Hi I am a client!");
    }

    public static void receive() {
        Thread t = new Thread() {
            @Override
            public void run() {
                while (true) {
                    try {
                        String data = in.readUTF();
                        System.out.println("Received: "+data);
                        send("Test");
                    } catch (IOException e) {
                        e.printStackTrace();
                        break;
                    }
                }
            };
        };
        t.start();
    }

    public static void send(String data) {
        try {
            System.out.println("Sending");
            out.writeUTF(data);
            System.out.println("Sent: "+data);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

Обработчик клиента моего сервера:

    public class Client {
    Socket socket;
    DataOutputStream out;
    DataInputStream in;
    public Client(Socket client) {
        socket = client;
        try {
            socket.setSoTimeout(900000);
            in = new DataInputStream(socket.getInputStream());
            out = new DataOutputStream(socket.getOutputStream());
            receive();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void receive() {
        Thread t = new Thread() {
            @Override
            public void run() {
                while (true) {
                    try {
                        process(in.readUTF());
                        in.close();
                        sleep(100);
                    } catch (IOException | InterruptedException e) {
                        e.printStackTrace();
                        break;
                    }
                }
            }
        };
        t.start();
    }
    public void send(String data) {
        try {
            out.writeUTF(data);
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    private void process(String data) {
        Main.frame.log("Received--> "+data);
        send("I received your message!");
    }

}

Когда я выполняю сервер и клиент, все в порядкепока клиент не отправит второе сообщение.Затем я получаю эту ошибку от сервера:

java.net.SocketException: socket closed
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.socketRead(Unknown Source)
    at java.net.SocketInputStream.read(Unknown Source)
    at java.net.SocketInputStream.read(Unknown Source)
    at java.net.SocketInputStream.read(Unknown Source)
    at java.io.DataInputStream.readUnsignedShort(Unknown Source)
    at java.io.DataInputStream.readUTF(Unknown Source)
    at java.io.DataInputStream.readUTF(Unknown Source)
    at de.julian.factoryserver.net.Client$1.run(Client.java:33)

И эту ошибку от моего клиента:

java.io.EOFException
    at java.io.DataInputStream.readUnsignedShort(Unknown Source)
    at java.io.DataInputStream.readUTF(Unknown Source)
    at java.io.DataInputStream.readUTF(Unknown Source)
    at ftc.Client$1.run(Client.java:28)

Я надеюсь, что кто-то может мне помочь!

1 Ответ

1 голос
/ 16 марта 2019

В классе Server, в методе send вы, кажется, закрыли выходной поток, не закрывайте его, просто очистите его

 public void send(String data) {
        try {
            out.writeUTF(data);
            out.close(); // remove this and replace it with out.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

также в recieve вы, кажется, преждевременно закрываете поток ввода

private void receive() {
        Thread t = new Thread() {
            @Override
            public void run() {
                while (true) {
                    try {
                        process(in.readUTF());
                        in.close(); // remove this
                        sleep(100);
                    } catch (IOException | InterruptedException e) {
                        e.printStackTrace();
                        break;
                    }
                }
            }
        };
        t.start();
    }

Примените вышеуказанные исправления, и это должно исправить ваши исключения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...