• websocket在java中的使用教程


    本文从websocket服务端和客户端两个方面简单介绍下websocket在java中的使用。

    一、websocket服务端(WebSocketServer)

    websocket服务端是以本机作为消息的接受端,用于接受客户端websocket发送过来的消息,并可以通过客户端的websocket对象来反馈消息给websocket客户端,以下为websocket服务端创建步骤。

    创建myWebSocketServer.java类,并继承WebSocketServer,并实现内部的5个方法,初始代码如下

    import org.java_websocket.WebSocket;
    import org.java_websocket.handshake.ClientHandshake;
    import org.java_websocket.server.WebSocketServer;
    
    public class myWebSocketServer extends WebSocketServer {
    
        @Override
        public void onOpen(WebSocket webSocket, ClientHandshake clientHandshake) {
            
        }
    
        @Override
        public void onClose(WebSocket webSocket, int i, String s, boolean b) {
    
        }
    
        @Override
        public void onMessage(WebSocket webSocket, String s) {
    
        }
    
        @Override
        public void onError(WebSocket webSocket, Exception e) {
    
        }
    
        @Override
        public void onStart() {
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    onOpen方法会在客户端websocket连接上当前服务端时调用,参数webSocket代表的就是客户端的websocket对象,可以通过该对象发送消息给客户端,也可以通过该对象获取客户端的ip地址等信息。

    onClose方法是当客户端断开连接时调用

    onMessage方法则是客户端向服务端发送消息时调用,其中webSocket参数表明发送消息的客户端,字符串s表示所发送的消息

    onError方法是当客户端和当前服务端通信出现异常时调用

    onStart方法则是服务端开启时调用

    为此,我们可以实现简单的一些功能

    import org.java_websocket.WebSocket;
    import org.java_websocket.handshake.ClientHandshake;
    import org.java_websocket.server.WebSocketServer;
    
    import java.net.InetSocketAddress;
    import java.util.ArrayList;
    import java.util.List;
    
    public class myWebSocketServer extends WebSocketServer {
    
        // 定义有参构造器,用于服务端websocket的创建
        public myWebSocketServer(String ip,Integer port){
            super(new InetSocketAddress(ip,port));
        }
    
        // 定义一个集合用来存储和当前websocket服务器保持连接的websocket客户端
        List<WebSocket> onLine = new ArrayList<>();
        @Override
        public void onOpen(WebSocket webSocket, ClientHandshake clientHandshake) {
            System.out.println("有新的websocket客户端连接:"+webSocket.getRemoteSocketAddress().getHostName()+":"+webSocket.getRemoteSocketAddress().getPort());
            // 当有客户端连接将其加入onLine集合中
            onLine.add(webSocket);
        }
    
        @Override
        public void onClose(WebSocket webSocket, int i, String s, boolean b) {
    
            System.out.println("websocket客户端断开连接:"+webSocket.getRemoteSocketAddress().getHostName()+":"+webSocket.getRemoteSocketAddress().getPort());
            // 当有客户端断开连接将其从onLine集合中移除
            onLine.remove(webSocket);
        }
    
        @Override
        public void onMessage(WebSocket webSocket, String s) {
            System.out.println("收到客户端 "+webSocket.getRemoteSocketAddress().getHostName()+":"+webSocket.getRemoteSocketAddress().getPort()+" 发送过来的消息:"+s);
            // 向客户端回馈消息
            webSocket.send("收到");
            // 亦可以群发消息
            for (WebSocket socket : onLine) {
                socket.send(webSocket.getRemoteSocketAddress().getHostName()+":"+webSocket.getRemoteSocketAddress().getPort()+" 群发消息:"+s);
            }
        }
    
        @Override
        public void onError(WebSocket webSocket, Exception e) {
            System.out.println("和客户端 "+webSocket.getRemoteSocketAddress().getHostName()+":"+webSocket.getRemoteSocketAddress().getPort()+" 通信发生异常");
    
        }
    
        @Override
        public void onStart() {
            System.out.println("websocket服务端已启动");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54

    websocket客户端(WebSocketClient)

    import org.java_websocket.client.WebSocketClient;
    import org.java_websocket.handshake.ServerHandshake;
    
    import java.net.URI;
    
    public class myWebSocketClient extends WebSocketClient {
        public myWebSocketClient(URI serverUri) {
            super(serverUri);
        }
    
        @Override
        public void onOpen(ServerHandshake serverHandshake) {
            System.out.println("websocket成功连接");
        }
    
        @Override
        public void onMessage(String s) {
            System.out.println("收到服务端发送的消息:"+s);
    
        }
    
        @Override
        public void onClose(int i, String s, boolean b) {
            System.out.println("已经和服务端断开连接");
        }
    
        @Override
        public void onError(Exception e) {
            System.out.println("和服务端通信发送异常");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    websocket客户端实现的方法含义和服务端一样

    服务端和客户端通信测试

    创建测试类

    public class webSocketTest {
    
    
        public static void main(String[] args) throws Exception {
            // 创建服务端websocket对象
            myWebSocketServer server = new myWebSocketServer("127.0.0.1",8899);
            // 启动服务端websocket
            server.start();
    
            // 循环启动多个客户端连接服务端
            for (int i = 0;i<4;i++) {
                // 连接服务端websocket的地址
                URI uri = new URI("ws://127.0.0.1:8899");
                // 创建客户端websocket对象
                myWebSocketClient client = new myWebSocketClient(uri);
                // 阻塞式连接
                client.connectBlocking();
                // 向服务端发送消息
                client.send("我是客户端"+i);
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    执行结果
    在这里插入图片描述

  • 相关阅读:
    IDEA安装Tomcat
    关于openfeign的http和rpc
    Android kotlin 实现一键清理内存功能
    ERP是数字化的底座,你数字化转型的巨人肩膀
    nuxt3正确使用keepalive页面缓存组件缓存
    代码随想录算法训练营第三天|LeetCode 203.移除链表元素 、707.设计链表 、206.反转链表
    【iOS开发】——KVO与KVC
    【数据库数据恢复】HP-UX系统ORACLE数据库数据恢复案例
    快速了解常用的对称加密算法,再也不用担心面试官的刨根问底
    redis未授权与权限获取
  • 原文地址:https://blog.csdn.net/weixin_42684368/article/details/136473091