|
|
@@ -12,6 +12,8 @@ import java.nio.channels.SelectableChannel;
|
|
|
import java.nio.channels.SelectionKey;
|
|
|
import java.nio.channels.Selector;
|
|
|
import java.nio.channels.SocketChannel;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.Map;
|
|
|
import java.util.Objects;
|
|
|
import java.util.Set;
|
|
|
|
|
|
@@ -26,6 +28,7 @@ import java.util.Set;
|
|
|
public class ReadHandler implements Runnable, Closeable {
|
|
|
private Selector readSelector;
|
|
|
private WriteHandler writeHandler;
|
|
|
+ private Map<String,SocketChannel> userChannels = new HashMap<>();
|
|
|
private boolean isExit = false;
|
|
|
|
|
|
public ReadHandler(Selector readSelector) {
|
|
|
@@ -74,11 +77,40 @@ public class ReadHandler implements Runnable, Closeable {
|
|
|
int size = byteBuffer.getInt();
|
|
|
byteBuffer = ByteBuffer.allocate(size);
|
|
|
len = socketChannel.read(byteBuffer);
|
|
|
- //byteBuffer.flip();
|
|
|
Message message = Encoder.decode(byteBuffer);
|
|
|
- //System.out.println(msg);
|
|
|
- //转发信息
|
|
|
- writeHandler.sendMessageWithGroup(message, socketChannel);
|
|
|
+ //信息处理
|
|
|
+ if (message.getType() == Message.MessageType.USER) {
|
|
|
+ //用户信息
|
|
|
+ {
|
|
|
+ //转发信息
|
|
|
+ writeHandler.sendMessageWithGroup(message, socketChannel);
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ //系统消息
|
|
|
+ switch (message.getOperate()){
|
|
|
+ case Message.OperateType.LOGIN:
|
|
|
+ //登录
|
|
|
+ String username = message.getSource();
|
|
|
+ if (userChannels.containsKey(username) && Message.MessageTarget.SERVER.equals(username)) {
|
|
|
+ //用户名重复
|
|
|
+ }else{
|
|
|
+ //用户名保存到对应的selectionKey上,之后需要可以从里面取出
|
|
|
+ selectionKey.attach(username);
|
|
|
+ //保存用户名到连接的映射
|
|
|
+ userChannels.put(username, socketChannel);
|
|
|
+ //广播用户上线
|
|
|
+ message = new Message();
|
|
|
+ message.setSource(Message.MessageTarget.SERVER);
|
|
|
+ message.setTarget(Message.MessageTarget.GROUP);
|
|
|
+ message.setContent(username+"上线了");
|
|
|
+ writeHandler.sendMessageWithGroup(message, socketChannel);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ System.err.println("未知操作");
|
|
|
+ System.err.println(message);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
} catch (SocketException e) {
|
|
|
//连接意外中断导致异常
|