2013-07-14 3 views
0

내 문제의 배경을 제공하기 만하면됩니다. 나는 클라이언트 서버 애플리케이션을 작성하고있다. 클라이언트가 처음 연결될 때 서버는 데이터베이스에 액세스하고 for 루프의 objectoutputstream에 오브젝트를 작성하여 특정 테이블의 모든 항목을 클라이언트로 보냅니다.readObject 메소드는받은 첫 번째 객체 만 읽습니다.

문제는 클라이언트가 보내는 첫 번째 개체 만 읽는 것입니다. 나는 새로운 객체를 생성 및 검증을위한 서버로 보낼 경우에도 클라이언트는 서버가 다시 데이터베이스에 삽입 한 후 보낼 때에 ... 데리러 코드에서 추출하지 않습니다

서버 :

public void loadClients() 
{ 

    ArrayList <Client> list = dBCon.loadClients(); 
    try 
    { 
     for (int i =0; i<list.size();i++) 
     { 
      sendtoClient(list.get(i)); 
     } 
    } 
    catch (IOException e) 
    { 
     e.printStackTrace(); 
    } 

} 

public void sendtoClient(Object obj) throws IOException 
{ 
    _out.writeObject(obj); 
    _out.flush(); 
    _out.reset(); 

} 

클라이언트 :

socket = new Socket("localhost", 4447); 
ois = new ObjectInputStream(socket.getInputStream()); 
oos = new ObjectOutputStream(socket.getOutputStream()); 
Object objIn = ois.readObject(); 
Client client = (Client)objIn; 
switch(client.actionType) 
{ 
    case ("ADD"): 
    { 
     if(clientFrame.tbDeals!=null) 
     { 
      clientFrame.tbDeals.addClient(client); 
      break; 
     } 
     else 
     { 
      clientList.add(client); 
      System.out.println(client.clientName); 
      break; 

     } 
    } 

} 

편집 : 나뿐만 아니라 클라이언트 측에서 while 루프와 노력했다. 그런 다음 ois.available()은 0을 반환합니다.

+2

클라이언트 측에서 * 정확히 * 하나의 객체를 읽고 있습니다. 왜 둘 이상이있을 거라 기대하니? 예, while 루프를 사용합니다. 아니요, 거의'available() '를 사용하는 경우는 거의 없습니다. 대부분의 경우에 그렇게 생각하지 않습니다. Java의 기본 입출력이 차단됩니다. –

+0

available()은 스트림 종료에 대한 유효한 테스트가 아닙니다. Javadoc을 보라. 그것은 다른 용도로는별로 쓸모가 없습니다. – EJP

+0

안녕하세요, 답변 주셔서 감사합니다, 나는 실제로 질문을 한 후에 그것을 스스로 해결했습니다. 나는 객체 배열을 가진 또 다른 래퍼 클래스를 만들었고 래퍼 클래스의 인스턴스에서 원래 보내야하는 모든 객체를 포함했습니다. 지금 그것은 잘 작동합니다! 이 문제를 겪은 다른 사람들에게 : 내가했던 것처럼 객체를 개별적으로 보내지 말고 배열에 넣고 배열을 직렬화하십시오. 타이는 대답 한 모든 사람들에게 매우 중요합니다! –

답변

2

정확히 개의 객체가 클라이언트 측에 있습니다. 그것이 당신이 얻는 모든 것입니다.

available()은 Java에서 기본 IO를 수행 할 때 거의 사용되지 않으며 일반적으로 생각하는대로 수행하지 않습니다.

다른 모든 기본 Java IO와 마찬가지로 에서 읽기가 차단됩니다. readObject()을 사용하면 개체 또는 예외가 발생합니다. as noted in the javadoc

받을 개체의 수를 모르고 연결이 유지 될 것으로 예상되는 경우 루프에서이 작업을 처리하는 가장 단순한 예입니다. open :

while (true) { 

    try { 
     Object o = ois.readObject(); 
     /// do something with the object you just read 
    } catch (EOFException e) { 
     System.out.println("remote connection closed!"); 
     e.printStackTrace(); 
     break; 
    } 
} 
+0

+1하지만 베팅 할 필요가 없습니다. 확실하지 않은 경우 EOFException을 별도로 catch해야합니다. – EJP

+0

@EJP - 나는 Javadoc에서 벗어나고 있었다. 명시 적으로'EOFException'을 던지거나'IOEXception'을 감싸는가? –

+0

'명시 적으로'무슨 뜻인지 모르겠지만 readLine()을 제외한 모든 readXXX() 메서드는 스트림 끝에서 EOFException을 throw합니다. readLine()은 null을 반환합니다. 일반 read() 메소드는 완전성을 위해 -1을 리턴합니다. – EJP

관련 문제