【问题标题】:Is there a way to create a websocket client inside a java app to communicate with a node.js websocket server?有没有办法在 java 应用程序中创建 websocket 客户端以与 node.js websocket 服务器通信?
【发布时间】:2021-03-28 08:44:32
【问题描述】:

目前,我正在开发一个在 tomcat 服务器上运行的 java spring 应用程序,我想在那里创建一个 WebSocket 客户端来与本地运行的 node.js websocket 服务器通信。我找不到客户的任何实现。客户端必须在视图(.jsp 文件)中还是在控制器中? websocket 客户端必须在 web 应用程序中。

这里是node.js服务器的实现:

const WebSocket = require('ws');
const express = require('express')
const app = express()
const server = require('http').createServer(app);

const wss = new WebSocket.Server({ server:server });

wss.on('connection', function connection(ws) {
    console.log('A new client Connected!');

    ws.binaryType = 'arraybuffer';
    ws.on('message', function incoming(message) {
    
        const array = new Int16Array(message);
        
        //console.log(array);
        console.log(new Date().toLocaleString().replace(',',' ')+" " + ' Data received');
        ws.send('The server received the message!'); 
    });
});
server.listen(3000, () => console.log(`Lisening on port :3000`))

【问题讨论】:

    标签: java node.js spring jsp websocket


    【解决方案1】:

    如果你使用js,你应该使用WebSocket js obj来实现它。网上还有更多样片。我猜你想用java构建一个websocket客户端。所以你可以参考this 来构建客户端。下面是简单的演示。

    maven 依赖

            <dependency>
                <groupId>org.java-websocket</groupId>
                <artifactId>Java-WebSocket</artifactId>
                <version>1.5.1</version>
            </dependency>
    

    websocket 客户端

    public class MyWebSocketClient extends WebSocketClient {
        private static final Logger LOGGER = LoggerFactory.getLogger(MyWebSocketClient.class);
    
        public MyWebSocketClient(URI serverUri) {
            super(serverUri);
        }
    
        @Override
        public void onOpen(ServerHandshake arg0) {
            // TODO Auto-generated method stub
            LOGGER.info("------ MyWebSocket onOpen ------");
        }
    
        @Override
        public void onClose(int arg0, String arg1, boolean arg2) {
            // TODO Auto-generated method stub
            LOGGER.info("------ MyWebSocket onClose ------{}",arg1);
        }
    
        @Override
        public void onError(Exception arg0) {
            // TODO Auto-generated method stub
            LOGGER.info("------ MyWebSocket onError ------{}",arg0);
        }
    
        @Override
        public void onMessage(String arg0) {
            // TODO Auto-generated method stub
            LOGGER.info("-------- receive data from websocket server: " + arg0 + "--------");
        }
    }
    

    定义一个要使用的bean

    
    @SpringBootApplication
    public class WebSocketApplication {
        public static void main(String[] args){
            SpringApplication.run(WebSocketApplication.class, args);
        }
    
            @Bean
        public WebSocketClient webSocketClient() {
            try {
                MyWebSocketClient webSocketClient = new MyWebSocketClient(new URI("ws://127.0.0.1:3000/connection"));
                webSocketClient.connect();
                return webSocketClient;
            } catch (URISyntaxException e) {
                e.printStackTrace();
            }
            return null;
        }
       
    }
    
    
    

    在一个restController中调用

    @RestController
    public class WebSocketController {
    
        @Autowired
        private WebSocketClient webSocketClient;
    
        @RequestMapping("subscribe")
        public String subscribe() {
            webSocketClient.send("hello sever,i want subscribe data A");
            return "send ok";
        }
    }
    

    【讨论】:

    • 因为我对所有这些都是新手,我的应用程序在我启动 Tomcat 服务器时启动,而不是作为 java 应用程序(或使用 spring boot 应用程序)运行,所以我应该在哪里实现 @Bean你提到过?谢谢
    • 我将@Bean 放在了其余控制器中,并且连接正常。再次感谢您的帮助!
    • 您可以使用“@Configuration”定义一个新类,将“@Bean”放入其中。这是一个参考link。见 2.7。希望对你有帮助。
    • 如果我希望客户端从服务器接收二进制数据(例如数组(1024),整数数组)而不是字符串消息,我应该如何实现呢?您知道如何修改此代码以接收二进制数据吗?再次感谢!!
    • 您应该使用 com.fasterxml.jackson.databind.ObjectMapper 将数组转换为字符串,反之亦然。请参考here
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-30
    • 1970-01-01
    • 2016-05-21
    相关资源
    最近更新 更多