webSocket WebSocket是一种网络传输协议,可在单个TCP连接上进行全双工通信,位于OSI模型的应用层。WebSocket协议在2011年由IETF标准化为RFC 6455,后由RFC 7936补充规范。Web IDL中的WebSocket API由W3C标准化。
WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输。
简单广播模式实现
使用java 实现客户端和服务端两部分
springboot websocket java
实现java的服务端
- 加入相关依赖
# 加入websocket 的依赖
org.springframework.boot
spring-boot-starter-websocket
- 配置文件实现WebSocketConfigure.java
- 实现 WebSocketMessageBrokerConfigurer 接口,注册一个 STOMP 节点,配置一个广播消息代理
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfigure implements WebSocketMessageBrokerConfigurer {
//这个方法的作用是添加一个服务端点,来接收客户端的连接。
@Override
public void registerStompEndpoints(StompEndpointRegistry stompEndpointRegistry) {
//表示添加了一个/demo,客户端就可以通过这个端点来进行连接。
stompEndpointRegistry.addEndpoint("/demo");
}//这个方法的作用是定义消息代理,通俗一点讲就是设置消息连接请求的各种规范信息
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
//表示客户端订阅地址的前缀信息,也就是客户端接收服务端消息的地址的前缀信息
registry.enableSimpleBroker("/topic");
//指服务端接收地址的前缀,意思就是说客户端给服务端发消息的地址的前缀
registry.setApplicationDestinationPrefixes("/app");
}//使用MessageMapping
//Spring对于WebSocket封装的特别简单,提供了一个@MessageMapping注解,功能类似@RequestMapping
//SimpMessagingTemplate
//SimpMessagingTemplate是Spring-WebSocket内置的一个消息发送工具,可以将消息发送到指定的客户端。
}
- 控制代码示例
- DemoRequest和DemoResponse 是通信的简单封装类,这里不具体实现了。
@Controller
@RequiredArgsConstructor
public class DemoController {private final SimpMessagingTemplate simpMessagingTemplate;
//用来实现WebSocket客户端发送公告功能
@RequestMapping("/hello")
public String hello() {
return "/hello/demo";
}//这个方法是接收客户端发送功公告的WebSocket请求
@MessageMapping("/demo")
public void demo(DemoRequest req) {
System.out.println("recv:"+req);
//使用这个方法进行消息的转发发送
simpMessagingTemplate.convertAndSend("/topic/demo", new DemoResponse("Im server"));
}//等同demo
//@SendTo定义了消息的目的地。结合例子解释就是“接收/app/demo01的value,将value转发到/topic/demo01客户端
///topic/demo01是客户端发起连接后,订阅服务端消息时指定的一个地址,用于接收服务端的返回,后面我们在写客户端代码的时候会看见。
@MessageMapping("/demo01")
@SendTo("/topic/demo01")
public DemoResponsedemo01 (DemoRequest request) {
return new DemoResponse("123");
}
}
【java|springboot-websocket 实现】到这里webSocket的服务端已经完成了。
实现java的客户端
- 加入相关依赖
org.springframework.boot
spring-boot-starter-websocket
org.java-websocket
Java-WebSocket
1.3.5
- 实现连接测试代码
public class TestClient {
public static void main(String ... args) {
WebSocketClient webSocketClient =new StandardWebSocketClient();
WebSocketStompClient stompClient = new WebSocketStompClient(webSocketClient);
stompClient.setMessageConverter(new MappingJackson2MessageConverter());
stompClient.setTaskScheduler(new ConcurrentTaskScheduler());
String url = "ws://127.0.0.1:8080/demo";
StompSessionHandler sessionHandler = new DemoSessionHandler();
stompClient.connect(url, sessionHandler);
new Scanner(System.in).nextLine();
//为了等待通信完成}
}
- 连接通信
public class DemoSessionHandler extends StompSessionHandlerAdapter {
@Override
public Type getPayloadType(StompHeaders headers) {
returnDemoResponse.class;
}@Override
public void handleFrame(StompHeaders headers, Object payload) {
System.out.println("get message from server:"+ ((DemoResponse)payload).getContent() );
}@Override
public void afterConnected(StompSession session, StompHeaders connectedHeaders) {
System.out.println("connected");
session.subscribe("/topic/demo01",this);
session.send("/app/demo01",new DemoRequest("demo"));
System.out.println("send to server :");
System.out.println(session.getSessionId());
//session.send("/app/demo01",new DemoRequest("123"));
//System.out.println("send to server :");
}@Override
public void handleException(StompSession session, StompCommand command, StompHeaders headers, byte[] payload,
Throwable exception) {
exception.printStackTrace();
}
}
问题回顾:
1、spring webSocket The HTTP response from the server [200] did not permit the HTTP upgrade to WebSocket
解决:相关stompEndpointRegistry.addEndpoint("/demo").withSockJS(); 去掉.withSockJS()
了解更多:
相关websocket https://en.wikipedia.org/wiki/WebSocket | https://zh.wikipedia.org/wiki/WebSocket
https://spring.io/guides/gs/messaging-stomp-websocket/
https://www.baeldung.com/websockets-api-java-spring-client
推荐阅读
- Java|Java基础——数组
- 人工智能|干货!人体姿态估计与运动预测
- java简介|Java是什么(Java能用来干什么?)
- Java|规范的打印日志
- Linux|109 个实用 shell 脚本
- 程序员|【高级Java架构师系统学习】毕业一年萌新的Java大厂面经,最新整理
- Spring注解驱动第十讲--@Autowired使用
- SqlServer|sql server的UPDLOCK、HOLDLOCK试验
- jvm|【JVM】JVM08(java内存模型解析[JMM])
- 技术|为参加2021年蓝桥杯Java软件开发大学B组细心整理常见基础知识、搜索和常用算法解析例题(持续更新...)