mina+map-大师帮忙实现客户端的一对一会话,谢了。

问题描述

大师帮忙实现客户端的一对一会话,谢了。

import java.net.InetSocketAddress;
import java.nio.charset.Charset;

import org.apache.mina.core.service.IoAcceptor;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.LineDelimiter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
*服务端
*/
public class MinaServer {
protected static Logger logger = LoggerFactory.getLogger(MinaServer.class);
static int PORT=7082;
static IoAcceptor acceptor=null;

public static void main(String[] args){
    try{
    acceptor=new NioSocketAcceptor();
    //设置编码过滤器
    acceptor.getFilterChain().addLast("codec",new ProtocolCodecFilter(
                    new TextLineCodecFactory(Charset.forName("UTF-8"),
                            LineDelimiter.WINDOWS.getValue(),
                            LineDelimiter.WINDOWS.getValue())));
    //设置缓冲区的大小
    acceptor.getSessionConfig().setReadBufferSize(1024);
    acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 90);

    acceptor.setHandler(new Myhandler());
    acceptor.bind(new InetSocketAddress(PORT));
    logger.info("服务端启动成功... 端口号为:" + PORT);
    }catch(Exception e){
        logger.error("服务端启动异常....", e);
        e.printStackTrace();
    }
}

}

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

/**
*服务端处理器:

  • */
    public class Myhandler extends IoHandlerAdapter{
    protected static Logger logger = LoggerFactory.getLogger(Myhandler.class);

    // 发送消息异常时触发
    @Override
    public void exceptionCaught(IoSession session, Throwable cause) throws Exception {

    logger.error("服务端发送消息异常"+cause);
    

    }

    // 接收到消息时触发
    @Override
    public void messageReceived(IoSession session, Object message) throws Exception {

      //获取客户端发过来的key
      String key = message.toString();
      logger.info("message :"+message.toString());
    
      String carPark_id = key.substring(key.indexOf("=") + 1);
      logger.info("carPark_id :"+carPark_id);
      //保存客户端的会话session
      SessionMap sessionMap = SessionMap.newInstance();
      sessionMap.addSession(carPark_id, session);
      sessionMap.getSession(key);
    

// String msg=(String) message;
// logger.info("服务端接收到数据"+msg);
// if("exit".equals(msg)){
// session.close(true);
// }
// Date date=new Date();
// SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
// session.write(sdf.format(date));

// //拿到所有的客户端Session
// Collection sessions = session.getService().getManagedSessions().values();
// for (IoSession sess : sessions) {

// sess.write("所有客户端收到消息");

// }

}

// 发送消息成功后触发
@Override
public void messageSent(IoSession session, Object message) throws Exception {

    logger.info("服务端发送信息成功!");
}

// 会话关闭时触发
@Override
public void sessionClosed(IoSession session) throws Exception {

    logger.debug("客户端与服务端断开连接!");
}

// 创建会话时触发
@Override
public void sessionCreated(IoSession session) throws Exception {

    logger.info("sessionCreated");

}

// 会话空闲时触发
// 当连接空闲时被触发。使用IoSessionConfig中的setIdleTime(IdleStatus status, int
// idleTime)方法可以设置session的空闲时间。如果该Session的空闲时间超过设置的值,该方法被触发,可以通过session.getIdleCount(status)来获取sessionIdle被触发的次数。
@Override
public void sessionIdle(IoSession session, IdleStatus status) throws Exception {

    logger.info("服务端进入空闲状态...");

}

// 打开会话时触发
// 会话创建之后--》会话打开
@Override
public void sessionOpened(IoSession session) throws Exception {
      logger.info("服务端与客户端已连接sessionOpened");
}

}

import java.net.InetSocketAddress;
import java.nio.charset.Charset;

