mina 简单实例(传送文本的)

SeverTest.java

/**
 * Copyright TopScientific Systems Ltd. 2005-2007
 * All right reserved.
 */
package org.apache.mina.mytest;


import java.net.InetSocketAddress;

import org.apache.mina.common.DefaultIoFilterChainBuilder;
import org.apache.mina.common.IoAcceptor;
import org.apache.mina.common.IoAcceptorConfig;
import org.apache.mina.filter.LoggingFilter;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.nio.SocketAcceptor;
import org.apache.mina.transport.socket.nio.SocketAcceptorConfig;

/**
 * @author zkchen
 *
 */
public class SeverTest {

 private static final int PORT = 1234;
 public static void main(String[] args) throws Exception {

  IoAcceptor acceptor = new SocketAcceptor();
  IoAcceptorConfig config = new SocketAcceptorConfig();
  DefaultIoFilterChainBuilder chain = config.getFilterChain();

  // Add SSL filter if SSL is enabled.

  chain.addLast("codec", new ProtocolCodecFilter(
    new TextLineCodecFactory()));

  addLogger(chain);

  // Bind
  acceptor.bind(new InetSocketAddress(PORT), new EchoProtocolHandler(
    ), config);

  System.out.println("Listening on port " + PORT);

 }

 private static void addLogger(DefaultIoFilterChainBuilder chain)
   throws Exception {
  chain.addLast("logger", new LoggingFilter());
  System.out.println("Logging ON");
 }
}

EchoProtocolHandler.java

 

package org.apache.mina.mytest;

import java.util.Hashtable;

import java.util.Iterator;

import java.util.Random;

import org.apache.mina.common.ByteBuffer;

import org.apache.mina.common.IdleStatus;

import org.apache.mina.common.IoHandler;

import org.apache.mina.common.IoHandlerAdapter;

import org.apache.mina.common.IoSession;

import org.apache.mina.common.TransportType;

import org.apache.mina.filter.SSLFilter;

import org.apache.mina.transport.socket.nio.SocketSessionConfig;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

 

public class EchoProtocolHandler extends IoHandlerAdapter {

 private static final Logger log = LoggerFactory

   .getLogger(EchoProtocolHandler.class);

 private Hashtable<IoSession, String> clients = new Hashtable<IoSession, String>();

 private Random random = new Random();;

 private static int user = 0;

 public EchoProtocolHandler() {

  super();

 }

 public void sessionCreated(IoSession session) {

  if (session.getTransportType() == TransportType.SOCKET) {

   ((SocketSessionConfig) session.getConfig())

     .setReceiveBufferSize(2048);

  }

  session.setIdleTime(IdleStatus.BOTH_IDLE, 10);

  // We're going to use SSL negotiation notification.

  session.setAttribute(SSLFilter.USE_NOTIFICATION);

  // session.write("create a session");

 }

 public void sessionOpened(IoSession session) {

  // UserInfo userInfo = new UserInfo();

  // userInfo.isValid = false;

  // session.setAttachment(userInfo);

  String userName = "client" + (++user);

  session.write("session open");

  clients.put(session, userName);

  session.write("LOGIN OK");

  broadcast("The user " + user + " has joined the chat session. "

    + this.getNumberOfUsers());

  log.info("a new client connected,but didn't join yet!"); // 通话session

  // 打开以后促发的事件处理

  this.sendMessage(session);

 }

 public void sessionClosed(IoSession session) {

  log.info("a client closed,and now count is : "

    + this.getNumberOfUsers()); // 通话session

  String user = clients.get(session);

  clients.remove(session);

  broadcast("The user " + user + " has left the chat session.");

  // 关闭以后促发的事件处理

 }

 public void sessionIdle(IoSession session, IdleStatus status) {

  log.info("*** IDLE #" + session.getIdleCount(IdleStatus.BOTH_IDLE)

    + " ***");

  // session.write("sessionidle");

 }

 public void exceptionCaught(IoSession session, Throwable cause) {

  cause.printStackTrace();

  session.close();

 }

 public void messageReceived(IoSession session, Object message)

   throws Exception {

  if (!(message instanceof ByteBuffer)) {

   return;

  }

  ByteBuffer rb = (ByteBuffer) message;

  // Write the received data back to remote peer

  ByteBuffer wb = ByteBuffer.allocate(rb.remaining());

  wb.put(rb);

  wb.flip();

 }

