|
@@ -1,6 +1,8 @@
|
|
|
package space.anyi.chatServer;
|
|
package space.anyi.chatServer;
|
|
|
|
|
|
|
|
import lombok.Data;
|
|
import lombok.Data;
|
|
|
|
|
+import space.anyi.chatCommom.Encoder;
|
|
|
|
|
+import space.anyi.chatCommom.Message;
|
|
|
|
|
|
|
|
import java.io.Closeable;
|
|
import java.io.Closeable;
|
|
|
import java.io.IOException;
|
|
import java.io.IOException;
|
|
@@ -50,6 +52,7 @@ public class ReadHandler implements Runnable, Closeable {
|
|
|
if (isExit)break;
|
|
if (isExit)break;
|
|
|
int select = 0;
|
|
int select = 0;
|
|
|
try {
|
|
try {
|
|
|
|
|
+ if (readSelector.isOpen())
|
|
|
select = readSelector.select(100);
|
|
select = readSelector.select(100);
|
|
|
} catch (IOException e) {
|
|
} catch (IOException e) {
|
|
|
e.printStackTrace();
|
|
e.printStackTrace();
|
|
@@ -61,11 +64,22 @@ public class ReadHandler implements Runnable, Closeable {
|
|
|
//拿到channel
|
|
//拿到channel
|
|
|
SelectableChannel channel = selectionKey.channel();
|
|
SelectableChannel channel = selectionKey.channel();
|
|
|
SocketChannel socketChannel = (SocketChannel) channel;
|
|
SocketChannel socketChannel = (SocketChannel) channel;
|
|
|
- //读取数据
|
|
|
|
|
- ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
|
|
|
|
|
|
|
+ //读取数据,分两次,第一次读数据的大小,第二次读具体的数据
|
|
|
|
|
+ ByteBuffer byteBuffer = ByteBuffer.allocate(4);
|
|
|
int len = 0;
|
|
int len = 0;
|
|
|
try {
|
|
try {
|
|
|
len = socketChannel.read(byteBuffer);
|
|
len = socketChannel.read(byteBuffer);
|
|
|
|
|
+ if (len > 0) {
|
|
|
|
|
+ byteBuffer.flip();
|
|
|
|
|
+ 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);
|
|
|
|
|
+ }
|
|
|
} catch (SocketException e) {
|
|
} catch (SocketException e) {
|
|
|
//连接意外中断导致异常
|
|
//连接意外中断导致异常
|
|
|
e.printStackTrace();
|
|
e.printStackTrace();
|
|
@@ -80,12 +94,6 @@ public class ReadHandler implements Runnable, Closeable {
|
|
|
e.printStackTrace();
|
|
e.printStackTrace();
|
|
|
}
|
|
}
|
|
|
byteBuffer.flip();
|
|
byteBuffer.flip();
|
|
|
- if (len > 0) {
|
|
|
|
|
- String msg = new String(byteBuffer.array(), 0, len);
|
|
|
|
|
- //System.out.println(msg);
|
|
|
|
|
- //转发信息
|
|
|
|
|
- writeHandler.sendMessageWithGroup(msg, socketChannel);
|
|
|
|
|
- }
|
|
|
|
|
}
|
|
}
|
|
|
//处理完,移除selectionKey
|
|
//处理完,移除selectionKey
|
|
|
selectionKeys.remove(selectionKey);
|
|
selectionKeys.remove(selectionKey);
|