[Update]Netty支持多channel通信和业务身份绑定

This commit is contained in:
chenfufeng
2022-02-18 18:02:29 +08:00
parent fc89d1a34b
commit 6e850b0cab
8 changed files with 217 additions and 181 deletions

View File

@@ -1,7 +1,6 @@
package com.mogo.telematic;
import android.content.Context;
import android.content.Intent;
import android.net.nsd.NsdServiceInfo;
import android.util.Log;
@@ -10,8 +9,6 @@ import com.mogo.telematic.client.NsdClient;
import com.mogo.telematic.client.listener.MessageStateListener;
import com.mogo.telematic.client.listener.NettyClientListener;
import com.mogo.telematic.server.NSDServer;
import com.mogo.telematic.server.NettyServerService;
import com.mogo.telematic.server.bean.ClientChanel;
import com.mogo.telematic.server.netty.NettyServerListener;
import com.mogo.telematic.server.netty.NettyTcpServer;
@@ -46,11 +43,12 @@ public class NSDNettyManager {
return sInstance;
}
private NettyServerListener mDefaultListener = new NettyServerListener() {
private NettyServerListener mDefaultServerListener = new NettyServerListener() {
@Override
public void onMessageResponseServer(Object msg, String ChannelId) {
if (mListener != null) {
mListener.onMessageResponseServer(msg, ChannelId);
public void onMessageResponseServer(Object msg, Channel channel) {
if (msg instanceof MogoProtocolMsg && mListener != null) {
mListener.onMessageResponseServer(msg, channel);
}
}
@@ -74,6 +72,7 @@ public class NSDNettyManager {
@Override
public void onChannelConnect(Channel channel) {
NettyTcpServer.getInstance().addChannel(channel);
if (mListener != null) {
mListener.onChannelConnect(channel);
}
@@ -81,6 +80,7 @@ public class NSDNettyManager {
@Override
public void onChannelDisConnect(Channel channel) {
NettyTcpServer.getInstance().removeChannel(channel);
if (mListener != null) {
mListener.onChannelDisConnect(channel);
}
@@ -89,6 +89,7 @@ public class NSDNettyManager {
/**
* 启动Netty和NSD服务的Server端
*
* @param context
* @param listener
*/
@@ -101,7 +102,7 @@ public class NSDNettyManager {
mListener = listener;
NettyTcpServer nettyTcpServer = NettyTcpServer.getInstance();
if (!nettyTcpServer.isServerStart()) {
nettyTcpServer.setListener(mDefaultListener);
nettyTcpServer.setListener(mDefaultServerListener);
nettyTcpServer.start();
} else {
NettyTcpServer.getInstance().disconnect();
@@ -109,17 +110,17 @@ public class NSDNettyManager {
}
public boolean isServerStart() {
return NettyTcpServer.getInstance().isServerStart();
}
public void sendByteArrayToClient(byte[] byteArray, ChannelFutureListener listener) {
NettyTcpServer.getInstance().sendMsgToClient(byteArray, listener);
return NettyTcpServer.getInstance().isServerStart();
}
public void sendMogoProtocolMsgToClient(MogoProtocolMsg mogoProtocolMsg, ChannelFutureListener listener) {
NettyTcpServer.getInstance().sendMsgToClient(mogoProtocolMsg, listener);
}
public void sendMsgToAllClients(MogoProtocolMsg mogoProtocolMsg) {
NettyTcpServer.getInstance().sendMsgToAllClients(mogoProtocolMsg);
}
/**
* 服务器端注册一个可供NSD探测到的网络 Ip 地址便于给展示叫号机连接此socket
*/
@@ -138,14 +139,17 @@ public class NSDNettyManager {
//已经注册可停止该服务
// nsdServer.stopNSDServer();
}
@Override
public void onRegistrationFailed(NsdServiceInfo serviceInfo, int errorCode) {
}
@Override
public void onServiceUnregistered(NsdServiceInfo serviceInfo) {
}
@Override
public void onUnRegistrationFailed(NsdServiceInfo serviceInfo, int errorCode) {
@@ -160,6 +164,7 @@ public class NSDNettyManager {
/**
* 选择连接的Client端的channel
*
* @param channel
*/
public void selectChannel(Channel channel) {
@@ -168,9 +173,10 @@ public class NSDNettyManager {
/**
* 搜索并连接Netty服务端
*
* @param context
*/
public void searchAndConnectServer(Context context, NettyClientListener listener) {
public void searchAndConnectServer(Context context, String uuid, NettyClientListener listener) {
if (mNsdClient == null) {
mNsdClient = new NsdClient(context, SERVER_NAME, new NsdClient.IServerFound() {
@Override
@@ -179,7 +185,7 @@ public class NSDNettyManager {
String hostAddress = info.getHost().getHostAddress();
Log.d(TAG, "NSD查询到指定服务器信息ip为" + hostAddress + ",port为" + port);
//获取到指定的地址进行Netty的连接
connectNettyServer(hostAddress, port, listener);
connectNettyServer(hostAddress, port, uuid, listener);
if (info.getServiceName().equals(SERVER_NAME)) {
//扫描到以后停止
@@ -197,7 +203,7 @@ public class NSDNettyManager {
mNsdClient.startNSDClient();
}
private void connectNettyServer(String serverAddress, int port, NettyClientListener listener) {
private void connectNettyServer(String serverAddress, int port, String sign, NettyClientListener listener) {
Log.d(TAG, "connectNettyServer");
if (serverAddress == null || serverAddress.length() == 0) {
Log.e(TAG, "Netty Server的ip不能为空");
@@ -212,7 +218,7 @@ public class NSDNettyManager {
.setSendHeartBeat(true) //设置是否发送心跳
.setHeartBeatInterval(120) //设置心跳间隔时间。单位:秒
.setHeartBeatData(new MogoProtocolMsg(MogoProtocolMsg.HEART_DATA, 2, new byte[]{0x00, 0x00})) //设置心跳数据可以是String类型也可以是byte[],以后设置的为准
.setIndex(0) //设置客户端标识.(因为可能存在多个tcp连接)
.setSign(sign) //设置客户端标识.(因为可能存在多个tcp连接)
.build();
if (listener != null) {
mNettyTcpClient.setListener(listener); //设置TCP监听
@@ -227,7 +233,15 @@ public class NSDNettyManager {
}
public boolean getConnectStatus() {
return mNettyTcpClient.getConnectStatus();
return mNettyTcpClient != null && mNettyTcpClient.getConnectStatus();
}
public String getConnServerIp() {
if (mNettyTcpClient == null) {
return "";
} else {
return mNettyTcpClient.getHost();
}
}
public void sendMogoProtocolMsgToServer(MogoProtocolMsg mogoProtocolMsg, final MessageStateListener listener) {
@@ -236,17 +250,6 @@ public class NSDNettyManager {
}
}
/**
* 发送byte[]到服务端
* @param byteArray
* @param listener
*/
public void sendByteArrayToServer(byte[] byteArray, final MessageStateListener listener) {
if (mNettyTcpClient != null) {
mNettyTcpClient.sendMsgToServer(byteArray, listener);
}
}
public static String bytesToHexFun(byte[] bytes, int length) {
StringBuilder buf = new StringBuilder(length * 2);
for (int i = 0; i < length; i++) {// 使用String的format方法进行转换