需求
开发中突然遇到一个需求,后端分别为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<Integer>(){{add(2283);}});
chatMessage.setSendTime(System.currentTimeMillis());
chatMessage.setData("请加入会诊会议");
SocketClientService scs = new SocketClientService() ;
scs.sendMessage(chatMessage);
}
}
其他需要发消息的地方只需要注入SocketClientService 即可。
其他需要接受消息的地方暂时没需求,所以没有实现。
@Autowired
private SocketClientService socketClientService ;
网友评论