wxg3715 2017-11-19 13:05 采纳率: 33.3%
浏览 1539
已结题

mina udp 客户端收不到服务端消息

已经关闭防火墙,抓包工具可以监听到服务端已经发送了消息
客户端代码 package cn.encdata.service.signal.realtime.client;

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

import org.apache.mina.core.buffer.IoBuffer;
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.TextLineCodecFactory;
import org.apache.mina.transport.socket.nio.NioDatagramConnector;
import org.apache.mina.transport.socket.nio.NioSocketConnector;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import cn.encdata.service.Config;

//通信客户端
public class SocketClient
{
private ConnectFuture future = null;//连接对象
private boolean exit = false;
private static Charset CS = Charset.forName("GBK");
private IoSession session = null;//会话
private static Logger log = LoggerFactory.getLogger(SocketClient.class);
private static SocketClient client= null;

private SocketClient()
{

}

public static SocketClient instance()
{
    if(client == null)
    {
        client = new SocketClient();
    }
    return client;
}

public synchronized void start()
{
    new Thread(new Runnable(){
        public void run(){connect();}
    }).start();
}


public synchronized void stop()
{
    if(future!=null && future.isConnected())
    {
        future.getSession().close(true);
        future = null;
        exit = true;
    }
}

public synchronized void send(IoBuffer buffer)
{
    if(buffer == null) return;
    if(session == null || !session.isConnected())
    {
        log.info("通讯链路尚未创建,无法发送数据.");
        return;
    }
    if(session.getAttribute("login") == null)
    {
        log.info("通讯链路尚未通过验证,无法发送数据.");
        return;
    }
    session.write(buffer);
    buffer.free();
}

private void connect()
{
    while(!exit)
    {
        if(future == null || !future.isConnected())
        {
            IoConnector connector = null;
            try 
            {

                connector = new NioDatagramConnector();
                connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory()));
                //connector.setConnectTimeoutMillis(Config.Server.ConnectTimeout);
                connector.setHandler(new SocketDataHandler());
                future = connector.connect(new InetSocketAddress("172.16.13.99",5555),new InetSocketAddress("172.163.133.200",8341));
                future.awaitUninterruptibly();
                if (!future.isConnected())
                {
                    log.info(" 断线连接中{}:{}",Config.Server.IP,Config.Server.Port);
                    Thread.sleep(Config.Server.ReconnectInterval);
                    continue;
                }
                session = future.getSession();
                future.getSession().getCloseFuture().awaitUninterruptibly();
                future = null;
            }
            catch (Exception e)
            {
                log.error("创建通讯连接异常",e);
                break;
            }
            finally
            {
                if(connector != null)
                {
                    connector.dispose();
                }
            }
        }
        try 
        {
            Thread.sleep(Config.Server.ReconnectInterval);
        } 
        catch (InterruptedException e) 
        {
            e.printStackTrace();
        }
    }
}

}

handler类代码为:
package cn.encdata.service.signal.realtime.client;

import java.nio.ByteOrder;

import org.apache.mina.core.buffer.IoBuffer;
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;

import cn.encdata.service.Config;
import cn.encdata.service.signal.realtime.receive.handler.FaceHandler;

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

@Override
public void sessionOpened(IoSession session)
{
    log.info("与服务器连接成功:"+session.getRemoteAddress());
   log.info("发送登录消息");
   //退出登录
   //session.write("退出登录\rsuper\r");
   session.write("登录系统\rsuper\r111\r");
}
@Override
public void sessionClosed(IoSession session) throws Exception 
{
    log.info("{}与服务器断线",session.getRemoteAddress());

}

@Override
public void messageReceived(IoSession session, Object message) 
{  


     System.out.println("客户端传来消息:"+message.toString());  




}

@Override
public  void sessionIdle(IoSession session, IdleStatus status) 
{
    if (status == IdleStatus.BOTH_IDLE)  
    {
        //发送心跳包
        IoBuffer heartbeat = IoBuffer.allocate(2+1);
        heartbeat.order(ByteOrder.BIG_ENDIAN);
        //heartbeat.putUnsignedShort(1);
        //heartbeat.putUnsigned(0);
        //heartbeat.flip();
        log.info("发送心跳消息");
        session.write("客户端正常\rsuper\r");
    }
}

@Override  
public void sessionCreated(IoSession session) throws Exception {  //当创建一个新的连接时被触发,即开始一个新的session是被触发
    log.info("sessionCreated");
    session.getConfig().setIdleTime(IdleStatus.BOTH_IDLE, 20);  
}

@Override
public void messageSent(IoSession session, Object message) 
{

}

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

}

  • 写回答

1条回答

  • COCO_AS 2017-11-19 13:45
    关注

    你确定172.163.133.200这个ip没有错?私有网段地址。也就是10/8,172.16/12,192.168/16, 172.163.x.x已是公网网段了

    评论

报告相同问题?

悬赏问题

  • ¥50 易语言把MYSQL数据库中的数据添加至组合框
  • ¥20 求数据集和代码#有偿答复
  • ¥15 关于下拉菜单选项关联的问题
  • ¥20 java-OJ-健康体检
  • ¥15 rs485的上拉下拉,不会对a-b<-200mv有影响吗,就是接受时,对判断逻辑0有影响吗
  • ¥15 使用phpstudy在云服务器上搭建个人网站
  • ¥15 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况