发送消息正常,抓包工具监测可以监测到服务端收到并发出应答消息,客户端接收不到,防火墙已经关闭,、
客户端代码: 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);
}
public static String stringToAscii(String value)
{
StringBuffer sbu = new StringBuffer();
char[] chars = value.toCharArray();
for (int i = 0; i < chars.length; i++) {
if(i != chars.length - 1)
{
sbu.append((int)chars[i]).append(",");
}
else {
sbu.append((int)chars[i]);
}
}
return sbu.toString();
}
public static String asciiToString(String value)
{
StringBuffer sbu = new StringBuffer();
String[] chars = value.split(",");
for (int i = 0; i < chars.length; i++) {
sbu.append((char) Integer.parseInt(chars[i]));
}
return sbu.toString();
}
public static void main(String[] args) {
String str = "BFCDBBA7B6CBD5FDB3A30D 73 75 70 65 72 0D ";
String asciiResult = hexStringToString(str);
System.out.println(asciiResult);
// String stringResult = asciiToString(asciiResult);
// System.out.println(stringResult);
}
public static String hexStringToString(String s) {
if (s == null || s.equals("")) {
return null;
}
s = s.replace(" ", "");
byte[] baKeyword = new byte[s.length() / 2];
for (int i = 0; i < baKeyword.length; i++) {
try {
baKeyword[i] = (byte) (0xff & Integer.parseInt(s.substring(i * 2, i * 2 + 2), 16));
} catch (Exception e) {
e.printStackTrace();
}
}
try {
s = new String(baKeyword, "GBK");
new String();
} catch (Exception e1) {
e1.printStackTrace();
}
return s;
}
}求解惑
客户端代码: 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);
}
public static String stringToAscii(String value)
{
StringBuffer sbu = new StringBuffer();
char[] chars = value.toCharArray();
for (int i = 0; i < chars.length; i++) {
if(i != chars.length - 1)
{
sbu.append((int)chars[i]).append(",");
}
else {
sbu.append((int)chars[i]);
}
}
return sbu.toString();
}
public static String asciiToString(String value)
{
StringBuffer sbu = new StringBuffer();
String[] chars = value.split(",");
for (int i = 0; i < chars.length; i++) {
sbu.append((char) Integer.parseInt(chars[i]));
}
return sbu.toString();
}
public static void main(String[] args) {
String str = "BFCDBBA7B6CBD5FDB3A30D 73 75 70 65 72 0D ";
String asciiResult = hexStringToString(str);
System.out.println(asciiResult);
// String stringResult = asciiToString(asciiResult);
// System.out.println(stringResult);
}
public static String hexStringToString(String s) {
if (s == null || s.equals("")) {
return null;
}
s = s.replace(" ", "");
byte[] baKeyword = new byte[s.length() / 2];
for (int i = 0; i < baKeyword.length; i++) {
try {
baKeyword[i] = (byte) (0xff & Integer.parseInt(s.substring(i * 2, i * 2 + 2), 16));
} catch (Exception e) {
e.printStackTrace();
}
}
try {
s = new String(baKeyword, "GBK");
new String();
} catch (Exception e1) {
e1.printStackTrace();
}
return s;
}
}求解惑
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货