Spring Boot 与 nodejs websocket 通信

需求

开发中突然遇到一个需求,后端分别为Spring Boot rest服务,nodejs websocket 服务。
SpringBoot 服务需要往websocket服务发送消息,所以java服务作为socket 客户端,nodejs为socket服务端。

解决办法

网上好多案例都是以java作为服务端,后来发现socket.io已经提供了java实现,只需要引入jar包,使用方式与js客户端基本类似。将实现贴出来,以供参考。

服务状态

socket服务端:nodejs socket.io http
socket服务端:Spring Boot socket.io-client

code

java 引入socket.io-client:
compile group: 'io.socket', name: 'socket.io-client', version: '1.0.0'
创建SocketClientService

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.lifeccp.consultationService.pojo.ChatMessage;
import io.socket.client.IO;
import io.socket.client.Socket;
import io.socket.emitter.Emitter;
import org.springframework.stereotype.Component;

import java.net.URISyntaxException;
import java.util.ArrayList;

@Component
public class SocketClientService {
    private Socket socket ;

    public SocketClientService() throws URISyntaxException {
        this.socket = IO.socket("http://localhost:3010/test");
        this.onConnect();
        this.onDisconnect();
        this.onMessage();
        socket.connect();
    }

    public void sendMessage(ChatMessage msg){
        socket.emit("chat", JSONObject.toJSON(msg)) ;
    }

    private void onConnect(){
        this.socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() {
            @Override
            public void call(Object... args) {
                socket.emit("chat", "hi");
            }
        }) ;
    }

    private void onMessage(){
        this.socket.on("chat", new Emitter.Listener() {
            @Override
            public void call(Object... args) {
                JSONObject obj = (JSONObject)args[0];
                System.out.println(obj);
            }
        }) ;
    }

    private void onDisconnect(){
        this.socket.on(Socket.EVENT_DISCONNECT, new Emitter.Listener() {

            @Override
            public void call(Object... args) {}
        }) ;
    }

    public static void main(String[] args) throws URISyntaxException {
        ChatMessage chatMessage = new ChatMessage() ;
        chatMessage.setOriginUserId(-1);
        chatMessage.setType("sys_message");
        chatMessage.setOriginUserName("系统通知");
        chatMessage.setUserIds(new ArrayList(){{add(2283);}});
        chatMessage.setSendTime(System.currentTimeMillis());
        chatMessage.setData("请加入会诊会议");
        SocketClientService scs = new SocketClientService() ;
        scs.sendMessage(chatMessage);
    }
}

其他需要发消息的地方只需要注入SocketClientService 即可。
其他需要接受消息的地方暂时没需求,所以没有实现。

 @Autowired
 private SocketClientService socketClientService ;

你可能感兴趣的:(Spring Boot 与 nodejs websocket 通信)