1
zj
2024-07-12 c2cf572d823f5ab410fd82ae169f012caf3386c7
1
8 files modified
399 ■■■■■ changed files
websocketClient/src/main/java/org/example/config/WsClientConfig.java 327 ●●●● patch | view | raw | blame | history
websocketClient/src/main/java/org/example/constant/StockConstant.java 4 ●●●● patch | view | raw | blame | history
websocketClient/src/main/java/org/example/controller/WsClientController.java 39 ●●●●● patch | view | raw | blame | history
websocketClient/src/main/java/org/example/enums/EStockType.java 1 ●●●● patch | view | raw | blame | history
websocketClient/src/main/java/org/example/server/wcServer.java 2 ●●● patch | view | raw | blame | history
websocketSerivce/src/main/java/org/example/timedTask/NewsTask.java 2 ●●● patch | view | raw | blame | history
websocketSerivce/src/main/java/org/example/timedTask/StockTask.java 2 ●●● patch | view | raw | blame | history
websocketSerivce/src/main/java/org/example/websocket/server/WsServer.java 22 ●●●● patch | view | raw | blame | history
websocketClient/src/main/java/org/example/config/WsClientConfig.java
@@ -1,163 +1,166 @@
package org.example.config;
//package org.example.config;
//
//import com.google.gson.Gson;
//import com.google.gson.reflect.TypeToken;
//import io.socket.emitter.Emitter;
//import lombok.Data;
//import org.apache.http.HttpResponse;
//import org.apache.http.client.HttpClient;
//import org.apache.http.client.entity.UrlEncodedFormEntity;
//import org.apache.http.client.methods.HttpPost;
//import org.apache.http.impl.client.HttpClients;
//import org.apache.http.message.BasicNameValuePair;
//import org.example.client.IO;
//import org.example.client.Socket;
//import org.example.constant.StockConstant;
//import org.json.JSONException;
//import org.json.JSONObject;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//
//import java.io.IOException;
//import java.lang.reflect.Type;
//import java.net.URI;
//import java.net.URISyntaxException;
//import java.nio.charset.StandardCharsets;
//import java.text.SimpleDateFormat;
//import java.util.ArrayList;
//import java.util.Date;
//import java.util.List;
//import java.util.Map;
//import java.util.concurrent.CompletableFuture;
/**
 * stocket.io
  */
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import io.socket.emitter.Emitter;
import lombok.Data;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.example.client.IO;
import org.example.client.Socket;
import org.example.constant.StockConstant;
import org.json.JSONException;
import org.json.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.io.IOException;
import java.lang.reflect.Type;
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
@Slf4j
@Configuration
public class WsClientConfig {
    private static final String SERVER_URL = StockConstant.IO_HTTP_API;
    private static final String AUTH_KEY = StockConstant.KEY;
    private static final String ROOM_ID = "14";
    private static Socket socket;
    private static HttpClient httpClient = HttpClients.createDefault(); // 单例化 HttpClient
    static {
        httpPost = new HttpPost("http://127.0.0.1:8001/api/sendNotification"); // 初始化 HttpPost
    }
    private static HttpPost httpPost;
    @Bean
    public void websocketRunClientMap() {
        connectToServer();
    }
    private static void connectToServer() {
        IO.Options options = new IO.Options();
        options.reconnection = true;
        options.reconnectionDelay = 1000;
        try {
            socket = IO.socket(new URI(SERVER_URL), options);
        } catch (URISyntaxException e) {
            log.error("Invalid URI", e);
            return;
        }
        socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() {
            @Override
            public void call(Object... args) {
                authenticate();
            }
        });
        socket.on("marketData", new Emitter.Listener() {
            @Override
            public void call(Object... args) {
                    Map<String, Object> map = jsonToMap(args[0].toString());
                    if(map.get("pid").equals("00000001")){
                        System.out.println("接收时间:"  +  new SimpleDateFormat("HH:mm:ss").format(new  Date())  +  "  "  +  args[0].toString());
                    }
                    send(args[0].toString());
            }
        });
        socket.on(Socket.EVENT_CONNECT_ERROR, new Emitter.Listener() {
            @Override
            public void call(Object... args) {
                log.error("socketIo连接错误: " + args[0]);
            }
        });
        socket.on(Socket.EVENT_DISCONNECT, new Emitter.Listener() {
            @Override
            public void call(Object... args) {
                log.error("socketIo 断开连接: " + args[0]);
                if (!socket.connected()) {
                    log.error("socketIo 开始重连: " + args[0]);
                    reconnect();
                }
            }
        });
        socket.connect();
    }
    public static Map<String, Object> jsonToMap(String json) {
        Gson gson = new Gson();
        Type type = new TypeToken<Map<String, Object>>(){}.getType();
        return gson.fromJson(json, type);
    }
    private static void reconnect() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (!socket.connected()) {
                    try {
                        log.error("socketIo 开始重连");
                        socket.connect();
                        Thread.sleep(5000); // 重连间隔,单位毫秒
                    } catch (InterruptedException e) {
                        log.error("重连被中断", e);
                    }
                }
            }
        }).start();
    }
    private static void authenticate() {
        log.info("socketIo---->开始连接");
        if (socket != null && socket.connected()) {
            JSONObject authData = new JSONObject();
            try {
                authData.put("key", AUTH_KEY);
                authData.put("roomId", ROOM_ID);
                socket.emit("authenticate", authData);
                log.info("socketIo---->连接成功");
            } catch (JSONException e) {
                log.error("socketIo认证错误:"+e.getMessage(), e);
            }
        }
    }
    private static void send(String message) {
        try {
            // 准备 form-data 参数
            List<BasicNameValuePair> params = new ArrayList<>();
            params.add(new BasicNameValuePair("message", message));
            // 设置编码格式为 UTF-8
            UrlEncodedFormEntity entity = new UrlEncodedFormEntity(params, StandardCharsets.UTF_8);
            httpPost.setEntity(entity); // 设置 HttpPost 对象的参数
            // 发送请求
            HttpResponse response = httpClient.execute(httpPost);
            // 处理响应
            int statusCode = response.getStatusLine().getStatusCode();
        } catch (IOException e) {
            log.error("Http 请求错误", e);
        }
    }
}
//@Slf4j
//@Configuration
//public class WsClientConfig {
//
//    private static final String SERVER_URL = StockConstant.IO_HTTP_API;
//    private static final String AUTH_KEY = StockConstant.KEY;
//    private static final String ROOM_ID = "14";
//    private static Socket socket;
//    private static HttpClient httpClient = HttpClients.createDefault(); // 单例化 HttpClient
//
//    static {
//        httpPost = new HttpPost("http://127.0.0.1:8001/api/sendNotification"); // 初始化 HttpPost
//    }
//
//    private static HttpPost httpPost;
//
//    @Bean
//    public void websocketRunClientMap() {
//        connectToServer();
//    }
//
//    private static void connectToServer() {
//        IO.Options options = new IO.Options();
//        options.reconnection = true;
//        options.reconnectionDelay = 1000;
//
//        try {
//            socket = IO.socket(new URI(SERVER_URL), options);
//        } catch (URISyntaxException e) {
//            log.error("Invalid URI", e);
//            return;
//        }
//
//        socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() {
//            @Override
//            public void call(Object... args) {
//                authenticate();
//            }
//        });
//
//        socket.on("marketData", new Emitter.Listener() {
//            @Override
//            public void call(Object... args) {
//                    Map<String, Object> map = jsonToMap(args[0].toString());
//                    if(map.get("pid").equals("00000001")){
//                        System.out.println("接收时间:"  +  new SimpleDateFormat("HH:mm:ss").format(new  Date())  +  "  "  +  args[0].toString());
//                    }
//                    send(args[0].toString());
//            }
//        });
//
//        socket.on(Socket.EVENT_CONNECT_ERROR, new Emitter.Listener() {
//            @Override
//            public void call(Object... args) {
//                log.error("socketIo连接错误: " + args[0]);
//            }
//        });
//
//        socket.on(Socket.EVENT_DISCONNECT, new Emitter.Listener() {
//            @Override
//            public void call(Object... args) {
//                log.error("socketIo 断开连接: " + args[0]);
//                if (!socket.connected()) {
//                    log.error("socketIo 开始重连: " + args[0]);
//                    reconnect();
//                }
//            }
//        });
//
//        socket.connect();
//    }
//
//    public static Map<String, Object> jsonToMap(String json) {
//        Gson gson = new Gson();
//        Type type = new TypeToken<Map<String, Object>>(){}.getType();
//        return gson.fromJson(json, type);
//    }
//
//    private static void reconnect() {
//        new Thread(new Runnable() {
//            @Override
//            public void run() {
//                while (!socket.connected()) {
//                    try {
//                        log.error("socketIo 开始重连");
//                        socket.connect();
//                        Thread.sleep(5000); // 重连间隔,单位毫秒
//                    } catch (InterruptedException e) {
//                        log.error("重连被中断", e);
//                    }
//                }
//            }
//        }).start();
//    }
//
//    private static void authenticate() {
//        log.info("socketIo---->开始连接");
//        if (socket != null && socket.connected()) {
//            JSONObject authData = new JSONObject();
//            try {
//                authData.put("key", AUTH_KEY);
//                authData.put("roomId", ROOM_ID);
//                socket.emit("authenticate", authData);
//                log.info("socketIo---->连接成功");
//            } catch (JSONException e) {
//                log.error("socketIo认证错误:"+e.getMessage(), e);
//            }
//        }
//    }
//
//    private static void send(String message) {
//        try {
//            // 准备 form-data 参数
//            List<BasicNameValuePair> params = new ArrayList<>();
//            params.add(new BasicNameValuePair("message", message));
//
//            // 设置编码格式为 UTF-8
//            UrlEncodedFormEntity entity = new UrlEncodedFormEntity(params, StandardCharsets.UTF_8);
//            httpPost.setEntity(entity); // 设置 HttpPost 对象的参数
//
//            // 发送请求
//            HttpResponse response = httpClient.execute(httpPost);
//
//            // 处理响应
//            int statusCode = response.getStatusLine().getStatusCode();
//        } catch (IOException e) {
//            log.error("Http 请求错误", e);
//        }
//    }
//}
websocketClient/src/main/java/org/example/constant/StockConstant.java
@@ -21,4 +21,8 @@
    public  static String US_KEY = "jZFrku4RGQjP87Hmq5tm";
    public  static String JP_HTTP_API = "http://api-jp.js-stock.top/";
    public  static String JP_WS_URL = "ws://api-jp-ws.js-stock.top";
    public  static String JP_KEY = "glcd4SAiD6oXExIDOtUJ";
}
websocketClient/src/main/java/org/example/controller/WsClientController.java
@@ -1,10 +1,49 @@
package org.example.controller;
import lombok.extern.slf4j.Slf4j;
import org.example.enums.EStockType;
import org.example.server.wcServer;
import org.java_websocket.client.WebSocketClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.net.URI;
import java.util.HashMap;
import java.util.Map;
/**
 * @ClassDescription: 客户端请求类
 * @JdkVersion: 1.8
 * @Created: 2023/8/31 16:13
 */
