Android搭建WebSocket服务端

Android实现WebServer(服务端)之Java-WebSocket Android 要起飞?自给自足?写服务端提供接口? WebSocket弥补了HTTP协议不可双向通信的问题,所谓双向通信,Client可以向Server端发送信息,反之亦然,Server端也可以向Client发送信息。 阅读详情
AI摘要

本文介绍了一种在Android设备上搭建WebSocket服务端的方法,通过Java-WebSocket库实现全双工通信,支持用户登录、发送消息及状态广播等功能。

WebSocket简介

WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端。全双工就是指客户端和服务端可以同时进行双向通信,强调同时、双向通信。

我个人对WebSocket的印象还停留在上大学的时候,出来工作之后一直没用到过,这次项目中需求是Android搭建WebSocket服务端,所以才不得不重新去学习了解一下WebSocket,查了很多资料,基本上移动端做WebSocket都是作为客户端的应用场景,很少有作为服务端的,然后我试着去看了下Java后端搭建WebSocket服务端的方法,最后搭建出一个Android WebSocket服务端,下面把代码贴出来,我对WebSocket并不是特别精通,有很多不足之处,希望大家指正出来。

compile "org.java-websocket:Java-WebSocket:1.3.6"

 

ServerSocket类

import android.util.Log;

import org.java_websocket.WebSocket;
import org.java_websocket.handshake.ClientHandshake;
import org.java_websocket.server.WebSocketServer;

import java.net.InetSocketAddress;
import java.net.UnknownHostException;

/**
 * Created by Roc on 2018/10/9.
 */
public class ServerSocket extends WebSocketServer {

    private ServerManager _serverManager;

    public ServerSocket(ServerManager serverManager,int port) throws UnknownHostException {
        super(new InetSocketAddress(port));
        _serverManager=serverManager;
    }




    @Override
    public void onOpen(WebSocket conn, ClientHandshake handshake) {
        Log.i("TAG","Some one Connected...");
    }

    @Override
    public void onClose(WebSocket conn, int code, String reason, boolean remote) {
        _serverManager.UserLeave(conn);
    }

    @Override
    public void onMessage(WebSocket conn, String message) {
        Log.i("TAG","OnMessage:"+message.toString());

        if (message.equals("1")) {
            _serverManager.SendMessageToUser(conn, "What?");
        }

        String[] result=message.split(":");
        if (result.length==2) {
            if (result[0].equals("user")) {
                _serverManager.UserLogin(result[1], conn);
            }
        }
    }

    @Override
    public void onError(WebSocket conn, Exception ex) {
        Log.i("TAG","Socket Exception:"+ex.toString());
    }

    @Override
    public void onStart() {

    }
}
ServerManager类
import android.util.Log;

import org.java_websocket.WebSocket;
import org.java_websocket.WebSocketImpl;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * Created by Roc on 2018/10/9.
 */
public class ServerManager {
    private ServerSocket serverSocket=null;
    private Map<WebSocket, String> userMap=new HashMap<WebSocket, String>();

    public ServerManager(){

    }

    public void UserLogin(String userName,WebSocket socket){
        if (userName!=null||socket!=null) {
            userMap.put(socket, userName);
            Log.i("TAG","LOGIN:"+userName);
            SendMessageToAll(userName+"...Login...");
        }
    }

    public void UserLeave(WebSocket socket){
        if (userMap.containsKey(socket)) {
            String userName=userMap.get(socket);
            Log.i("TAG","Leave:"+userName);
            userMap.remove(socket);
            SendMessageToAll(userName+"...Leave...");
        }
    }

    public void SendMessageToUser(WebSocket socket,String message){
        if (socket!=null) {
            socket.send(message);
        }
    }

    public void SendMessageToUser(String userName,String message){
        Set<WebSocket> ketSet=userMap.keySet();
        for(WebSocket socket : ketSet){
            String name=userMap.get(socket);
            if (name!=null) {
                if (name.equals(userName)) {
                    socket.send(message);
                    break;
                }
            }
        }
    }

    public void SendMessageToAll(String message){
        Set<WebSocket> ketSet=userMap.keySet();
        for(WebSocket socket : ketSet){
            String name=userMap.get(socket);
            if (name!=null) {
                socket.send(message);
            }
        }
    }

    public boolean Start(int port){

        if (port<0) {
            Log.i("TAG","Port error...");
            return false;
        }

        Log.i("TAG","Start ServerSocket...");

        WebSocketImpl.DEBUG=false;
        try {
            serverSocket=new ServerSocket(this,port);
            serverSocket.start();
            Log.i("TAG","Start ServerSocket Success...");
            return true;
        } catch (Exception e) {
            Log.i("TAG","Start Failed...");
            e.printStackTrace();
            return false;
        }
    }

