Java - прослушивание сокета с помощью ObjectInputStream - PullRequest
6 голосов
/ 11 августа 2011

Хорошо, у меня есть класс потока, называемый «Клиент», каждый раз, когда сервер принимает соединение, он создает нового клиента .... Метод run прослушивает сообщения от клиента, и я использую ObjectInputStream ..

   do {            
         ObjectInputStream in = null;

        try {
            in = new ObjectInputStream(socket.getInputStream());
            String message = (String) in.readObject();
            System.out.println(message);
            }
            catch (ClassNotFoundException ex) {
                isConnected = false;
                System.out.println("Progoramming Error");
            }
            catch (IOException ex) {
                isConnected = false;
                System.out.println("Server ShutDown");
                System.exit(0);
            }
    } while(isConnected);

Проблема, с которой я столкнулся, заключается в том, что мне нужно создавать новый ObjectInputStream каждый раз, когда он повторяется ... и если я закрываю входной поток в конце цикла и он повторяется снова для другого сообщения, я получу ошибку ... Пожалуйста, помогите

1 Ответ

7 голосов
/ 11 августа 2011

Создайте ObjectInputStream только один раз (вне цикла) для клиентского подключения, затем поместите метод readObject в цикл.

Вот рабочий класс теста:

public class TestPrg {

    public static void main(String... args) throws IOException {
        ServerListener server = new ServerListener();
        server.start();

        Socket socketToServer = new Socket("localhost", 15000);
        ObjectOutputStream outStream = new ObjectOutputStream(socketToServer.getOutputStream());

        for (int i=1; i<10; i++) {
            try {
                Thread.sleep((long) (Math.random()*3000));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("Sending object to server ...");
            outStream.writeObject("test message #"+i);
        }
        System.exit(0);

    }

    static class ServerListener extends Thread {

        private ServerSocket serverSocket;

        ServerListener() throws IOException {
            serverSocket = ServerSocketFactory.getDefault().createServerSocket(15000);
        }

        @Override
        public void run() {
            while (true) {
                try {
                    final Socket socketToClient = serverSocket.accept();
                    ClientHandler clientHandler = new ClientHandler(socketToClient);
                    clientHandler.start();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    static class ClientHandler extends Thread{
        private Socket socket;
        ObjectInputStream inputStream;

        ClientHandler(Socket socket) throws IOException {
            this.socket = socket;
            inputStream = new ObjectInputStream(socket.getInputStream());
        }

        @Override
        public void run() {
            while (true) {
                try {
                    Object o = inputStream.readObject();
                    System.out.println("Read object: "+o);
                } catch (IOException e) {
                    e.printStackTrace();

                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
            }
        }
    }

}

В этомПример Строки отправляются через ObjectStream.Если вы получаете ClassNotFoundException (http://download.oracle.com/javase/6/docs/api/java/io/ObjectInputStream.html#readObject()) и используете независимую клиентскую и серверную программу), вы можете проверить, есть ли у клиента и сервера класс объекта для отправки в их путях классов.

...