`
lippeng
  • 浏览: 455045 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Spring Web Socket 客户端 服务端实现 握手时传递参数

    博客分类:
  • Life
 
阅读更多

基于Spring boot的非常简单的WebSocket客户端与服务端通信,真心不想写Socket,用Netty写着太累,真心没多少时候需要那么好的性能。

 

在握手时,试着传个参数,发现没问题,整体用起来,Spring的东西很靠谱。

 

服务端:

 

import com.google.common.base.Strings;

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
4
分享到:
评论

相关推荐

    lsd客户端和服务端的通信

    对于服务端,可能会用到Web框架,如Java的Spring Boot,Python的Flask或Django,以及Node.js的Express等。 在提供的压缩包文件“LSDProgram”中,可能包含了客户端和服务端的源代码示例,供学习者参考和实践。通过...

    springcloud下通过gateway转发websocket

    3. 实现WebSocket端点:在WebSocket服务端,我们需要创建一个实现了`ServerEndpoint`注解的类,以处理WebSocket连接和消息。例如: ```java @ServerEndpoint("/websocket") // 注意这个路径要与Gateway配置的Path...

    SpringBoot如何使用WebSocket详解含示例代码(值得珍藏)

    例如,在线聊天、实时股票价格更新、多人在线游戏等场景都需要服务端能够及时地将最新数据推送到客户端。传统HTTP协议基于请求-响应模型,无法满足实时推送的需求。而WebSocket协议的出现则很好地解决了这一问题。 ...

    websocket构建实时web应用

    - **服务端API**:对于服务端,不同的语言和框架提供了各自的Websocket支持库,例如Java有Spring Websocket,Node.js有Socket.IO等。 #### 八、总结 Websocket作为一种高效的双向通信协议,已经成为构建实时Web应用...

    udp_client&server_source_UDPjavasocket_

    在IT行业中,网络通信是至关重要的部分,尤其是在开发分布式系统时。UDP(User Datagram Protocol,用户数据报协议)和Java Socket编程是其中的关键概念。本文将深入探讨标题为"udp_client&server_source_...

    java服务端面试题整理

    - **Socket编程**:如何创建和使用Socket进行客户端和服务端通信。 - **HTTP协议**:HTTP的状态码、请求方法,以及HTTP/1.1与HTTP/2的区别。 4. **Spring框架** - **依赖注入**:理解IoC容器的工作原理,以及@...

    WebSocket在线聊天

    在本项目中,我们使用Java来实现WebSocket服务端,配合前端JavaScript库实现客户端的聊天功能。 WebSocket API主要由HTML5规范定义,提供了一种在单个TCP连接上进行全双工通信的方法。相比于传统的HTTP协议,...

    SpringBoot系列之搭建WebSocket应用

    ### Spring Boot 系列之搭建 WebSocket 应用 #### 一、引言 在现代互联网应用中,实现实时的数据推送变得越来越重要。这不仅提高了用户体验,也为许多业务场景提供了更多的可能性。WebSocket 和 MQTT 是两种常见的...

    200篇美团Java面经合集

    - Socket编程,客户端和服务端的交互实现。 8. **数据结构与算法** - 排序算法(冒泡、选择、插入、快速、归并等)的时间复杂度分析。 - 查找算法,二分查找的实现与应用。 - 常见的图论问题,如最小生成树、...

    Java网络编程

    - **TCP连接建立**:三次握手过程,确保客户端和服务端都能正常通信。 - **TCP数据传输**:通过输入输出流进行数据交换,保证数据的可靠传输。 - **TCP连接关闭**:四次挥手,确保数据传输完成后双方安全断开连接...

    2023最新BAT java经典必考面试题.zip

    - Socket编程:客户端和服务端的实现,以及Socket的常用方法。 8. **设计模式**: - 常见的设计模式:单例模式、工厂模式、装饰器模式、观察者模式、适配器模式等。 - 设计模式的应用场景和优缺点分析。 9. **...

    java面试题

    - Socket编程:基于TCP或UDP的客户端和服务端实现。 8. **虚拟机与内存管理**: - 堆内存与栈内存的分配,垃圾收集机制(GC)。 - 类加载机制:双亲委派模型,类加载器。 - 内存调优:了解JVM参数,如-Xms、-...

    Java面试宝典2018年5月最新版

    3. Socket编程:会使用Java的Socket进行客户端和服务端的简单通信。 六、数据库篇 1. SQL语言:熟练编写SELECT、INSERT、UPDATE、DELETE语句,了解子查询、联接、索引等高级特性。 2. 数据库设计:理解关系型数据库...

    面试题 java方向 新版

    - Socket编程:创建客户端和服务端的交互。 以上是Java面试中常见的主题,对于准备面试的小白来说,这些都是需要扎实掌握的基础知识。在实际面试中,根据经验,面试官可能会深入探讨某个特定领域的细节,因此全面...

    新版本录制websocket教程整合SpringBoot socketjs视频教程

    课程讲解有单播广播的介绍和使用场景,服务端定时推送,spring针对websocket的握手拦截器、频道拦截器开发和应用;采用nginx负载均衡器,后端多节点集群部署的问题和解决方案;购买后加进技术问答群Q群699347262备注...

    java后端面试题(按天复习).zip

    - **Socket编程**:基于TCP的简单客户端和服务端实现。 8. **设计原则** - **单一职责原则**:每个类只做一件事情。 - **开闭原则**:对扩展开放,对修改关闭。 - **里氏替换原则**:子类可以替换父类并保持...

    java面试过程中最易考的题目,集成了最近几年各大软件公司的面试题目

    3. Socket编程:创建客户端和服务端,进行数据通信。 这些知识点构成了Java面试的核心部分,通过深入理解和实践,可以显著提高面试成功的几率。在学习过程中,不仅需要记住理论知识,还要结合实际项目经验,灵活...

    Java面试资料整理 高清 目录 书签

    - Socket编程:创建客户端和服务端的Socket通信。 以上只是部分内容的概述,实际的面试资料整理中会包含更详细的解释、示例代码和经典面试题,以帮助面试者巩固理论知识,提高实战能力。对于职场发展而言,持续...

    北京金航网技术有限公司Java笔试面试题

    - 使用Socket进行简单的客户端和服务端通信。 6. **JVM优化**: - 理解JVM内存模型,包括堆、栈、方法区、本地方法栈和程序计数器。 - 垃圾回收机制,包括新生代、老年代、CMS、G1等垃圾收集器。 - 调整JVM参数...

    java面试宝典

    知道Socket编程,如何实现客户端和服务端的通信。 8. **设计原则与原则**:了解SOLID原则(单一职责、开闭、里氏替换、接口隔离、依赖倒置),以及面向对象设计的六大原则,这些原则可以帮助你写出更可维护、可扩展...

Global site tag (gtag.js) - Google Analytics