[Update]自定义协议并解决TCP粘包/拆包问题

This commit is contained in:
chenfufeng
2022-02-14 15:58:48 +08:00
parent 4e2c6ffd7a
commit fc89d1a34b
10 changed files with 227 additions and 84 deletions

View File

@@ -13,13 +13,14 @@ import androidx.recyclerview.widget.RecyclerView;
import com.mogo.cloud.R;
import com.mogo.cloud.netty.LogBean;
import com.mogo.telematic.MogoProtocolMsg;
import com.mogo.telematic.NSDNettyManager;
import com.mogo.telematic.client.listener.NettyClientListener;
import com.mogo.telematic.client.status.ConnectState;
import java.util.Arrays;
public class NettyClientActivity extends AppCompatActivity implements View.OnClickListener, NettyClientListener<byte[]> {
public class NettyClientActivity extends AppCompatActivity implements View.OnClickListener, NettyClientListener<MogoProtocolMsg> {
private static final String TAG = "NettyClientActivity";
@@ -36,6 +37,8 @@ public class NettyClientActivity extends AppCompatActivity implements View.OnCli
private final byte[] sendByte = new byte[]{0x55, 0x54, 0x72, 0x21};
private final MogoProtocolMsg mogoProtocolMsg = new MogoProtocolMsg(MogoProtocolMsg.NORMAL_DATA, 3, new byte[]{0x11, 0x12, 0x13});
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -68,7 +71,7 @@ public class NettyClientActivity extends AppCompatActivity implements View.OnCli
mSendBtn.setOnClickListener(this);
mClearLog.setOnClickListener(this);
mSendET.setText(Arrays.toString(sendByte));
mSendET.setText(Arrays.toString(mogoProtocolMsg.getBody()));
}
@Override
@@ -82,15 +85,15 @@ public class NettyClientActivity extends AppCompatActivity implements View.OnCli
if (!NSDNettyManager.getInstance().getConnectStatus()) {
Toast.makeText(getApplicationContext(), "未连接,请先连接", Toast.LENGTH_SHORT).show();
} else {
NSDNettyManager.getInstance().sendByteArrayToServer(sendByte, isSuccess -> {
NSDNettyManager.getInstance().sendMogoProtocolMsgToServer(mogoProtocolMsg, isSuccess -> {
if (isSuccess) {
Log.d(TAG, "Write auth successful");
logSend(Arrays.toString(sendByte));
logSend(Arrays.toString(mogoProtocolMsg.getBody()));
} else {
Log.d(TAG, "Write auth error");
}
});
mSendET.setText(Arrays.toString(sendByte));
mSendET.setText(Arrays.toString(mogoProtocolMsg.getBody()));
}
break;
@@ -104,8 +107,8 @@ public class NettyClientActivity extends AppCompatActivity implements View.OnCli
}
@Override
public void onMessageResponseClient(byte[] msg, int index) {
String result = Arrays.toString(msg);
public void onMessageResponseClient(MogoProtocolMsg msg, int index) {
String result = msg.toString();
Log.e(TAG, "onMessageResponse:" + result);
logRece(result);
}
@@ -125,15 +128,19 @@ public class NettyClientActivity extends AppCompatActivity implements View.OnCli
}
private void logSend(String log) {
LogBean logBean = new LogBean(System.currentTimeMillis(), log);
mSendLogAdapter.getDataList().add(0, logBean);
runOnUiThread(() -> mSendLogAdapter.notifyDataSetChanged());
runOnUiThread(() -> {
LogBean logBean = new LogBean(System.currentTimeMillis(), log);
mSendLogAdapter.getDataList().add(0, logBean);
mSendLogAdapter.notifyDataSetChanged();
});
}
private void logRece(String log) {
LogBean logBean = new LogBean(System.currentTimeMillis(), log);
mReceLogAdapter.getDataList().add(0, logBean);
runOnUiThread(() -> mReceLogAdapter.notifyDataSetChanged());
runOnUiThread(() -> {
LogBean logBean = new LogBean(System.currentTimeMillis(), log);
mReceLogAdapter.getDataList().add(0, logBean);
mReceLogAdapter.notifyDataSetChanged();
});
}
public void disconnect(View view) {

View File

@@ -18,6 +18,7 @@ import androidx.recyclerview.widget.RecyclerView;
import com.mogo.cloud.R;
import com.mogo.cloud.netty.LogBean;
import com.mogo.telematic.MogoProtocolMsg;
import com.mogo.telematic.NSDNettyManager;
import com.mogo.telematic.NetworkUtils;
import com.mogo.telematic.server.bean.ClientChanel;
@@ -30,7 +31,7 @@ import java.util.List;
import io.netty.channel.Channel;
public class NettyServerActivity extends AppCompatActivity implements View.OnClickListener, NettyServerListener<byte[]> {
public class NettyServerActivity extends AppCompatActivity implements View.OnClickListener, NettyServerListener<MogoProtocolMsg> {
private static final String TAG = "NettyServerActivity";
@@ -52,6 +53,8 @@ public class NettyServerActivity extends AppCompatActivity implements View.OnCli
private final byte[] sendByte = new byte[]{0x55, 0x54, 0x72, 0x21};
private final MogoProtocolMsg mogoProtocolMsg = new MogoProtocolMsg(MogoProtocolMsg.NORMAL_DATA, 3, new byte[]{0x11, 0x12, 0x13});
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -107,7 +110,7 @@ public class NettyServerActivity extends AppCompatActivity implements View.OnCli
startServer.setOnClickListener(this);
mSendBtn.setOnClickListener(this);
mClearLog.setOnClickListener(this);
mSendET.setText(Arrays.toString(sendByte));
mSendET.setText(Arrays.toString(mogoProtocolMsg.getBody()));
}
@Override
@@ -127,15 +130,15 @@ public class NettyServerActivity extends AppCompatActivity implements View.OnCli
if (!NSDNettyManager.getInstance().isServerStart()) {
Toast.makeText(getApplicationContext(), "未连接,请先连接", LENGTH_SHORT).show();
} else {
NSDNettyManager.getInstance().sendByteArrayToClient(sendByte, channelFuture -> {
NSDNettyManager.getInstance().sendMogoProtocolMsgToClient(mogoProtocolMsg, channelFuture -> {
if (channelFuture.isSuccess()) {
Log.d(TAG, "Write auth successful");
logSend(Arrays.toString(sendByte));
logSend(Arrays.toString(mogoProtocolMsg.getBody()));
} else {
Log.d(TAG, "Write auth error");
}
});
mSendET.setText(Arrays.toString(sendByte));
mSendET.setText(Arrays.toString(mogoProtocolMsg.getBody()));
}
break;
@@ -149,10 +152,10 @@ public class NettyServerActivity extends AppCompatActivity implements View.OnCli
}
@Override
public void onMessageResponseServer(byte[] msg, String uniqueId) {
Log.e(TAG,"onMessageResponseServer:ChannelId:"+uniqueId);
public void onMessageResponseServer(MogoProtocolMsg msg, String channelId) {
Log.e(TAG,"onMessageResponseServer:channelId:" + channelId);
String result = Arrays.toString(msg);
String result = msg.toString();
Log.e(TAG, "onMessageResponse:" + result);
logRece(result);
}
@@ -175,7 +178,7 @@ public class NettyServerActivity extends AppCompatActivity implements View.OnCli
@Override
public void onChannelDisConnect(Channel channel) {
Log.e(TAG, "onChannelDisConnect:ChannelId" + channel.id().asShortText());
Log.d(TAG, "onChannelDisConnect:ChannelId is:" + channel.id().asShortText());
for (int i = 0; i < clientChanelArray.size(); i++) {
final ClientChanel clientChanel = clientChanelArray.get(i);
@@ -222,14 +225,18 @@ public class NettyServerActivity extends AppCompatActivity implements View.OnCli
}
private void logSend(String log) {
LogBean logBean = new LogBean(System.currentTimeMillis(), log);
mSendLogAdapter.getDataList().add(0, logBean);
runOnUiThread(() -> mSendLogAdapter.notifyDataSetChanged());
runOnUiThread(() -> {
LogBean logBean = new LogBean(System.currentTimeMillis(), log);
mSendLogAdapter.getDataList().add(0, logBean);
mSendLogAdapter.notifyDataSetChanged();
});
}
private void logRece(String log) {
LogBean logBean = new LogBean(System.currentTimeMillis(), log);
mReceLogAdapter.getDataList().add(0, logBean);
runOnUiThread(() -> mReceLogAdapter.notifyDataSetChanged());
runOnUiThread(() -> {
LogBean logBean = new LogBean(System.currentTimeMillis(), log);
mReceLogAdapter.getDataList().add(0, logBean);
mReceLogAdapter.notifyDataSetChanged();
});
}
}