2011-08-11 3 views
5

그래, 서버가 새로운 클라이언트를 만드는 연결을 수락 할 때마다 '클라이언트'라는 스레드 클래스가 있습니다 .... 실행 메서드는 클라이언트와 i에서 메시지를 수신합니다. 내가 루프의 끝에서 입력 스트림을 닫고 경우 Java - 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에 ..

을 useing하고하는 이유는 새로운 ObjectInputStream에 그것을 루프마다 작성해야 할 것입니다 ... 그리고 루프 다시 다른 메시지가 나타납니다. 오류가 발생합니다.

+2

당신은 할 필요가 없으며 그렇게해서는 안됩니다. –

+1

그리고 ClassNotFoundException을 얻는 것은 더 이상 연결되지 않았거나 프로그래밍 오류가 아니라는 표시가 아닙니다. * 배포 * 오류를 나타냅니다. – EJP

+0

당신은 어떤 오류가 지나가고 그 코드를 게시해도 도움이 될 것입니다. – beny23

답변

6

클라이언트 연결을 위해 한 번만 (루프 외부에서) ObjectInputStream을 만든 다음 readObject 메소드를 루프에 추가합니다. ObjectStream의 저점을 보내이 예 문자열에서

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(); 
       } 
      } 
     } 
    } 

} 

:

여기에 작동 테스트 클래스입니다. ClassNotFoundException (http://download.oracle.com/javase/6/docs/api/java/io/ObjectInputStream.html#readObject())을 얻었고 독립적 인 클라이언트 및 서버 프로그램을 사용하고 있다면 다음을 확인하십시오. 클라이언트와 서버 모두 클래스 경로로 보낼 객체의 클래스를가집니다.

+0

ohhh i seee ... 그 친구를위한 감사합니다. 나는 나중에 그것을 시도 할 것이다. 그리고 그것이 어떻게되는지에 관해 당신에게 말한다. ... – MurWade

+0

나는 그것을 시험해 보았다. 그리고 그것은 일을 didnt한다. ... – MurWade

+1

잠은 무의미하다. 그리고 읽기 루프는'EOFException'을 잡아서 잡히면 읽기 루프를 벗어나야합니다. 'SocketTimeoutException'을 제외한 다른 모든 IOException도 연결에 치명적이며 읽기 루프를 종료해야합니다. 어떤 이유로 든 읽기 루프가 종료 된 후에 소켓을 닫아야합니다. 너무 많은 나쁜 연습 여기. – EJP