import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.core.service.IoConnector;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.LineDelimiter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.nio.NioSocketConnector;
/**

  • 客户端
    */
    public class MinaClient {

    private static String host="127.0.0.1";
    private static int port=7082;
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    IoSession session=null;
    // 创建一个非阻塞的客户端程序
    IoConnector connector=new NioSocketConnector();
    // 设置链接超时时间
    connector.setConnectTimeoutMillis(3000*10);
    //设置过滤器
    connector.getFilterChain().addLast("coderc", new ProtocolCodecFilter(
    new TextLineCodecFactory(Charset.forName("UTF-8"),
    LineDelimiter.WINDOWS.getValue(),
    LineDelimiter.WINDOWS.getValue())));
    connector.setHandler(new MyClientHandler());
    //连接到服务端
    ConnectFuture future=connector.connect(new InetSocketAddress(host,port));
    future.awaitUninterruptibly(); //等待我们的连接
    session=future.getSession();
    session.write("你好!服务大哥");
    session.getCloseFuture().awaitUninterruptibly(); //等待关闭链接
    connector.dispose();
    }

}

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

public class MyClientHandler extends IoHandlerAdapter {
protected static Logger logger = LoggerFactory.getLogger(MyClientHandler.class);

// 发送消息异常时触发
@Override
public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
    logger.debug("客户端发送消息异常exceptionCaught");

}

// 接收到消息时触发
@Override
public void messageReceived(IoSession session, Object message) throws Exception {

// String msg=(String) message;
// logger.info("客户端收到数据:"+msg);
logger.info("-----服务端返回的json数据----");
String s = message.toString();
logger.info("客户端收到消息: :" + s);
logger.info("消息长度为:" + s.length());
}

@Override
public void sessionIdle(IoSession session, IdleStatus status) throws Exception {
    // TODO 自动生成的方法存根
    logger.info("-客户端与服务端连接[空闲] - " + status.toString());
    if(session != null){
        session.close(true);
    }
}

}

import java.util.HashMap;
import java.util.Map;
import org.apache.mina.core.session.IoSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**

  • @Description: 单例工具类,保存所有mina客户端连接
  • @author whl
  • @date 2014-9-29 上午10:09:15
    *
    */
    public class SessionMap {

    private final static Logger LOGGER=LoggerFactory.getLogger(SessionMap.class);

    private static SessionMap sessionMap = null;

    private Mapmap = new HashMap();

    //构造私有化 单例
    private SessionMap(){}

    /**

    • @Description: 获取唯一实例
    • @author whl
    • @date 2014-9-29 下午1:29:33
      */
      public static SessionMap newInstance(){
      LOGGER.debug("SessionMap单例获取---");
      if(sessionMap == null){
      sessionMap = new SessionMap();
      }
      return sessionMap;
      }

    /**

    • @Description: 保存session会话
    • @author whl
    • @date 2014-9-29 下午1:31:05
      */
      public void addSession(String key, IoSession session){
      LOGGER.debug("保存会话到SessionMap单例---key=" + key);
      this.map.put(key, session);
      }

    /**

    • @Description: 根据key查找缓存的session
    • @author whl
    • @date 2014-9-29 下午1:31:55
      */
      public IoSession getSession(String key){
      LOGGER.debug("获取会话从SessionMap单例---key=" + key);
      return this.map.get(key);
      }

    /**

    • @Description: 发送消息到客户端
    • @author whl
    • @date 2014-9-29 下午1:57:51
      */
      public void sendMessage(String[] keys, Object message){
      for(String key : keys){
      IoSession session = getSession(key);
      LOGGER.debug("反向发送消息到客户端Session---key=" + key + "----------消息=" + message);
      if(session == null){
      return;
      }
      session.write(message);

      }
      }

}

解决方案

1.有两个思路,一个是服务器中转方式
2.另外一个方式是让需要通信的客户端都在服务器哪里登记,客户端从服务器获取其他客户端的地址信息,然后直接和其他客户端建立连接。

时间: 2024-09-17 20:18:30

mina+map-大师帮忙实现客户端的一对一会话,谢了。的相关文章

使用Mina框架开发QQ Android 客户端(3) 登陆功能的实现

在博客中有登陆界面的文章http://blog.csdn.net/vestigge/article/details/8124674 就不在重复了,直接看登陆的代码, 用Mina传递字符串上节已经看过了,要实现传递对象,也非常简单,只需要修改一下过滤器: chain.addLast("codec", new ProtocolCodecFilter(new ObjectSerializationCodecFactory())); 在Android客户端,登陆的Activity中: publ

使用Mina框架开发QQ Android 客户端(2) 客户端与服务端的通信

