java多线程测试websocket demo(使用文件流)

这个demo主要是利用Java多线程来测试WebSocket通信。首先,创建一个WebSocket服务器和客户端,然后使用多线程来模拟多个客户端同时连接服务器进行通信。通过多线程测试,可以验证WebSocket通信的并发性能和稳定性。同时,可以通过多线程测试来模拟不同场景下的并发请求,以便对WebSocket服务器进行压力测试和性能优化。整个demo会包括创建WebSocket服务器和客户端的代码,以及多线程测试的代码实现。通过这个demo,可以更好地了解WebSocket通信的多线程测试方法和实现。

java 复制代码
@ClientEndpoint
public class WebSocketClient {

    private static final AtomicInteger connectedCount = new AtomicInteger(0);
    private static final LongAdder firstFrameLatencySum = new LongAdder();
    private static final CountDownLatch latch = new CountDownLatch(20);
    private static final int MESSAGE_SIZE = 1024;

    private static final int CONCURRENCY_LEVEL = 20;

    private static final AtomicLong startTime = new AtomicLong(0);

    @OnOpen
    public void onOpen(Session session) {
        connectedCount.incrementAndGet();
    }

    @OnMessage
    public void onMessage(String message) {
        startTime.set(System.nanoTime());

        System.out.println(Thread.currentThread().getName() + ": " + message);
    }

    @OnClose
    public void onClose(Session session, CloseReason closeReason) {
        connectedCount.decrementAndGet();
    }

    public static void main(String[] args) throws URISyntaxException, Exception {
        for (int i = 0; i < CONCURRENCY_LEVEL; i++) {
            WebSocketContainer container = ContainerProvider.getWebSocketContainer();
            Session session = container.connectToServer(WebSocketClient.class, new URI("ws://you_url"));
            session.getBasicRemote().sendBinary(ByteBuffer.wrap(generateMessage()));
            latch.countDown();
        }

        latch.await(100, TimeUnit.SECONDS);
        System.out.println("Connected clients: " + connectedCount.get());
        System.out.println("Average first frame latency: " + (firstFrameLatencySum.sum() / CONCURRENCY_LEVEL) + " nanoseconds");
    }

    private static byte[] generateMessage() {
        try {
            FileInputStream fileInputStream = new FileInputStream("D:\\smn.wav");
            byte[] fileData = new byte[fileInputStream.available()];
            fileInputStream.read(fileData);
            fileInputStream.close();
            return ArrayUtils.subarray(fileData, 0, 300000);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}
相关推荐
是Dream呀4 分钟前
昇腾实战|算子模板库Catlass与CANN生态适配
开发语言·人工智能·python·华为
tanxiaomi5 分钟前
Redisson分布式锁 和 乐观锁的使用场景
java·分布式·mysql·面试
零匠学堂20256 分钟前
移动学习系统,如何提升企业培训效果?
java·开发语言·spring boot·学习·音视频
小杨快跑~13 分钟前
从装饰者到桥接再到工厂:模式组合的艺术
java·开发语言·设计模式
say_fall16 分钟前
C语言编程实战:每日一题:随机链表的复制
c语言·开发语言·链表
饕餮争锋16 分钟前
Spring内置的Bean作用域介绍
java·后端·spring
却话巴山夜雨时i17 分钟前
394. 字符串解码【中等】
java·数据结构·算法·leetcode
培根芝士21 分钟前
使用llm-compressor 对 Qwen3-14B 做 AWQ + INT4 量化
人工智能·python
拾贰_C23 分钟前
【Python | Anaconda】 python-Anaconda 一些命令使用
开发语言·python
张人大 Renda Zhang39 分钟前
Java 虚拟线程 Virtual Thread:让“每请求一线程”在高并发时代复活
java·jvm·后端·spring·架构·web·虚拟线程