将Java WebSockets(JSR-356)与SpringBoot集成

时间:2017-07-16 18:33:01

标签: spring spring-boot websocket jsr356

我在使用SpringBoot部署websocket时遇到问题。我已经尝试了很多基于https://spring.io/blog/2013/05/23/spring-framework-4-0-m1-websocket-supportUsing Java API for WebSocket (JSR-356) with Spring Boot等的方法,但运气不错。

以下是我正在尝试的内容:

网络套接字:

@ServerEndpoint(value="/socket/{name}", configurator = SpringConfigurator.class)
public class TestSocket {

    public ApiSocket(){}

    @OnOpen
    public void onOpen(
                Session session,
                @PathParam("name") String name) throws IOException {

        session.getBasicRemote().sendText("Hi " + name);
    }
}

applications.properties:

server.contextPath=/api

主要课程:

@SpringBootApplication
public class Main {

    public static void main(String[] args) throws Exception {
        SpringApplication.run(Main.class, args);
    }
}

根据上面的博客文章,这应该是所有必需的。我还尝试了第二种方法,它涉及一个没有运气的豆子:

  @Bean
  public ServerEndpointExporter endpointExporter() {
      return new ServerEndpointExporter();
  }

我正在尝试打开与ws:// localhost:8080 / api / socket / John的连接,并期望收到带有路径名的回复:

var socket = new WebSocket('ws://localhost:8080/api/socket/John');

握手期间的结果是404。

1 个答案:

答案 0 :(得分:1)

您还必须在Spring Configuration中的Bean中添加TestSocket,并从TestSocket中删除configurator = SpringConfigurator.class

通常,Spring通过STOMP协议(它是websocket的一部分)覆盖了普通的Java JSR 356 websocket。它还不像普通的websocket支持完全二进制消息。 您应该在“配置”中添加ServerEndpointExporter为:

@Configuration
public class EndpointConfig 
{
    @Bean
    public ChatEndpointNew chatEndpointNew(){
        return new ChatEndpointNew();
    }


    @Bean
    public ServerEndpointExporter endpointExporter(){
        return new ServerEndpointExporter();
    }

}

让我们看完整的chatMessage,其中客户ge连接到的房间为:

@ServerEndpoint(value="/chatMessage/{room}")
public class ChatEndpointNew 
{

    private final Logger log = Logger.getLogger(getClass().getName());

    @OnOpen
    public void open(final Session session, @PathParam("room")final String room)
    {
        log.info("session openend and bound to room: " + room);
        session.getUserProperties().put("room", room);
        System.out.println("session openend and bound to room: " + room);
    }

    @OnMessage
    public void onMessage(final Session session, final String message) {
        String room = (String)session.getUserProperties().get("room");
        try{
            for (Session s : session.getOpenSessions()){
                if(s.isOpen()
                          && room.equals(s.getUserProperties().get("room"))){
                    String username = (String) session.getUserProperties().get("username");
                    if(username == null){
                        s.getUserProperties().put("username", message);
                        s.getBasicRemote().sendText(buildJsonData("System", "You are now connected as:"+message));
                    }else{
                        s.getBasicRemote().sendText(buildJsonData(username, message));      
                    }
                }
            }
        }catch(IOException e) {
            log.log(Level.WARNING, "on Text Transfer failed", e);
        }
    }

    @OnClose
    public void onClose(final Session session){
        String room = (String)session.getUserProperties().get("room");
        session.getUserProperties().remove("room",room);
        log.info("session close and removed from room: " + room);
    }

    private String buildJsonData(String username, String message) {
        JsonObject jsonObject = Json.createObjectBuilder().add("message", "<tr><td class='user label label-info'style='font-size:20px;'>"+username+"</td>"+"<td class='message badge' style='font-size:15px;'> "+message+"</td></tr>").build();
        StringWriter stringWriter = new StringWriter();
        try(JsonWriter jsonWriter = Json.createWriter(stringWriter)){
            jsonWriter.write(jsonObject);
        }

        return stringWriter.toString();
    }
}

请注意,您应该与应用程序的主要Spring配置分开添加ChatEndpointNew和ServerEndpointExporter。 如果出现任何错误,请尝试以下操作:

<dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-websocket</artifactId>
   <version>4.0.0.RELEASE</version>
</dependency>

您还可以浏览this Spring文档。