@Slf4j
@Configuration
public class WsClientController {
    @Bean
    public Map<String, WebSocketClient> websocketRunClientMap() {
        Map<String, WebSocketClient> retMap = new HashMap<>(2);
        try {
            wcServer websocketRunClient = new wcServer(new URI("ws://api-jp-ws.js-stock.top"));
            websocketRunClient.connect();
            websocketRunClient.setConnectionLostTimeout(0);
            new Thread(() -> {
                while (true) {
                    try {
                        Thread.sleep(8000);
                        websocketRunClient.send("heartbeat".getBytes());
                    } catch (Exception e) {
                        websocketRunClient.reconnect();
                        websocketRunClient.setConnectionLostTimeout(0);
                    }
                }
            }).start();
        } catch (Exception e) {
        }
        return retMap;
    }
}
websocketClient/src/main/java/org/example/enums/EStockType.java
@@ -11,6 +11,7 @@
    IN("IN","印度股票","14", StockConstant.HTTP_API, StockConstant.KEY),
    JP("JP","日本股票","35", StockConstant.JP_HTTP_API,StockConstant.JP_KEY),
    US("US","美国股票","5",StockConstant.US_API_URL,StockConstant.US_KEY);
    private String code;
    private String typeDesc;
websocketClient/src/main/java/org/example/server/wcServer.java
@@ -42,7 +42,7 @@
    @Override
    public void onOpen(ServerHandshake shake) {
        send(("key:" + StockConstant.KEY + ":" + EStockType.IN.getContryId()).getBytes());
        send(("key:" + StockConstant.JP_KEY + ":" + EStockType.JP.getContryId()).getBytes());
    }
    @Override
