当前位置:首页 > 移动端 > Android搭建WebSocket服务端

Android搭建WebSocket服务端

2022年09月17日 23:28:48移动端13

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搭建WebSocket服务端 _ JavaClub全栈架构师技术笔记

Android搭建WebSocket服务端 _ JavaClub全栈架构师技术笔记

 

 

 

 

 

 

作者:Roc丶Fu
来源链接:https://blog.csdn.net/android_fcp/article/details/82983236

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/mobile/42831.html

分享给朋友:

“Android搭建WebSocket服务端” 的相关文章

Java空指针异常解决java.lang.NullPointerException解决心得

Java空指针异常解决java.lang.NullPointerException解决心得

今天做课设的时候运行程序报出以下错误 java.lang.NullPointerException 首先要理解的是此错误并不会在 程序中报错,只会在运行的时候报错。 是由于某个参数(集合,数组等数据)可能出现一个null值而导致后面的程序不能运行时...

【Android实战】保存QQ账号与密码

【Android实战】保存QQ账号与密码

大家好,我是汤姆凯特。写在前面:今天用保存QQ账号和密码的实战演练,带大家掌握Android存储中最基本的文件存储方式文件存储是Android中最基本的一种数据存储方式,它与Java中的文件存储类似,都是通过I/O流形式把数据直接存储到文件中,下面我们一起来看一下如何用Android实现文件存储功能...

让Android Studio代码提示不区分大小写的方法

让Android Studio代码提示不区分大小写的方法

在as的使用过程中,智能提示会区分大小写,对我们快速开发十分不利,不断切换大小写很影响效率,这个时候不区分大小写的优势就出来了,如何设置,直接上图: 作者:大前端之旅 来源链接: https://jianguo.blog.csd...

使用 Amazon Amplify快速创建简单的 Android 应用程序

使用 Amazon Amplify快速创建简单的 Android 应用程序

背景: 亚马逊云科技提供了100余种产品免费套餐。其中,计算资源Amazon EC2首年12个月免费,750小时/月;存储资源 Amazon S3 首年12个月免费,5GB标准存储容量。 大家好,我是坚果,由于最近一直疫情居家,所以想到外边转转,但...

超基础的Android studio的安装教程

超基础的Android studio的安装教程

Android Studio安装: 下载并安装 Android Studio。 启动 Android Studio,并通过“Android Studio 设置向导”。安装最新的 SDK Platform-Tools 和 Android SDK...

Flutter设置App的应用名字和应用logo图标的方法(android ios web)

Flutter设置App的应用名字和应用logo图标的方法(android ios web)

在前面的几期给大家介绍了flutter的安装以及一些简单的配置,还运行了helloword 那么接下来就带领大家了解如何设置应用名称以及图标 Flutter设置App的应用名字和应用logo图标的方法, 知识点虽然简单,但是不知道这个知...

如何显示Magento 错误信息!Magento install error – Exception printing

编辑器加载中... 如何显示Magento 错误信息!Magento install error – Exception printing is disabled Here is a known error which can occur when installing Magento...

关于Java中Error和Exception的区别

  做个比喻:   Error和Exception的区别就是水池和水池里的水的区别;   水池,是代码正常运行的外部环境,如果水池奔溃(系统奔溃),或者池水满溢(内存溢出),这些跟水池外部环境有关的是Error;   水池里的水,是正常运行的代码,水污染了,有杂质了,...

浅谈 Android  Exception & Throwable 类

浅谈 Android Exception & Throwable 类

一、Throwable 类 概述:java将所有的错误封装为一个对象,其根本父类为Throwable, Throwable有两个子类:Error和Exception。 Error: 这种异常被设计成不被捕获,因为这种异常产生于JVM自身。 Runti...

DAX: RPC error: RPC exception 5 in Ping occurred in session 36

Issue: BC Proxy account fails to start for the SSRS reports in Enterprise Portal with RPC exception 5 When Enterprise Portal starts for...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。