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!!!

  • 相关阅读:
    winform 异步更新ui
    定时器的写法 winform
    延迟加载
    使用VS分析程序性能
    win7 C/C++,QT安装环境总结
    论文总结
    天舟一号
    硬盘 SMART 检测参数详解[转]
    碧桃花
    在C的头文件中定义的结构体,如何在cpp文件中引用
  • 原文地址:https://www.cnblogs.com/xiexy/p/4173154.html
Copyright © 2011-2022 走看看