    public boolean Stop(){
        try {
            serverSocket.stop();
            Log.i("TAG","Stop ServerSocket Success...");
            return true;
        } catch (Exception e) {
            Log.i("TAG","Stop ServerSocket Failed...");
            e.printStackTrace();
            return false;
        }
    }


}

使用的时候只需要用ServerManager对象调用start和stop方法,调用start方法需要设置一个端口号。搭建好了之后可以写一个客户端测试一下,下面是我测试截图,我使用的是在线测试工具进行测试(http://www.blue-zero.com/websocket/)

 

 

 

 

 

 

Android网络通信之Socket、WebSocket和WebService服务器 在上面的示例中,我们首先创建一个SoapObject对象,并设置要调用的WebService方法和参数。在上面的示例中,我们首先创建一个OkHttpClient对象,并使用WebSocketListener来处理WebSocket的事件。然后,我们创建一个WebSocket对象,并指定服务器的URL。为了实现与服务器之间的数据交互,我们可以利用不同的协议和技术,如Socket、WebSocket和WebService服务器。在上面的示例中,我们首先创建一个Socket对象,并指定服务器的IP地址和端口号。 阅读详情

相关推荐

在安卓中使用WebSocket

WebSocket是一种在Web浏览器和服务器之间进行实时双向通信的协议。与传统的HTTP请求-响应模型不同,WebSocket允许服务器主动向客户端推送数据,而不需要客户端发起请求。当然,发展到如今,WebSocket已经不再局限于Web浏览器了,也可以在移动应用、桌面应用上使用。

king的专栏 6040

WebSocket Android 服务端

【代码】WebSocket Android 服务端。

张小丫的程序员的修行之路 913

Android+PHP+WebSocket 搭建聊天室

Android 基于web Socket聊天室

XiaoJiang、的博客 3877

安卓websocket(客服端和服务端写在app端) 案例

布局加一个文本这就不写了(服务端和客服端都一样)废话不多说直接上代码。

qq_41733851的博客 2258

从零构建Android WebSocket聊天室:服务端与客户端的双向通信实战

本文详细介绍了如何从零构建Android WebSocket聊天室,涵盖服务端与客户端的双向通信实战。通过Java-WebSocket框架实现高可用聊天系统,包括服务端部署、客户端保活、消息广播等核心环节,并提供优化方案,显著提升实时通信效率。适用于教育协作、企业IM等场景。

weixin_29250573的博客 342

Rocky Linux 9.0国内yum源一键替换指南(上海交大镜像站实测)

本文详细介绍了如何将Rocky Linux 9.0的yum源替换为上海交大镜像站,以解决国内用户访问官方源速度慢的问题。通过实测验证,上海交大镜像站提供高速下载和稳定更新,并提供了完整的替换步骤、常见问题解决方案及高级优化配置,帮助用户提升软件包下载效率。

weixin_29304985的博客 359

Android 中 WebSocket 服务端实战:从零搭建高可靠通信架构

可靠的双向通信自动心跳保持安全的TLS加密高效的消息处理完整项目代码已放在GitHub,欢迎参考。更多细节可以参考Ktor官方文档和RFC6455协议。如果你对实时通信感兴趣,也可以试试从0打造个人豆包实时通话AI这个实验项目,它展示了如何将语音识别、自然语言处理和语音合成技术整合到一起,构建完整的实时对话系统。我在实际操作中发现它的代码结构清晰,非常适合学习现代实时通信技术的实现原理。基于火山引擎豆包大模型,从零搭建一个实时语音通话应用。

2600_94959839的博客 1267

OpenEuler22.04 快速部署Docker:华为云镜像源配置指南

本文详细介绍了在OpenEuler 22.04系统上快速部署Docker的完整流程。针对系统默认源版本老旧的问题,重点讲解了如何配置华为云镜像源以加速安装,并涵盖Docker引擎、Docker Compose的安装、服务启动验证、权限配置、镜像加速等核心步骤与常见问题排查,帮助用户高效搭建稳定的容器化开发环境。

http9protocoller的博客 173

Android WebSocket 服务端实战:从选型到高并发优化

基于火山引擎豆包大模型,从零搭建一个实时语音通话应用。它不是简单的问答,而是需要你亲手打通 ASR(语音识别)→ LLM(大脑思考)→ TTS(语音合成)的完整 WebSocket 链路。对于想要掌握 AI 原生应用架构的同学来说,这是个绝佳的练手项目。架构理解:掌握实时语音应用的完整技术链路(ASR→LLM→TTS)技能提升:学会申请、配置与调用火山引擎AI服务定制能力:通过代码修改自定义角色性格与音色,实现“从使用到创造”从0到1构建生产级别应用,脱离Demo,点击打开。

2600_94960214的博客 549

NTFS分区变成RAW别乱修!正确数据恢复与修复方法详解

文件系统是操作系统管理存储数据的核心机制,NTFS作为Windows主流文件系统,一旦分区识别异常,常会显示为RAW格式。分区变RAW通常意味着文件系统入口信息损坏,而非数据物理消失,但若采用错误的修复方式,如直接对RAW分区执行chkdsk /f,可能因系统无法正确识别文件系统结构,导致写入操作落在错误偏移位置,二次破坏本可恢复的数据。正确的处理思路是:先停止一切写入操作,通过扇区级镜像备份保留原始现场,再分析DBR、分区表及$MFT状态,依据诊断结果选择修复或深度扫描恢复。实际排查中,常见问题如DBR记

weixin_31155097的博客 134

Ambari 3.0.0 + BigTop 3.3.0 源码编译与集群部署指南(Kylin V10 / aarch64)

仅仅是针对“应用商店目录(Applications Catalog)”的一个外围附属子模块(它不是 YARN 监控大盘,不影响 YARN UI 网页的主体使用),我们可以采用。自带的 Node 二进制是 x86_64 版本,在 ARM64(aarch64)容器上无法执行(Exit value: 126)。:Ambari Server/Agent 使用 JDK 17,BigTop 大数据组件(Hadoop/HBase/Spark 等)使用 JDK 8。,源码中包含 x86 特定的原生二进制文件。

amumu1992的博客 481

安卓用websocket实现推送

代码中使用注解让这个类自动变成一个可以被url访问的servlet(他并不是servlet,好像叫endpoint什么的)。所以我想访问这个类的格式。这里面有一个handler是对应activity的handler。但是不要妄想把这个链接放到浏览器地址栏里面,chrome会说url格式不允许,firefox没有反应,ie是直接变成搜索这里面的东西。4我在网上找的教程,服务端都是使用注解。可以看到这端代码中所有的websocket包都是javax里面的。你可以把它添加在项目的依赖文件中,或者百度一个加进来。

m0_72495985的博客 895

BookSim2.0 教程

本文是yz关于BookSim2.0的个人学习经验与教程。 1.介绍 什么是BookSim2.0 BookSim2.0 是周期正确的互联网络模拟器(A Cycle-Accurate Interconnection Network Simulator),被设计用来伴随William James Dally 等人出版的的书籍 Principles and Practices of INterconnection on Networks使用。 此后其功能不断得到扩展。当前的主要版本 BookSim 2.0 支持广泛

更新一些计算机体系架构NoC,GEM5, AXI4,还有machine learning 的日常 5736

Android WebSocket 实践

既生HTTP何生WebSockt 与服务端交互的协议中,HTTP只能被动接收客户端请求,然后响应。而WebSocket在客户端与服务端建立连接以后,服务端可以主动发消息给客户端。这就是WebSocket的特点。 应用 因为服务端可以主动发消息的特性,WebSocket在以下场景使用非常多: 1、推送 2、聊天室 3、开发工具 4… 大部分功能依赖于产品的业务,投入使用可能比较困难,而开发工具是开发...

100斤的博客 2050

AI智算-K8s+vLLM & Ray:DeepSeek-r1 671B 满血版分布式推理部署实践

自从上次发布 【AI-智算】K8s+SGLang实战:DeepSeek-r1:671b满血版多机多卡私有化部署全攻略] 文章后,本次将演示另一个主流推理引擎工具——vLLM,结合K8s、LWS、Ray、Volcano等技术栈,部署DeepSeek-r1 671b 满血版分布式推理集群,并对比其与SGLang推理引擎的性能表现。

