내 문제의 배경을 제공하기 만하면됩니다. 나는 클라이언트 서버 애플리케이션을 작성하고있다. 클라이언트가 처음 연결될 때 서버는 데이터베이스에 액세스하고 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을 반환합니다.
클라이언트 측에서 * 정확히 * 하나의 객체를 읽고 있습니다. 왜 둘 이상이있을 거라 기대하니? 예, while 루프를 사용합니다. 아니요, 거의'available() '를 사용하는 경우는 거의 없습니다. 대부분의 경우에 그렇게 생각하지 않습니다. Java의 기본 입출력이 차단됩니다. –
available()은 스트림 종료에 대한 유효한 테스트가 아닙니다. Javadoc을 보라. 그것은 다른 용도로는별로 쓸모가 없습니다. – EJP
안녕하세요, 답변 주셔서 감사합니다, 나는 실제로 질문을 한 후에 그것을 스스로 해결했습니다. 나는 객체 배열을 가진 또 다른 래퍼 클래스를 만들었고 래퍼 클래스의 인스턴스에서 원래 보내야하는 모든 객체를 포함했습니다. 지금 그것은 잘 작동합니다! 이 문제를 겪은 다른 사람들에게 : 내가했던 것처럼 객체를 개별적으로 보내지 말고 배열에 넣고 배열을 직렬화하십시오. 타이는 대답 한 모든 사람들에게 매우 중요합니다! –