Android笔记--WebSocket

       这一节了解一下WebSocket的用法,WebSocket是一种基于TCP的全双工通信协议,通过它可以在客户端和服务器之间建立一个持久的连接,实现实时的双向数据传输。它的主要功能特点是允许服务器主动向客户端推送信息,同时也允许客户端主动向服务器发送信息。用法如下:

app下的gradle:

implementation "org.java-websocket:Java-WebSocket:1.5.3"

服务端:

import android.util.Log;
import com.foxek.usb_custom_hid_demo.UsbPlay;import org.java_websocket.WebSocket;
import org.java_websocket.handshake.ClientHandshake;
import org.java_websocket.server.WebSocketServer;import java.net.InetSocketAddress;
import java.nio.channels.SelectionKey;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;public class DCWebSocketServer extends WebSocketServer {public static String TAG = "DCWebSocketServer";private Map<String, WebSocket> userMap = new HashMap<String, WebSocket>();public DCWebSocketServer(int port) {super(new InetSocketAddress(port));}public void sendMessageToUser(String message) {message = message;if (userMap == null || userMap.isEmpty()) return;Set<String> ketSet = userMap.keySet();for (String key : ketSet) {WebSocket clientSocket = userMap.get(key);if (clientSocket != null) {clientSocket.send(message);}}}@Overridepublic void onOpen(WebSocket conn, ClientHandshake handshake) {String userHost = conn.getRemoteSocketAddress().getHostString();if(!userMap.containsKey(userHost)) {userMap.put(userHost,conn);}String res = getClientInfo(conn);}@Overrideprotected boolean onConnect(SelectionKey key) {return super.onConnect(key);}@Overridepublic void onClose(WebSocket conn, int code, String reason, boolean remote) {String userHost = conn.getRemoteSocketAddress().getHostString();if (userMap.containsKey(userHost)) {userMap.remove(userHost);}}@Overridepublic void onMessage(WebSocket conn, String message) {if(message != null && message.contains("ScanCode")) {
//            sendMessageToUser(message);}}@Overridepublic void onError(WebSocket conn, Exception ex) {}@Overridepublic void onStart() {}private String getClientInfo(WebSocket conn) {return conn.getRemoteSocketAddress().getHostString()+":"+  conn.getRemoteSocketAddress().getPort();}
}
import android.util.Log;
import org.java_websocket.WebSocket;
import java.util.HashMap;
import java.util.Map;public class ServerSocketManager {public static String TAG = "ServerSocketManager";private final int SOCKET_PORT = 8888;private DCWebSocketServer dcWebSocketServer;private Map<WebSocket, String> userMap = new HashMap<WebSocket, String>();public ServerSocketManager() {this.dcWebSocketServer =  new DCWebSocketServer(SOCKET_PORT);}private static class ServerSocketManagerHolder {private static final ServerSocketManager INSTANCE = new ServerSocketManager();}public static  ServerSocketManager getInstance() {return ServerSocketManagerHolder.INSTANCE;}public void sendMessageToAll(String message) {dcWebSocketServer.sendMessageToUser(message);}public boolean start() {try {dcWebSocketServer.start();dcWebSocketServer.setReuseAddr(true);return true;} catch (Exception e) {e.printStackTrace();return false;}}public boolean stop() {try {dcWebSocketServer.stop();return true;} catch (Exception e) {e.printStackTrace();}return false;}}

客户端:


import android.util.Log;import org.java_websocket.client.WebSocketClient;
import org.java_websocket.handshake.ServerHandshake;import java.net.URI;public class DCSocketManagerClient extends WebSocketClient {public static String TAG = "DCSocketManagerClien";private static volatile DCSocketManagerClient client = null;public static DCSocketManagerClient getInstance(URI uri) {if (client == null) {synchronized (DCSocketManagerClient.class) {if (client == null) {client = new DCSocketManagerClient(uri);}}}return client;}public DCSocketManagerClient(URI serverUri) {super(serverUri);}@Overridepublic void onOpen(ServerHandshake handshakedata) {}@Overridepublic void onMessage(String message) {}@Overridepublic void onClose(int code, String reason, boolean remote) {}@Overridepublic void onError(Exception ex) {}
}

启动服务端:

 serverSocketManager = ServerSocketManager.getInstance()serverSocketManager!!.start()

启动客户端:

val uri = URI.create("ws://127.0.0.1:8888")
clientSocketManager = DCSocketManagerClient.getInstance(uri)try {clientSocketManager?.connectBlocking()} catch (e: Exception) {e.printStackTrace()}

客户端发送消息:

  if (clientSocketManager != null) {clientSocketManager!!.send("Java Coffee")}

服务端发送消息:

    if (serverSocketManager != null) {serverSocketManager!!.sendMessageToAll("Drink Coffee From ServerMsg")}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/131612.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序如何跳转到外部小程序

要在微信小程序中跳转到外部小程序&#xff0c;您可以使用微信小程序提供的 wx.navigateToMiniProgram 方法。以下是实现步骤&#xff1a; 在需要跳转的页面或组件中&#xff0c;编写触发跳转的逻辑&#xff0c;例如点击按钮&#xff1a; 替换 外部小程序的AppID 和 外部小程序…

Zabbix监控联想服务器的配置方法

简介 图片 随着科技的发展&#xff0c;对于数据的敏感和安全大部分取决于对硬件性能、故障预判的监测&#xff0c;由此可见实时监测保障硬件的安全很重要&#xff0c;从而衍生了很多对硬件的监测软件&#xff0c;Zabbix就一个不错的选择。开源 开源 开源&#xff01; zabbix是…

【网络协议】聊聊CND如何进行提升系统读性能

我们知道对于京东这种仓储来说&#xff0c;其实并不是在北京有一个仓储中心&#xff0c;而是针对全国主要的地方&#xff0c;北京、上海、广州、杭州&#xff0c;郑州等地方都有自己的仓储中心&#xff0c;当用户下单后&#xff0c;就会根据最近的仓储进行发货&#xff0c;不仅…

高防IP的原理

高防IP&#xff0c;把域名解析到高防IP上(web事务只要把域名指向高防IP 即可。非web事务&#xff0c;把事务IP换成高防IP即可)一起在高防IP上设置转发规矩;所有公网流量都会走高防IP&#xff0c;通过端口协议转发的方法将用户的拜访通过高防IP转发到源站IP&#xff0c;一起将歹…

基站/手机是怎么知道信道情况的?

在无线通信系统中&#xff0c;信道的情况对信号的发送起到至关重要的作用&#xff0c;基站和手机根据信道的情况选择合适的资源配置和发送方式进行通信&#xff0c;那么基站或者手机是怎么知道信道的情况呢&#xff1f; 我们先来看生活中的一个例子&#xff0c;从A地发货到B地…

gorilla/websocket的chat示例代码简单分析

代码地址&#xff1a;https://github.com/gorilla/websocket/tree/main/examples/chat 文件包含&#xff1a;main.go、hub.go、client.go、home.html main.go文件 func main() {flag.Parse()hub : newHub() // 实例化Hubgo hub.run() // 使用chan处理 增删Hub的连接 和 广播消…

动态路由协议OSPF项目部署(二)

1. 静态和动态路由的区别&#xff1b; 2. OSPF协议通信过程与部署&#xff1b; 3. OSPF协议在项目上的应用场景 - OSPF - 开放式最短路径优先 - 一个动态路由协议 - 路由器转发数据 - 路由器需要一张地图 - 路由表 - 路由表如何构建的&#xff1f; - 依靠手动 或…

访问者模式

详情可参考&#xff1a;https://zhuanlan.zhihu.com/p/380161731 意图&#xff1a;主要将数据结构与数据操作分离。 适用于&#xff1a;系统中有稳定的数据结构&#xff0c;且数据结构的功能经常发生变化。 双分派&#xff1a;我的理解是两次多态操作&#xff0c;动态获取对象…

卷积与反卷积

文章目录 1 卷积1.1 卷积后的输出维度 2 反卷积2.1 来源2.2 原理2.3 使用2.3.1 padding2.3.2 strideoutput_padding 2.3 意义 1 卷积 1.1 卷积后的输出维度 设输入维度为i x i&#xff0c;卷积核大小为k x k&#xff0c;padding为p&#xff0c;strides为s&#xff0c;则输出维…

APM建设踩了哪些坑?去哪儿旅行分布式链路追踪系统实践

一分钟精华速览 分布式链路追踪系统在企业的APM体系中扮演着重要的角色。本文分享了去哪儿旅行构建分布式链路追踪系统的实践经验。从APM整体架构设计入手&#xff0c;讲述了日志收集、Kafka传输和Flink任务处理等环节的性能优化实践和踩坑经验。 同时&#xff0c;作者结合丰…

C/C++数据结构之顺序表函数实现以及详细解析

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 C语言刷题 数据结构初阶 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂。 目录 1.前言 2.顺序表…

删除链表的倒数第 N 个结点

LeetCode 19. 删除链表的倒数第 N 个结点 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *n…

定积分的几何应用(总结非常全面!)

文章目录 1 原函数存在性和可积性1.1 函数可积的充分条件&#xff08;判定条件&#xff09;1.2 函数存在原函数的充分条件&#xff08;判定条件&#xff09;1.3 函数可积的必要条件&#xff08;性质&#xff09;1.4 变上限积分的性质 2 平面图形2.1 平面图形的面积2.1.1 直角坐…

【ES专题】ElasticSearch集群架构剖析

目录 前言阅读对象阅读导航前置知识笔记正文一、ES集群架构1.1 为什么要使用ES集群架构1.2 ES集群核心概念1.2.1 节点1.2.1.1 Master Node主节点的功能1.2.1.2 Data Node数据节点的功能1.2.1.3 Master Node主节点选举流程 1.2.2 分片1.3 搭建三节点ES集群1.3.1 ES集群搭建步骤1…

解析python爬取Ebay数据的方式

前言 Ebay是全球著名的电子商务平台之一&#xff0c;每天都有海量的商品信息涌入其中&#xff0c;在电商行业获取这些数据试试非常有价值的&#xff0c;为了更好地了解市场动态&#xff0c;掌握更多的电商行情。Python爬虫成为了必不可少的工具&#xff0c;本文将通过使用Http…

idea中配置spring boot单项目多端口启动

参照文章 https://zhuanlan.zhihu.com/p/610767685 项目配置如下 下面为 idea 2023&#xff0c;不同版本的设置有区别&#xff0c;但是没那么大&#xff0c;idea 2023默认使用新布局&#xff0c;切换为经典布局即可。 在项目根目录的.idea/workspace.xml文件里添加如下配置 &l…

高等数学教材重难点题型总结(十二)无穷级数

最后一更&#xff01;原谅博主已经开始瞎写字了&#xff0c;最近压力太大&#xff0c;以后有时间用mathPix打出来&#xff0c;看起来更舒适一些~ 高数最后一章&#xff0c;重点在于审敛法和求解幂级数的收敛半径~ 高数基础笔记全部更新完毕&#xff0c;共12*336期&#xff0c…

SpringBoot项目多环境开发

1.yml文件&#xff08;旧&#xff09; 说明&#xff1a;旧的写法。 #应用环境 spring:profiles:active: dev --- #设置环境#生产环境 spring:profiles: pro server:port: 81--- #开发环境 spirng:profiles: dev server:port: 81--- #测试环境 spring:profiles: test server:p…

C/C++ static关键字详解(最全解析,static是什么,static如何使用,static的常考面试题)

目录 一、前言 二、static关键字是什么&#xff1f; 三、static关键字修饰的对象是什么&#xff1f; 四、C 语言中的 static &#x1f34e;static的C用法 &#x1f349;static的重点概念 &#x1f350;static修饰局部变量 &#x1f4a6;static在修饰局部变量和函数的作用 &a…