Kason_iWiki 1823

Could not create cache adapter cache factory not found: factory for cache adapter ““ was not regist

RROR: Could not create cache adapter error=cache factory not found: factory for cache adapter "" was not registered ERROR: Job failed (system failure): Error response from daemon: OCI runtime create failed: container_linux.go:349: starting co...

知无涯 4032

Android WebSocketServer 服务端几行代码轻松实现

Android WebSocketServer简单实现 很多网上的方案都是实现android为客户端,但最近的需求是实现服务端,因为android资源有限, 1. 需要尽可能简单, 2. 且实现后占用资源小,效率高越好, 3. 实现门槛低,一看就会,有手就行的那种 试过vertx,androidasync...等 但性能上表现的并不是很好,或者逻辑实现上让人有些丈二、 最终选用java Websocket经过验证,性能较稳定,且较轻量级容易实现 下面开始实现 build.gradle中导

幡然的博客 5363

Vue/React动态页面爬取:不用Playwright也能抓全数据的3个JS逆向技巧(附Python代码)

Vue/React动态页面的爬取核心是“绕过渲染,直达数据”:90%的场景下,API接口或初始数据足以满足需求,Playwright等渲染工具只应作为“最后手段”(如无API、参数加密极复杂)。记住:爬虫的效率与“模拟真实浏览器的程度”成反比——越少模拟浏览器,效率越高。掌握JS逆向技巧,既能避开Playwright的性能坑,又能提升爬虫的抗反爬能力,这才是动态页面爬取的最优解。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1597

