7

わかりましたので、サーバーが接続を受け入れるたびに「クライアント」と呼ばれるスレッドクラスがあり、新しいクライアントが作成されます..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 を作成する必要があるのはなぜですか...そして、ループの最後で入力ストリームを閉じて、別のメッセージのために再びループすると、エラーが発生します...誰か助けてください

4

2 に答える 2

8

クライアント接続に対して ObjectInputStream を 1 回だけ (ループの外で) 作成し、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()) が発生し、独立したクライアントおよびサーバー プログラムを使用している場合は、クライアントとサーバーの両方が、クラスパスで送信するオブジェクトのクラスを持っています。

于 2011-08-11T07:28:10.703 に答える