Android模拟服务端下发消息的Socket通讯工具
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通讯工具相关推荐
- Android模拟服务端接口之moco
在学习Android的过程中,学到网络相关的东西时,没有服务端接口很是困扰,但是对服务端的知识还不是很了解,所以用了moco.jar来模拟服务端接口. 我主要讲一下我的项目中用到的接口形式吧.具体的一 ...
- Netty实战 IM即时通讯系统(十)实现客户端和服务端收发消息
Netty实战 IM即时通讯系统(十)实现客户端和服务端收发消息 零. 目录 IM系统简介 Netty 简介 Netty 环境配置 服务端启动流程 客户端启动流程 实战: 客户端和服务端双向通信 数据 ...
- java服务器向客户端发消息_java一个简单的客户端向服务端发送消息
java一个简单的客户端向服务端发送消息 客户端代码: package com.chenghu.tcpip; import java.io.IOException; import java.io.Ou ...
- Android——Tcp服务端实现
Android--Tcp服务端 传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的.可靠的.基于字节流的传输层通信协议. ...
- android从服务端获取json解析显示在客户端上面,Android服务端获取json解析显示在客户端上面.doc...
Android服务端获取json解析显示在客户端上面 Android从服务端获取json解析显示在客户端上面 首先说一下Json数据的最基本的特点,Json数据是一系列的键值对的集合,和XML数据来比 ...
- jmeter web服务器协议,【JMeter4.0学习(三)】之SoapUI创建WebService接口模拟服务端以及JMeter测试SOAP协议性能测试脚本开发(示例代码)...
目录: [阐述]:首先应该遇到了一个共同的问题,JMeter3.2之后就没有WebService(SOAP) Request,后来经过查询网上资料得知其实可以用HTTP请求来操作,结果是一样的. [步 ...
- SoapUI模拟服务端进行接口测试
在进行接口测试中,SoapUI是很好的第三方工具,可模拟http.webservice等多种协议请求进行测试,SoapUI模拟请求方发送http.webservice的request请求参见我之前的博 ...
- Netty简单实现客户端与服务端收发消息
Netty简单实现客户端与服务端收发消息 这个小案例主要是实现netty收发消息,分为客户端,及服务端,以及包含了相关状态处理,主要的代码会放在最后 gitHub 地址上,有需要可以看一下 首先来简单 ...
- 渡一教育_Java每日一练:建立Statement的作用是什么、前端Console.log( Boolean(‘‘))输出的是什么、如果希望1监听TCP端口为9000,服务端应该怎样创建socket
系列文章目录 文章目录 系列文章目录 题目1java部分建立Statement的作用是什么(答案在最后公布) 题目1 - 答案 ==解析== ==答案== 题目2 前端 js部分 ==答案== 题目3 ...
最新文章
- 拦截器获取不到sesssion作用域的值_ES6--块级作用域
- STM32 基础系列教程 35 - Lwip_sntp
- python阻塞和非阻塞_Python基础必备知识:同步异步阻塞非阻塞
- 阿里云上到底能运行SAP哪些产品?
- VMWARE虚拟机中CentOs7网络连接
- 超级干货|UI免费资源集合地,分享乐园,为UI设计师减少70%加班时间
- 一步步实现SDDC-vSphere Auto Deploy的妙用
- 一个简单好用的日志框架NLog
- 深入解析Koa之核心原理
- android数据格式化,手机格式化了?教你找回安卓手机误删数据
- 解决MySQL报ValueError(“Could not process parameters“)错误
- HTTP,TCP,UDP常见端口对照表大全
- python能建网站吗_python适合建网站吗
- FLOJET NEMP50/7泵
- Google Research等机构提出新的AI算法以了解人脑网络中的电刺激效应
- YYModel的源码读后感
- sublime3怎么设置中文很简单
- (转)War3 World Editor 菜单详解
- SWPU NSS新生赛(校外通道)
- 第5次作业+037+吴烨倩
热门文章
- 更快实现Android多级树形选择列表
- 使用 Matplotlib 给折线图绘制置信区间
- AppStore被Rejected 的各种原因
- Microbiome:土壤微生物驱动退耕还林系统土壤剖面的养分循环
- python和R写出表达矩阵为稀疏矩阵matrix.mtx.gz的方法
- 基于区块链的医疗记录存储系统研究与开发
- 谭浩强c语言第7章14题,谭浩强C语言课件第7章.ppt
- [新书推荐]Autodesk地理信息系统解决方案——FDO、MapGuide、AutoCAD® Map 3D二次开发指南...
- DFIG_Wind_Turbine:基于MATLAB/Simulink的双馈异步风力发电机仿真模型,控制方案采用矢量控制
- Pspice和MATLAB-Simulink联合仿真