spring websocket做客户端 服务器

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-websocket</artifactId>
    <version>5.0.8.RELEASE</version>
</dependency>
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.http.server.ServletServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
import org.springframework.web.socket.handler.TextWebSocketHandler;
import org.springframework.web.socket.server.HandshakeInterceptor;

import java.util.Map;

@SpringBootApplication
public class MyWebSocketServer {
  public static void main(String[] args) {
    SpringApplication.run(MyWebSocketServer.class, args);
  }

  @Component
  @EnableWebSocket
  private static class Config implements WebSocketConfigurer {
    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
      registry.addHandler(new MyHandler(), "/ws").setAllowedOrigins("*")
          .addInterceptors(new MyHandshakeInterceptor());
    }
  }

  private static class MyHandler extends TextWebSocketHandler {
    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
      System.out.println(session.getAttributes().get("collector"));
      super.afterConnectionEstablished(session);
    }

    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message)
        throws Exception {
      System.out.println(message.getPayload());
      session.sendMessage(new TextMessage("reply.................." + message.getPayload()));
      super.handleTextMessage(session, message);
    }
  }

  private static class MyHandshakeInterceptor implements HandshakeInterceptor {
    @Override
    public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response,
                                   WebSocketHandler wsHandler, Map<String, Object> attributes)
        throws Exception {

      String collector = ((ServletServerHttpRequest) request).getServletRequest().getParameter("collector");
      if (Strings.isNullOrEmpty(collector)) {
        return false;
      } else {
        attributes.put("collector", collector);
        return true;
      }
    }

    @Override
    public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response,
                               WebSocketHandler wsHandler, Exception exception) {

    }
  }
}

 

客户端:

 

import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.client.WebSocketConnectionManager;
import org.springframework.web.socket.client.standard.StandardWebSocketClient;
import org.springframework.web.socket.handler.TextWebSocketHandler;

import java.io.IOException;

public class MyWebSocketClient {
  private static final String WS_URI = "ws://localhost:8080/ws?collector=123";

  public static void main(String[] args) throws IOException, InterruptedException {
    StandardWebSocketClient client = new StandardWebSocketClient();
    WebSocketConnectionManager manager = new WebSocketConnectionManager(client, new MyHandler(), WS_URI);

    manager.start();

    Thread.sleep(10000);
  }

  private static class MyHandler extends TextWebSocketHandler {
    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
      System.out.println("connected...........");
      session.sendMessage(new TextMessage("hello, web socket"));
      super.afterConnectionEstablished(session);
    }

    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message)
        throws Exception {
      System.out.println("receive: " + message.getPayload());
      super.handleTextMessage(session, message);
    }
  }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用Spring开发WebSocket应用时,可以通过几种方式来保证WebSocket客户端不断开: 1. 心跳机制:WebSocket客户端服务器之间可以通过发送心跳消息来保持长连接。服务器定时发送心跳消息给客户端客户端收到心跳消息后回复确认消息,从而避免连接断开。可以使用Spring提供的`@Scheduled`注解来定时发送心跳消息,或者使用WebSocket的Ping/Pong消息来实现心跳机制。 2. 断线重连:当WebSocket客户端断开连接时,可以在客户端实现断线重连的逻辑。在Spring中,可以通过实现WebSocket的`WebSocketHandler`接口,在`afterConnectionClosed()`方法中判断连接是否正常关闭,如不正常则进行重连操作,例如使用`WebSocketContainer`的`connectToServer()`方法重新连接。 3. 保持长连接:在应用的配置中设置适当的超时时间,确保WebSocket客户端的连接能够持续保持活跃状态。可以通过设置`server.timeout`属性或使用Spring的`@EnableWebSocket`注解中的`setHandshakeTimeout()`方法来设置超时时间。 4. 使用WebSocket断开监听器:可以通过实现WebSocket的`WebSocketHandler`接口的`afterConnectionClosed()`方法来监听WebSocket连接的关闭事件,一旦连接断开,可以在监听器中进行相应的处理操作,例如记录日志、重新建立连接等。 综上所述,通过应用心跳机制、断线重连、设置连接超时时间和使用WebSocket断开监听器等方式可以保证Spring WebSocket客户端不断开。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值