Android模拟服务端下发消息的Socket通讯工具

1. 背景简介

背景简介:
有些场景需要依赖服务端下发消息到客户端,比如PowerMsg,服务端下发消息Type,客户端解析Type做出相应动作。比如直播答题,需要依赖服务端下发消息,客户端拿到消息根据规则去展示题目等等。

2. 痛点说明

依赖服务端消息下发,客户端很被动,无法主动构造相应消息。所以急需一个可以模拟服务端消息下发的工具,socket工具由此而来。

3. 工具原理

电脑模拟Socket服务端,Android应用模拟Socket客户端,通过socket工具发消息到客户端。

4. Socket客户端代码

if (ConfigHelper.getInstance().getAppConfig().isDebug()&& PreferenceCommon.getInstance().getBoolean("is_xx_socket_enable", false)) {Socket2PowerMsgTool.getInstance().setLiveMessageParserCallBack(this)Socket2PowerMsgTool.getInstance().startSocket()}

Socket2PowerMsgTool.java

public class Socket2PowerMsgTool {private static final String SocketIP = "30.5.195.154";private static final int SocketPort = 7654;Socket socket = null;private String recv_buff = null;private static Socket2PowerMsgTool instance = new Socket2PowerMsgTool();private Socket2PowerMsgTool(){}public static Socket2PowerMsgTool getInstance(){return instance;}private ILiveMessageParserCallBack mLiveMessageParserCallBack;public void setLiveMessageParserCallBack(ILiveMessageParserCallBack mLiveMessageParserCallBack) {this.mLiveMessageParserCallBack = mLiveMessageParserCallBack;}public void startSocket() {String ip = PreferenceCommon.getInstance().getString("live_mock_socket_ip", "");String portString = PreferenceCommon.getInstance().getString("live_mock_socket_port", "");if (TextUtils.isEmpty(ip) || TextUtils.isEmpty(portString)) {return;}int port = Integer.parseInt(portString);new Thread(new Runnable() {@Overridepublic void run() {try {//连接到指定的IP和端口号,并指定10s的超时时间socket = new Socket();socket.connect(new InetSocketAddress(ip, port), 10000);if (socket != null && socket.isConnected()) {while(true) {recv();}}} catch (IOException e) {e.printStackTrace();}}}).start();}private void recv() {InputStream inputStream = null;try {inputStream = socket.getInputStream();} catch (IOException e) {e.printStackTrace();}if (inputStream != null){try {byte[] buffer = new byte[1024];int count = inputStream.read(buffer);//count是传输的字节数recv_buff = new String(buffer);//socket通信传输的是byte类型,需要转为String类型recv_buff = recv_buff.substring(0, count);String regex="^[A-Fa-f0-9]+$";if (recv_buff.matches(regex)) {recv_buff = hexStringToString(recv_buff);}Log.i("ruihan-test", recv_buff);if (!TextUtils.isEmpty(recv_buff) && isJSONString(recv_buff)) {MockPowerMsgEntity mockPowerMsgEntity = FastJsonUtil.json2pojo(recv_buff, MockPowerMsgEntity.class);if(mockPowerMsgEntity != null) {if (mockPowerMsgEntity.type == 1) {if (mLiveMessageParserCallBack != null) {mLiveMessageParserCallBack.msgLiveOriginalJsonPaserCallBack(FastJsonUtil.pojo2json(mockPowerMsgEntity.data));}} else if (mockPowerMsgEntity.type == 2) {if (mLiveMessageParserCallBack != null) {mLiveMessageParserCallBack.msgLikeParserCallback(JSONObject.toJavaObject(mockPowerMsgEntity.data, MsgLike.class));}} else if (mockPowerMsgEntity.type == 3) {if (mLiveMessageParserCallBack != null) {mLiveMessageParserCallBack.msgLiveStatusParserCallback(FastJsonUtil.pojo2json(mockPowerMsgEntity.data),JSONObject.toJavaObject(mockPowerMsgEntity.data, MsgLiveStatus.class));}}}}} catch (IOException e) {e.printStackTrace();}}}private 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, "UTF-8");new String();} catch (Exception e1) {e1.printStackTrace();}return s;}public boolean isJSONString(String str) {boolean result = false;try {Object obj = JSONObject.parse(str);result = true;} catch (Exception e) {result = false;}return result;}public void closeSocket() {try {if (socket!= null) {socket.close();socket = null;}} catch (IOException e) {e.printStackTrace();}}
}

接口回调实现:

override fun msgLiveOriginalJsonPaserCallBack(jsonString: String?) {val isBenefitType = LiveRoomUtils.isBenefitCoupon(jsonString)if (isBenefitType) {// TODOreturn}val isOldHighLightType = LiveRoomUtils.isOldHighLightType(jsonString)if (isOldHighLightType) {return}val isNativeHighLight = LiveRoomUtils.isNativeHighLight(jsonString, mLiveId)if (isNativeHighLight) {// TODO}val isAnswerType = LiveRoomUtils.isAnswerType(jsonString)if (isAnswerType) {// TODO}eventBusFire(WeexEventConstants.WEEX_EVENT_BIND_POWER_MESSAGE_CALLBACK,JSONObject.parse(jsonString))}

MockPowerMsgEntity.java

public class MockPowerMsgEntity implements Serializable {/***  type 1 2 3 分别对应下列3个回调*  fun msgLiveOriginalJsonPaserCallBack(jsonString: String?)*  fun msgLikeParserCallback(msgLike: MsgLike)*  fun msgLiveStatusParserCallback(jsonString: String?, msgLiveStatus: MsgLiveStatus?)**/public int type;  // 对应 PowerMsg 三种回调类型public JSONObject data; // 数据类型}

5. Socket服务端工具

1.安装软件

安装软件: SSokit
SSokit地址

2.步骤参考

1.打开软件,自动识别当前电脑地址,手动输入端口号,如:7653
2.手机摇一摇,输入Ip,端口号,点击设置模拟PowerMsg按钮;打开开关。
3.显示已连接
4.在右侧输入框发送文本,格式参考:

{"type": 1,"data": {"uniqueKey":"1629428186122:-875441502","type":1304,"body":{"questionId":12312312312312}}

手机端设置参考:

3.发送消息:

Android模拟服务端下发消息的Socket通讯工具相关推荐

  1. Android模拟服务端接口之moco

    在学习Android的过程中,学到网络相关的东西时,没有服务端接口很是困扰,但是对服务端的知识还不是很了解,所以用了moco.jar来模拟服务端接口. 我主要讲一下我的项目中用到的接口形式吧.具体的一 ...

  2. Netty实战 IM即时通讯系统(十)实现客户端和服务端收发消息

    Netty实战 IM即时通讯系统(十)实现客户端和服务端收发消息 零. 目录 IM系统简介 Netty 简介 Netty 环境配置 服务端启动流程 客户端启动流程 实战: 客户端和服务端双向通信 数据 ...

  3. java服务器向客户端发消息_java一个简单的客户端向服务端发送消息

    java一个简单的客户端向服务端发送消息 客户端代码: package com.chenghu.tcpip; import java.io.IOException; import java.io.Ou ...

  4. Android——Tcp服务端实现

    Android--Tcp服务端         传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的.可靠的.基于字节流的传输层通信协议.         ...

  5. android从服务端获取json解析显示在客户端上面,Android服务端获取json解析显示在客户端上面.doc...

    Android服务端获取json解析显示在客户端上面 Android从服务端获取json解析显示在客户端上面 首先说一下Json数据的最基本的特点,Json数据是一系列的键值对的集合,和XML数据来比 ...

  6. jmeter web服务器协议,【JMeter4.0学习(三)】之SoapUI创建WebService接口模拟服务端以及JMeter测试SOAP协议性能测试脚本开发(示例代码)...

    目录: [阐述]:首先应该遇到了一个共同的问题,JMeter3.2之后就没有WebService(SOAP) Request,后来经过查询网上资料得知其实可以用HTTP请求来操作,结果是一样的. [步 ...

  7. SoapUI模拟服务端进行接口测试

    在进行接口测试中,SoapUI是很好的第三方工具,可模拟http.webservice等多种协议请求进行测试,SoapUI模拟请求方发送http.webservice的request请求参见我之前的博 ...

  8. Netty简单实现客户端与服务端收发消息

    Netty简单实现客户端与服务端收发消息 这个小案例主要是实现netty收发消息,分为客户端,及服务端,以及包含了相关状态处理,主要的代码会放在最后 gitHub 地址上,有需要可以看一下 首先来简单 ...

  9. 渡一教育_Java每日一练:建立Statement的作用是什么、前端Console.log( Boolean(‘‘))输出的是什么、如果希望1监听TCP端口为9000,服务端应该怎样创建socket

    系列文章目录 文章目录 系列文章目录 题目1java部分建立Statement的作用是什么(答案在最后公布) 题目1 - 答案 ==解析== ==答案== 题目2 前端 js部分 ==答案== 题目3 ...

最新文章

  1. 拦截器获取不到sesssion作用域的值_ES6--块级作用域
  2. STM32 基础系列教程 35 - Lwip_sntp
  3. python阻塞和非阻塞_Python基础必备知识:同步异步阻塞非阻塞
  4. 阿里云上到底能运行SAP哪些产品?
  5. VMWARE虚拟机中CentOs7网络连接
  6. 超级干货|UI免费资源集合地,分享乐园,为UI设计师减少70%加班时间
  7. 一步步实现SDDC-vSphere Auto Deploy的妙用
  8. 一个简单好用的日志框架NLog
  9. 深入解析Koa之核心原理
  10. android数据格式化,手机格式化了?教你找回安卓手机误删数据
  11. 解决MySQL报ValueError(“Could not process parameters“)错误
  12. HTTP,TCP,UDP常见端口对照表大全
  13. python能建网站吗_python适合建网站吗
  14. FLOJET NEMP50/7泵
  15. Google Research等机构提出新的AI算法以了解人脑网络中的电刺激效应
  16. YYModel的源码读后感
  17. sublime3怎么设置中文很简单
  18. (转)War3 World Editor 菜单详解
  19. SWPU NSS新生赛(校外通道)
  20. 第5次作业+037+吴烨倩

热门文章

  1. 更快实现Android多级树形选择列表
  2. 使用 Matplotlib 给折线图绘制置信区间
  3. AppStore被Rejected 的各种原因
  4. Microbiome:土壤微生物驱动退耕还林系统土壤剖面的养分循环
  5. python和R写出表达矩阵为稀疏矩阵matrix.mtx.gz的方法
  6. 基于区块链的医疗记录存储系统研究与开发
  7. 谭浩强c语言第7章14题,谭浩强C语言课件第7章.ppt
  8. [新书推荐]Autodesk地理信息系统解决方案——FDO、MapGuide、AutoCAD® Map 3D二次开发指南...
  9. DFIG_Wind_Turbine:基于MATLAB/Simulink的双馈异步风力发电机仿真模型,控制方案采用矢量控制
  10. Pspice和MATLAB-Simulink联合仿真