zoukankan      html  css  js  c++  java
  • mina通信 demo

    1,要用到4个jar

    2,服务端

    package mina.server;

    import java.io.IOException;
    import java.net.InetSocketAddress;


    import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
    import org.apache.mina.core.session.IdleStatus;
    import org.apache.mina.filter.codec.ProtocolCodecFilter;
    import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;
    import org.apache.mina.transport.socket.SocketAcceptor;
    import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;


    public class MainServer {
    private final static Logger log = LoggerFactory
    .getLogger(MainServer.class);

    private static MainServer mainServer = null;
    private SocketAcceptor acceptor = new NioSocketAcceptor();
    private DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();
    private int bindPort = 8888;

    public static MainServer getInstances() {
    if (null == mainServer) {
    mainServer = new MainServer();
    }
    return mainServer;
    }

    private MainServer() {
    chain.addLast("myChin", new ProtocolCodecFilter(
    new ObjectSerializationCodecFactory()));
    acceptor.setHandler(ServerHandler.getInstances());

    acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 30);
    try {
    acceptor.bind(new InetSocketAddress(bindPort));
    } catch (IOException e) {
    e.printStackTrace();
    }
    }

    public static void main(String[] args) throws Exception {
    MainServer.getInstances();
    }

    }

    package mina.server;

    import java.util.Collection;
    import java.util.Date;

    import org.apache.mina.core.filterchain.IoFilterAdapter;
    import org.apache.mina.core.future.CloseFuture;
    import org.apache.mina.core.future.IoFuture;
    import org.apache.mina.core.future.IoFutureListener;
    import org.apache.mina.core.service.IoHandler;
    import org.apache.mina.core.session.IdleStatus;
    import org.apache.mina.core.session.IoSession;


    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;

    import mina.Object.UserInfo;
    import mina.client.ClientHandler;

    public class ServerHandler extends IoFilterAdapter implements IoHandler {
    private final static Logger log = LoggerFactory
    .getLogger(ServerHandler.class);

    private static ServerHandler samplMinaServerHandler = null;

    public static ServerHandler getInstances() {
    if (null == samplMinaServerHandler) {
    samplMinaServerHandler = new ServerHandler();
    }
    return samplMinaServerHandler;
    }

    private ServerHandler() {

    }


    // 当连接后打开时触发此方法,一般此方法与 sessionCreated 会被同时触发
    @Override
    public void sessionOpened(IoSession session) throws Exception {

    session.write("welcome to the chat room !");
    }


    @Override
    public void sessionClosed(IoSession session) {

    CloseFuture closeFuture = session.close(true);
    closeFuture.addListener(new IoFutureListener<IoFuture>() {
    public void operationComplete(IoFuture future) {
    if (future instanceof CloseFuture) {
    System.out.println("sessionClosed~~~~~~~"+future);
    ((CloseFuture) future).setClosed();
    }
    }
    });
    }


    //服务器接收到数据
    @Override
    public void messageReceived(IoSession session, Object message)
    throws Exception {
    if (message instanceof UserInfo) {
    UserInfo text = (UserInfo) message;
    System.out.println("服务器接收到从客户端的姓名:"+text.getName());
    System.out.println("服务器接收到从客户端的QQ:"+text.getQQNum());
    }else{


    System.out.println(message);
    }


    // 拿到所有的客户端Session
    Collection<IoSession> sessions = session.getService().getManagedSessions().values();
    // 向所有客户端发送数据
    for (IoSession sess : sessions) {
    UserInfo text = (UserInfo) message;
    sess.write(new Date()+":服务器已收到 "+text.getName());
    }
    System.out.println("客户端数量: "+sessions.size());

    }

    @Override
    public void exceptionCaught(IoSession arg0, Throwable arg1)
    throws Exception {

    }

    // 当消息传送到客户端后触发
    @Override
    public void messageSent(IoSession arg0, Object message) throws Exception {
    System.out.println("当消息传送到客户端后触发 "+message );
    }

    // 当一个新客户端连接后触发此方法.
    @Override
    public void sessionCreated(IoSession session) throws Exception {
    System.out.println(" 当一个新客户端连接后触发此方法. " );
    //session.write("welcome to the chat room !");
    }

    // 当连接空闲时触发此方法.
    @Override
    public void sessionIdle(IoSession session, IdleStatus arg1) throws Exception {
    System.out.println(" 当连接空闲时触发此方法 " );
    //session.close(true);
    }

    }

    3,客户端

    package mina.client;

    import java.net.InetSocketAddress;

    import mina.server.MainServer;

    import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
    import org.apache.mina.core.future.ConnectFuture;
    import org.apache.mina.filter.codec.ProtocolCodecFilter;
    import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;
    import org.apache.mina.transport.socket.nio.NioSocketConnector;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;

    public class MainClient {
    private final static Logger log = LoggerFactory
    .getLogger(MainServer.class);

    private static MainClient mainClient = null;
    NioSocketConnector connector = new NioSocketConnector();
    DefaultIoFilterChainBuilder chain = connector.getFilterChain();

    public static MainClient getInstances() {
    if (null == mainClient) {
    mainClient = new MainClient();
    }
    return mainClient;
    }

    private MainClient() {

    chain.addLast("myChin", new ProtocolCodecFilter(
    new ObjectSerializationCodecFactory()));//注册

    connector.setHandler(ClientHandler.getInstances());//build

    connector.setConnectTimeout(30);//连接超时

    ConnectFuture cf = connector.connect(new InetSocketAddress("localhost",
    8888));//连接

    cf.awaitUninterruptibly();//等待

    }

    public static void main(String args[]) {
    MainClient.getInstances();
    }

    }

    package mina.client;

    import org.apache.mina.core.service.IoHandlerAdapter;
    import org.apache.mina.core.session.IoSession;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;

    import mina.Object.UserInfo;

    public class ClientHandler extends IoHandlerAdapter {
    private final static Logger log = LoggerFactory
    .getLogger(ClientHandler.class);

    private static ClientHandler samplMinaClientHandler = null;
    public static ClientHandler getInstances() {
    if (null == samplMinaClientHandler) {
    samplMinaClientHandler = new ClientHandler();
    }
    return samplMinaClientHandler;
    }

    private ClientHandler() {

    }


    //当连接打开是调用
    @Override
    public void sessionOpened(IoSession session) throws Exception {

    //session.write("客户端与服务器的会话打开了……");
    UserInfo text=new UserInfo();
    text.setName("梅竹~~~~寒香");
    text.setQQNum("972341215");
    session.write(text);
    }


    @Override
    public void sessionClosed(IoSession session) {

    System.out.println("sessionClosed~~~~~~~"+session);

    }


    //当接收了一个消息时调用;
    @Override
    public void messageReceived(IoSession session, Object message)
    throws Exception {

    System.out.println("xxy~~~~~~~"+message);
    session.write("^^^^^^^^^^^^");


    }


    //当一个消息被(IoSession#write)发送出去后调用;
    @Override
    public void messageSent(IoSession session, Object obj) throws Exception {

    //session.write("GGGGGGGGGGGGGGGG");
    System.out.println("客户端已经向服务器发送了:"+(String)obj+"uuuuuuuuu"+session);
    }
    }

    4,测试

    先run服务端,再run客户端

    OVER!!!

  • 相关阅读:
    Eclipse安装Hadoop插件
    (转)Ubuntu14.0.4中hadoop2.4.0伪分布模式配置
    Hadoop--DataNode无法启动
    启动与关闭hadoop
    hadoop中执行命令时发生错误
    strings命令
    Deriving data from ElasticSearch Engine
    elasticsearch data importing
    reading words in your computer and changing to female voice, linux festival text2wave saving wav files
    DDNS client on a Linux machine
  • 原文地址:https://www.cnblogs.com/xiexy/p/4173154.html
Copyright © 2011-2022 走看看