懂的自然懂,代码做了相应精简优化处理。想看效果的可直接使用
import org.java_websocket.client.WebSocketClient; import org.java_websocket.handshake.ServerHandshake; import java.net.URI; import java.util.Arrays; import java.util.Timer; import java.util.TimerTask; public class SimplifiedDanmuClient extends WebSocketClient { private String token; private String streamId; private String pageId; public SimplifiedDanmuClient(URI serverURI, String token, String streamId, String pageId) { super(serverURI); this.token = token; this.streamId = streamId; this.pageId = pageId; } @Override public void onOpen(ServerHandshake handshake) { LOGGER.info("------ WebSocket Opened ------"); byte[] header = token.endsWith("==") ? hexToBytes("08c8011ac8010a9801") : hexToBytes("08c8011adc010aac01"); byte[] tokenBytes = token.getBytes(); byte[] fixedBytes = hexToBytes("120b"); byte[] streamIdBytes = streamId.getBytes(); byte[] constantBytes = hexToBytes("3a1e"); byte[] pageIdBytes = pageId.getBytes(); byte[] message = concatenateArrays(header, tokenBytes, fixedBytes, streamIdBytes, constantBytes, pageIdBytes); send(message); startHeartbeat(); } private void startHeartbeat() { TimerTask heartbeatTask = new TimerTask() { public void run() { byte[] heartBeat = hexToBytes("08011a070889aac0da8130"); LOGGER.info("****** Sending Heartbeat ******"); send(heartBeat); } }; new Timer().scheduleAtFixedRate(heartbeatTask, 0, 20 * 1000); // Schedule the task for every 20 seconds } private byte[] concatenateArrays(byte[]... arrays) { int totalLength = Arrays.stream(arrays).mapToInt(array -> array.length).sum(); byte[] result = new byte[totalLength]; int currentPosition = 0; for (byte[] array : arrays) { System.arraycopy(array, 0, result, currentPosition, array.length); currentPosition += array.length; } return result; } private static byte[] hexToBytes(String hexString) { // Implementation of hex string to byte array conversion // Assume this method is implemented correctly } public static void main(String[] args) throws Exception { // Example usage URI serverUri = new URI("ws://example.com/websocket"); String token = "your_token"; String streamId = "your_stream_id"; String pageId = "your_page_id"; SimplifiedDanmuClient client = new SimplifiedDanmuClient(serverUri, token, streamId, pageId); client.connect(); } }
说明:
直接在构造函数中传递token、streamId和pageId参数,以便于创建WebSocket客户端实例时直接使用。
精简了onOpen方法,使用一个辅助方法concatenateArrays来简化多个字节数组的拼接操作。
startHeartbeat方法分离,将心跳包的发送逻辑移至独立方法,提高代码的可读性和维护性。
省略了hexToBytes和LOGGER的实现细节,假设这些方法/变量已经适当地定义。
转载请保留原文链接
评论