一个简单的例子,对Mina框架有了大体的了解,在上节的基础上,看看 怎样实现客户端与服务端的通信, 废话不多说了,直接看代码: public class Test { public static void main(String[] args) throws Exception{ SocketConnector connector = new NioSocketConnector(); IoFilter filter = new ProtocolCodecFilter(new TextLineC

mina服务端 C语言客户端,怎样进行TLS 单向认证

问题描述 mina服务端 C语言客户端,怎样进行TLS 单向认证 各位老师好: 因项目中用到socket和第三方公司通讯,选择了mina框架(服务端mina java开发,客户端C语言(第三方)),不加tls 客户端(C语言)可以正常通讯, 现要进行tls 单向认证的操作,因对此不了解,客户端说 服务端用CA认证,他们才能读取证书信息,网上搜了一下.都是 在tomcat配置,用openssl 做ca 证书,可是项目没有通过浏览器,只是底层之间的通讯, 请各位老师,帮忙指点!谢谢了

问题-请大师帮忙怎么样快速修内插出来的等高线。

问题描述 请大师帮忙怎么样快速修内插出来的等高线. 请大师帮哈忙.谢谢!请大师帮忙怎么样快速修内插出来的等高线.

数字图像处理-求数字摄影测量和图像处理方面的高手帮忙!求助!必重谢!请私信

问题描述 求数字摄影测量和图像处理方面的高手帮忙!求助!必重谢!请私信 做一个影像特征定位的程序,用VC6.0做,最好可以MFC,如果不会MFC那就不用MFC了,需要先对一幅影像(可以是普通图片)进行点的特征提取,然后再对特征定定位,特征提取算子可以用Moravec算子,fortner算子,harris算子,SUSAN算子,SIFT算子等进行点的特征提取,点特征提取后再进行特征点定位,可以用fortner定位算子,也可以用Wong-Trinder算子,也可以用高精度角点与直线定位算子等等 . 就

mina做服务socket做客户端(发送数据过大拆成了几条ByteBuffer如何接收)

问题描述 我用java的Mina做服务端接受Socket客户端发送过来的信息,但是发送的信息过大,会给拆成了3-4条ByteBuffer,我通过session将他们可以连接起来,但是关键的问题是如果客户端发送的数据特别多,由于使用了线程池可能出现丢弃数据的可能,而且因为数据特别多mina服务端在过滤器中处理混乱不能拼接成一条完整的数据了.请问那位大侠帮忙出个解决的方法让我能够将数据拼接成功谢谢各位 解决方案 解决方案二:我只能提供我做过的,用的不是Mina,是自己的发送和接收:每个超长的分段发送

使用Mina框架开发 QQ Android 客户端(1) Mina初级教程

Apache MINA是一个网络应用程序框架,用来帮助用户简单地开发高性能和高可靠性的网络应用程序.它提供了一个通过Java NIO在不同的传输例如TCP/IP和UDP/IP上抽象的事件驱动的异步API. Apache MINA 也称为: ● NIO 框架库 ● 客户端服务器框架库 ● 一个网络套接字库 MINA虽然简单但是仍然提供了全功能的网络应用程序框架: ● 为不同的传输类型提供了统一的API: ○ 通过Java NIO提供TCP/IP 和 UDP/IP支持 ○ 通过RXTX提供串口通讯(

关于Ajaxpro的问题,大师帮忙解答啊。

问题描述 如果定义了<httpHandlers><addverb="POST,GET"path="ajaxpro/*.ashx"type="AjaxPro.AjaxHandlerFactory,AjaxPro"/></httpHandlers>无论怎么修改源码,输出显示都一样,没有反应,前台:<%@ControlLanguage="C#"AutoEventWireup="tr

arp、攻击,求大师帮忙,指导

问题描述 我用软件检测到了局域网里攻击我的电脑的mac,和ip地址,我想知道他是谁,同时对电脑网络技术感兴趣,能帮帮我么?qq815323148,万分感谢! 解决方案 解决方案二:1.在路由器里把MAC地址和IP地址绑定2.查找到那台攻击你的机子,将其硬盘格式化并重做系统!解决方案三:直接打他一次就可以啦解决方案四:该回复于2012-07-05 11:13:06被版主删除解决方案五:你反过来攻击它!解决方案六:要看他采用的是何种arp攻击,一般常用的是发送伪造的arp应答,可以这样一个思路,攻击