websocket在java中的使用教程

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

一、websocket服务端(WebSocketServer)

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

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

java 复制代码
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() {

    }
}

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

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

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

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

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

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

java 复制代码
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服务端已启动");
    }
}

websocket客户端(WebSocketClient)

java 复制代码
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("和服务端通信发送异常");
    }
}

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

服务端和客户端通信测试

创建测试类

java 复制代码
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);
        }
    }
}

执行结果

相关推荐
2401_8572979116 分钟前
秋招内推2025-招联金融
java·前端·算法·金融·求职招聘
一 乐20 分钟前
考研论坛平台|考研论坛小程序系统|基于java和微信小程序的考研论坛平台小程序设计与实现(源码+数据库+文档)
java·数据库·学习·考研·微信·小程序·源码
一 乐21 分钟前
租拼车平台|小区租拼车管理|基于java的小区租拼车管理信息系统小程序设计与实现(源码+数据库+文档)
java·数据库·vue.js·微信·notepad++·拼车
xmh-sxh-131440 分钟前
如何选择数据库架构
java
jxxchallenger40 分钟前
踩坑spring cloud gateway /actuator/gateway/refresh不生效
java·数据库·gateway
远望樱花兔1 小时前
【d59】【Java】【力扣】146.LRU缓存
java·开发语言·算法
Bonne journée1 小时前
‌在Python中,print(f‘‘)是什么?
java·开发语言·python
2402_857589362 小时前
新闻推荐系统:Spring Boot框架详解
java·spring boot·后端
2401_857622662 小时前
新闻推荐系统:Spring Boot的可扩展性
java·spring boot·后端
小懒编程日记2 小时前
【数据结构与算法】B树
java·数据结构·b树·算法