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);
        }
    }
}
相关推荐
疋瓞1 小时前
python和C++对比(1)_数据类型和数据结构
数据结构·c++·python
C语言小火车1 小时前
C++ 堆排序深度精讲:基于完全二叉树的选择排序进化,最坏情况 O(n log n) 的稳定王者
开发语言·c++·算法·排序算法·堆排序
北冥you鱼1 小时前
abigen 最佳实践:从入门到精通,高效生成 Go 语言合约绑定
开发语言·golang·区块链
ALex_zry2 小时前
C++26 std::complex 结构化绑定详解:auto [re, im] = c
c语言·开发语言·c++
如此这般英俊2 小时前
手搓Claude Code-第六章 subagent
数据结构·人工智能·python·语言模型·自然语言处理
shushangyun_3 小时前
2026智能采购商城系统选型指南:如何引领企业数字化采购升级
java·大数据·数据库·人工智能·机器学习
她说..3 小时前
Java 默认值设置方式
java·开发语言·后端·springboot
元Y亨H3 小时前
Python - FastAPI 全方位介绍
python·fastapi
折哥的程序人生 · 物流技术专研3 小时前
Java面试通关⑯:JVM虚拟机核心全集
jvm·校招·虚拟机·gc垃圾回收·java面试·类加载·调优
忧郁的紫菜3 小时前
基础实现:单篇 Markdown 转 Word
开发语言·c#·word