websocketSerivce/src/main/java/org/example/timedTask/NewsTask.java
@@ -25,7 +25,7 @@
    /*
    * 新聞資訊抓取
    * */
    @Scheduled(cron = "0 0/10 * * * ?")
//    @Scheduled(cron = "0 0/10 * * * ?")
    public void NewsInfoTask() {
        if (NewsInfoTaskLock.tryLock()) {
            log.info("新聞資訊抓取--------->开始");
websocketSerivce/src/main/java/org/example/timedTask/StockTask.java
@@ -49,7 +49,7 @@
    private final Lock lock = new ReentrantLock();
    @Scheduled(cron = "0/5 * * * * ?")
//    @Scheduled(cron = "0/5 * * * * ?")
    public void syncINStockData() {
        if (lock.tryLock()) {
            log.info("同步印度股票--------->开始");
websocketSerivce/src/main/java/org/example/websocket/server/WsServer.java
@@ -68,10 +68,10 @@
    }
    public void sendMessageToAll(String message) {
        Map<String, Object> map = jsonToMap(message);
        if (map.get("pid").equals("00000001")) {
            System.out.println(message);
        }
//        Map<String, Object> map = jsonToMap(message);
//        if (map.get("pid").equals("00000001")) {
//            System.out.println(message);
//        }
        try {
            List<Future<?>> futures = new ArrayList<>();
            wsServers.forEach(ws -> {
@@ -109,11 +109,11 @@
        }
    }
    public static Map<String, Object> jsonToMap(String json) {
        Gson gson = new Gson();
        Type type = new TypeToken<Map<String, Object>>() {
        }.getType();
        return gson.fromJson(json, type);
    }
//
//    public static Map<String, Object> jsonToMap(String json) {
//        Gson gson = new Gson();
//        Type type = new TypeToken<Map<String, Object>>() {
//        }.getType();
//        return gson.fromJson(json, type);
//    }
}