Java NIO를 사용하여 간단한 인스턴트 메신저를 작성하고 있습니다. 해당 클라이언트가 이미 기록 된 연락처와 메시지를 얻을하지 않습니다 exept 그것은 잘 작동하고
이 주 서버의 처리 방법이다.Java NIO - SocketChannels를 사용하여 데이터를 수신 할 때의 문제점
public void process() throws IOException, ClassNotFoundException{
while (true){
selector.select();
Set keys = selector.selectedKeys();
Iterator it = keys.iterator();
while (it.hasNext()){
SelectionKey key = (SelectionKey)it.next();
it.remove();
if (key.isAcceptable()){
/*configuring incoming channel to be non-blocking
and adding it to the clients set*/
}
if (key.isReadable()) {
SocketChannel client = (SocketChannel)key.channel();
/*Message class contains its type, source user name and data.
getMessage() method reads message from SocketChannel*/
Message m = getMessage(client);
switch (m.getType()) {
case LOGIN_REQUESTED:
/*Accept or reject the client log in name
in case of accepting add user with its status
to Map users*/
break;
case CONTACTS_REQUESTED:
/*Here is the problem, client gets only one message
sendMessage() writes the buffer with serialized
message to clients channels*/
for (String name : users.keySet()) {
sendMessage(client, MessageType.CONTACTS_REQUESTED,
name, users.get(name).toString());
}
break;
//Other messages are processing
}
}
}
}
}
클라이언트 방법, 수신 메시지 처리 :
private void processIncomingMessages()
throws IOException, ClassNotFoundException {
ByteArrayInputStream bais;
ObjectInputStream ois;
ByteBuffer buffer = ByteBuffer.allocate(BUFFER_SIZE);
while (true){
selector.select();
Set keys = selector.selectedKeys();
Iterator it = keys.iterator();
while (it.hasNext()){
SelectionKey key = (SelectionKey)it.next();
it.remove();
if (key.isReadable()){
SocketChannel sc = (SocketChannel)key.channel();
buffer.clear();
if (sc.read(buffer) != -1){
buffer.flip();
bais = new ByteArrayInputStream(buffer.array());
ois = new ObjectInputStream(bais);
Message m = (Message)ois.readObject();
/*My castom event serves to notify GUI to update
its contact list. In case of sending CONTACTS_REQUESTED
messages, it gets only one (first?) of them*/
fireNetworkEvent(m);
}
}
}
}
}
을
별도로 보내지는 다른 메시지는 문제없이 클라이언트에게 제공됩니다. 질문이 있으면 질문하십시오. 어떤 도움이
게시 한 코드로 대답하는 것은 불가능합니다. 문제를 설명하는 작은 코드 샘플을 작성해야합니다. 그렇게 할 때 문제가 발생할 수도 있습니다. –