 public void messageSent(IoSession session, Object message) {

  log.info(">>>>>this is server ,sent the message to client: ");

  log.info("messageSent succful");

  // 发送成功以后会调用这里的函数

  // message 为messageReceived 函数中 write 发送的消息

  // 绝对不要在这里用write 不然要死循环的

 }

 public void sendMessage(IoSession session) {

  int num;

  while(true) {

   try {

    Thread.sleep(1000);

   } catch (InterruptedException e) {

    e.printStackTrace();

   }

   num = random.nextInt();

   Iterator iter = clients.keySet().iterator();

   while (iter.hasNext()) {

    IoSession s = (IoSession) iter.next();

    if (s.isConnected()) {

     s.write("BROADCAST OK " + num);

    }

   }

  }

 }

 public void broadcast(String message) {

//

//  Iterator it=

//  while(it.hasNext())

//  {   System.out.println(clients.get(it.next()));}

  Iterator iter = clients.keySet().iterator();

  while (iter.hasNext()) {

   IoSession s = (IoSession) iter.next();

   if (s.isConnected()) {

    s.write("BROADCAST OK " + message);

   }

  }

  

 

 }

 public int getNumberOfUsers() {

  return clients.size();

 }

}

 

 

ClientTest.java

 

/**
 * Copyright TopScientific Systems Ltd. 2005-2007
 * All right reserved.
 */
package org.apache.mina.mytest;

import java.net.InetSocketAddress;
import java.net.SocketAddress;

import org.apache.mina.common.ConnectFuture;
import org.apache.mina.common.IoConnector;
import org.apache.mina.transport.socket.nio.SocketConnector;
import org.apache.mina.transport.socket.nio.SocketConnectorConfig;

 


/**
 * @author zkchen
 *
 */
public class ClientTest {
 //private  IoSession session;
    public ClientTest() {
   
      IoConnector  ioConnector = new SocketConnector();
      SocketAddress address = new InetSocketAddress("localhost",1234);
         ConnectFuture future1 = ioConnector.connect(address ,new ClientHandler() , new SocketConnectorConfig());
         if( ! future1.isConnected() )
            {
                System.out.println("full is connected");
            }
        future1.join();
              if( ! future1.isConnected() )
              {
                 System.out.println("hsa connected");
              }
              System.out.println(future1);
              System.out.println(future1.getSession());
  
 }
 
 public static void main(String [] args){
  new ClientTest();
 }
 }
 

ClientHandler.java

 

package org.apache.mina.mytest;

import org.apache.mina.common.ByteBuffer;

import org.apache.mina.common.IoFilter;

import org.apache.mina.common.IoHandler;

import org.apache.mina.common.IoHandlerAdapter;

import org.apache.mina.common.IoSession;

import org.apache.mina.filter.LoggingFilter;

import org.apache.mina.filter.codec.ProtocolCodecFilter;

import org.apache.mina.filter.codec.textline.TextLineCodecFactory;

 

/* *

 * @author The Apache Directory Project (mina-dev@directory.apache.org)

 * @version $Rev$, $Date$

 */

public class ClientHandler extends IoHandlerAdapter {

 private static IoFilter LOGGING_FILTER = new LoggingFilter();

 private static IoFilter CODEC_FILTER = new ProtocolCodecFilter(

   new TextLineCodecFactory());

 public void sessionCreated(IoSession session) throws Exception {

  session.getFilterChain().addLast("codec", CODEC_FILTER);

  session.getFilterChain().addLast("logger", LOGGING_FILTER);

 }

 public void sessionOpened(IoSession session) throws Exception {

  session.write("client open");

 }

 public void messageReceived(IoSession session, Object message)

   throws Exception {

  if (!(message instanceof ByteBuffer)) {

   return;

  }

  ByteBuffer rb = (ByteBuffer) message;

  // Write the received data back to remote peer

  ByteBuffer wb = ByteBuffer.allocate(rb.remaining());

  wb.put(rb);

  System.out.println(wb.toString());

  wb.flip();

  

 }

 public void messageSent(IoSession session, Object message) {

//  session.write("hello");

  // 发送成功以后会调用这里的函数

  // message 为messageReceived 函数中 write 发送的消息

  // 绝对不要在这里用write 不然要死循环的

 }

 public void sessionClosed(IoSession session) throws Exception {

 }

}

 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值