2011-06-20 74 views
0

我只是想创建一个简单的MINA服务器和客户端进行评估。这是我的代码。关于简单的MINA客户端和服务器的问题

public class Server { 

private static final int PORT = 8080; 

static class ServerHandler extends IoHandlerAdapter { 
    @Override 
    public void exceptionCaught(IoSession session, Throwable cause) throws Exception { 
     cause.printStackTrace(); 
    } 

    @Override 
    public void sessionCreated(IoSession session) { 
     System.out.println("session is created"); 
     session.write("Thank you"); 
    } 

    @Override 
    public void sessionClosed(IoSession session) throws Exception { 
     System.out.println("session is closed."); 
    } 

    @Override 
    public void messageReceived(IoSession session, Object message) { 
     System.out.println("message=" + message); 
     session.write("Reply="+message); 
    } 
} 

/** 
* @param args 
*/ 
public static void main(String[] args) throws Exception { 
    SocketAcceptor acceptor = new NioSocketAcceptor(); 
    acceptor.getFilterChain().addLast("logger", new LoggingFilter()); 
    acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8")))); 
    acceptor.setHandler(new Server.ServerHandler()); 
    acceptor.getSessionConfig().setReadBufferSize(2048); 
    acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10); 
    acceptor.bind(new InetSocketAddress(PORT)); 
    System.out.println("Listening on port " + PORT); 
    for (;;) { 
     Thread.sleep(3000); 
    } 
} 

}

public class Client { 
private static final int PORT = 8080; 

private IoSession session; 
private ClientHandler handler; 
public Client() { 
    super(); 
} 

public void initialize() throws Exception { 
    handler = new ClientHandler(); 
    NioSocketConnector connector = new NioSocketConnector(); 
    connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8")))); 
    connector.getFilterChain().addLast("logger", new LoggingFilter()); 
    connector.setHandler(handler); 
    for (;;) { 
     try { 
      ConnectFuture future = connector.connect(new InetSocketAddress(PORT)); 
      future.awaitUninterruptibly(); 
      session = future.getSession(); 
      break; 
     } catch (RuntimeIoException e) { 
      System.err.println("Failed to connect."); 
      e.printStackTrace(); 
      Thread.sleep(5000); 
     } 
    } 
    if (session == null) { 
     throw new Exception("Unable to get session"); 
    } 
    Sender sender = new Sender(); 
    sender.start(); 

    session.getCloseFuture().awaitUninterruptibly(); 
    connector.dispose(); 
    System.out.println("client is done."); 
} 

/** 
* @param args 
*/ 
public static void main(String[] args) throws Exception { 
    Client client = new Client(); 
    client.initialize(); 
} 

class Sender extends Thread { 
    @Override 
    public void run() { 
     try { 
      Thread.sleep(3000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     handler.messageSent(session, "message"); 
    } 
} 

class ClientHandler extends IoHandlerAdapter { 

    @Override 
    public void sessionOpened(IoSession session) { 

    } 

    @Override 
    public void messageSent(IoSession session, Object message) { 
     System.out.println("message sending=" + message); 
     session.write(message); 
    } 

    @Override 
    public void messageReceived(IoSession session, Object message) { 
     System.out.println("message receiving "+ message); 
    } 

    @Override 
    public void exceptionCaught(IoSession session, Throwable cause) { 
     cause.printStackTrace(); 
    } 
} 

}

当我执行这个代码,客户端似乎保持发送消息,而不是停止发送之后。它看起来在MINA代码中有一个递归调用。我知道我做错了什么。

有人可以告诉我如何解决这个问题吗?

谢谢。

回答

0

尝试初始化并开始sender和内sessionOpened使用session(ClientHandler的)