Mina框架,服务器端通过键盘录入向客户端发送消息,不能发送,原因?
服务器端代码:public class MinaServer {
private static int PORT = 3005;
public static void main(String[] args) {
IoAcceptor acceptor = null; // 创建连接
try {
// 创建一个非阻塞的server端的Socket
acceptor = new NioSocketAcceptor();
// 设置过滤器(使用Mina提供的文本换行符编解码器)
acceptor.getFilterChain().addLast( //添加消息过滤器
"codec",
new ProtocolCodecFilter(new TextLineCodecFactory(Charset
.forName("UTF-8"),
LineDelimiter.WINDOWS.getValue(),
LineDelimiter.WINDOWS.getValue())));
// 设置读取数据的缓冲区大小
acceptor.getSessionConfig().setReadBufferSize(2048);
// 读写通道10秒内无操作进入空闲状态
acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 20);
// 绑定逻辑处理器
acceptor.setHandler(new MinaServerHandler()); // 添加业务处理
// 绑定端口
acceptor.bind(new InetSocketAddress(PORT));
System.out.println("服务端启动 开始监听端口:" + PORT);
} catch (Exception e) {
e.printStackTrace();
}
}
MinaServerHandler类:public class MinaServerHandler extends IoHandlerAdapter {
private Scanner scannerIn;
// 当客户端发送的消息到达时:
@Override
public void messageReceived(IoSession session, Object message)
throws Exception {
System.out.println("客户端"+session.getRemoteAddress()+"说:" + message);
if ("bye".equals(message)) { // 服务端断开连接的条件
session.close();
}
//write the received data back to remote peer
/*Date date = new Date();
session.write("服务器:"+date);*/
scannerIn = new Scanner(System.in); 客户端发送完一次消息后,再次发送时在这里会狂等,服务器端不能再收到消息,也不能回复消息,不知道为什么?
while (scannerIn.hasNext()) {
session.write(scannerIn.next());// 发送键盘录入消息
}
}
while (scannerIn.hasNext()) {
session.write(scannerIn.next());// 发送键盘录入消息
}
把这部分代码放到一个线程里,这部分代码会阻塞mina的线程
客户端发送键盘录入的一段代码:
connector.setHandler(new MinaClient1Handler());// 添加业务处理IoSession session = null;
try {
ConnectFuture future = connector.connect(new InetSocketAddress(
HOST, PORT));// 创建连接
future.awaitUninterruptibly();// 等待连接创建完成
session = future.getSession();// 获得session
scannerIn = new Scanner(System.in);
while (scannerIn.hasNext()) {
String readLine = scannerIn.next();
session.write(readLine);// 发送消息
}
} catch (Exception e) {
System.out.println("客户端链接异常..." + e);
}
finally
{
scannerIn.close();
}