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);
        }
    }
}

执行结果

相关推荐
lichong95115 小时前
Android studio 修改包名
android·java·前端·ide·android studio·大前端·大前端++
lichong95115 小时前
Git 检出到HEAD 再修改提交commit 会消失解决方案
java·前端·git·python·github·大前端·大前端++
@yanyu66616 小时前
Tomcat安装与HTML响应实战
java·tomcat·html
Chen-Edward17 小时前
有了Spring为什么还有要Spring Boot?
java·spring boot·spring
陈小桔18 小时前
idea中重新加载所有maven项目失败,但maven compile成功
java·maven
小学鸡!18 小时前
Spring Boot实现日志链路追踪
java·spring boot·后端
xiaogg367818 小时前
阿里云k8s1.33部署yaml和dockerfile配置文件
java·linux·kubernetes
逆光的July18 小时前
Hikari连接池
java
微风粼粼18 小时前
eclipse 导入javaweb项目,以及配置教程(傻瓜式教学)
java·ide·eclipse
番茄Salad18 小时前
Spring Boot临时解决循环依赖注入问题
java·spring boot·spring cloud