webSocket

//WebSocket 依赖包 compile 'org.java-websocket:Java-WebSocket:1.3.0'

xiaoqingct的博客 397

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

java-websocket 服务端 开发中遇到的问题

一、     由于项目需求,需要早android设备上架一个websocket服务,可以供浏览器调用。但是移动设备的ip是不固定的,也就是说到作为服务端,移动设备并不能完全满足客户端的需要。后来想到了用一台中转服务器,在这台服务器上架上websocket服务,然而移动端和pc端都是作为websocket的客户端存在。 二、        如过websocket要走wss通讯,就需要加

shaohan0719的专栏 3093

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Android中脱离WebView使用WebSocket实现群聊和推送功能

WebSocket是Web2.0时代的新产物,用于弥补HTTP协议的某些不足,不过他们之间真实的关系是兄弟关系,都是对socket的进一步封装,其目前最直观的表现就是服务器推送和聊天功能。更多知识参考:如何理解 TCP/IP, SPDY, WebSocket 三者之间的关系? 今天的重点是讲如何在Android中脱离WebView使用WebSocket,而不是在Web浏览器使用,...

weixin_30819163的博客 158

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

FunASR移动端语音识别实战指南:Android客户端集成与WebSocket服务部署

FunASR作为阿里达摩院开源的高性能语音识别工具包,为企业级应用提供了完整的端到端语音识别解决方案。本文聚焦于移动端实践,深入解析如何在Android设备上通过WebSocket协议集成FunASR语音识别服务,为移动应用开发者提供从服务部署到客户端集成的完整技术路径。 ## 概念解析:移动端语音识别架构设计 FunASR的移动端部署采用"云端推理+移动端采集"的架构模式,这种设计平衡了识别

gitblog_00097的博客 756

Android搭建本地服务

Android搭建本地服务在项目中涉及的本地server主要场景有两种: 1.实现类似于PC端视频播放的边看边缓冲,实现良好的播放体验 2.分享手机内容,如图片/音视频目前接触到相关的比较好多框架是nanohttpd和AndroidAsync。 nanohttpd是一个轻量级的http服务框架,源码只有一个文件,应用也非常方便,如官方的一个简单的例子: public class App exte

hpb21的专栏 3694

Moukthar服务端部署指南:Linux下配置PHP+MySQL+Apache全步骤

Moukthar是一款开源的Android远程管理工具(Remote Administration Tool),其服务端采用PHP+MySQL搭建,配合WebSocket实现设备实时通信。本指南将带你从零开始在Linux服务器上完成Moukthar服务端部署,涵盖环境安装、数据库配置、Apache虚拟主机设置与WebSocket服务启动的完整流程,即使你是新手也能一步步照做成功。 [![Mouk

gitblog_00893的博客 795

Android 使用WebSocket通信

本文介绍了Android端使用OkHttp与Node.js服务端建立WebSocket通信的实现方法。服务端采用Node.js的websocket库,实现了文本和二进制消息的接收与自动回复功能,支持控制台输入发送消息。Android端通过OkHttp库建立WebSocket连接,实现了连接状态监听、消息接收(文本和二进制)以及消息发送功能。文中提供了完整的代码示例,包括服务端消息处理逻辑和Android端的连接建立、消息收发实现。该方案可用于实现Android应用与Node.js服务端之间的实时双向通信。

xiangxiongfly 79

开发简单Android聊天软件(2)

服务端需要创建可供连接socket服务

weixin_41812640的博客 2165
上一篇: Android如何设置App字体大小不跟随系统字体调整而变化
下一篇: 在Kotlin中配置dataBinding项目无法运行
Roc丶Fu
博客等级 码龄11年 8粉丝 13原创
评论 89
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值