This repository has been archived on 2021-12-05. You can view files and clone it, but cannot push or open issues or pull requests.
java-nio-server/src/main/java/com/jenkov/nioserver/SocketSwitch.java

88 lines
2.6 KiB
Java

package com.jenkov.nioserver;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.*;
/**
*
* Todo - rename class to SocketWriter ?
*
* Created by jjenkov on 20-10-2015.
*/
public class SocketSwitch {
private Map<Long, Socket> socketMap = new HashMap<>();
private Map<Long, IMessageWriter> messageWriterMap = new HashMap<>();
private Set<Socket> socketsToCancel = new HashSet<>();
private Set<Socket> socketsToRegister = new HashSet<>();
public Set<Socket> getSocketsToCancel() {
return this.socketsToCancel;
}
public Set<Socket> getSocketsToRegister() {
return this.socketsToRegister;
}
//todo change putMessageWriter to registerSocket();
public void registerSocket(Socket socket){
System.out.println("Registering socket: " + socket.socketId );
this.socketMap.put(socket.socketId, socket);
this.messageWriterMap.put(socket.socketId, socket.messageWriter);
}
public void enqueueMessage(long socketId, Message message){
IMessageWriter messageWriter = this.messageWriterMap.get(socketId);
if(messageWriter != null){
boolean wasEmpty = messageWriter.isEmpty();
messageWriter.enqueue(message);
if(wasEmpty){
Socket socket = this.socketMap.get(socketId);
if(this.socketsToCancel.contains(socket)){
//Socket already registered with Selector. Remove cancellation request but
// do not re-register socket with Selector
this.socketsToCancel.remove(socket);
} else {
//Socket not currently registered with Selector. Request registration.
this.socketsToRegister.add(socket);
}
}
}
}
public void writeToSocket(Socket socket, ByteBuffer writeByteBuffer) throws IOException {
IMessageWriter messageWriter = messageWriterMap.get(socket.socketId);
if(messageWriter != null){
messageWriter.write(socket, writeByteBuffer);
if(messageWriter.isEmpty()) {
this.socketsToCancel.add(socket);
}
}
}
public void unregisterSocket(long socketId){
System.out.println("Unregistering socket: " + socketId);
this.socketMap.remove(socketId);
//todo in case the message writer should survive a "missing connection" - don't remove it.
this.messageWriterMap.remove(socketId);
}
public void removeMessageWriter(long id){
this.socketMap.remove(id);
}
}