HTTP与WebSocket协议
-
HTTP协议是无状态的,每次请求都是独立的,服务器不会保存客户端的状态信息。而WebSocket协议是有状态的,一旦建立连接后,服务器和客户端可以进行双向通信,并且可以保持连接状态,服务器可以主动向客户端发送消息。
-
HTTP协议是基于请求-响应模式的,客户端发送请求,服务器返回响应。而WebSocket协议是全双工通信,双方都可以主动发送消息。
-
HTTP协议默认使用TCP协议进行通信,每次请求都需要建立和关闭TCP连接,而WebSocket协议在建立连接后,可以通过保持连接状态,避免了多次建立和关闭连接的开销,减少了网络传输的延迟。
-
HTTP协议使用标准的HTTP端口(默认80端口),而WebSocket协议使用的是非标准的WebSocket端口(默认为80或443)。
-
HTTP协议的通信是通过HTTP头部和请求体来传递数据,而WebSocket协议可以直接传输原始数据,减少了通信的开销。
总而言之,HTTP协议适用于客户端发送请求,服务器返回响应的场景,而WebSocket协议适用于需要实时双向通信的场景,如聊天应用、实时游戏等。
建立前后端WebSocket协议通信
- 集成WebSocket
在pom.xml文件中添加依赖:
spring-boot-starter-websocket
XML
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-websocket -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
<version>3.2.3</version>
</dependency>
前后端的通信
fastjson
XML
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.47</version>
</dependency>
添加config.WebSocketConfig配置类:
java
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
@Configuration
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}
添加consumer.WebSocketServer类
import org.springframework.stereotype.Component;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
@Component
@ServerEndpoint("/websocket/{token}") // 注意不要以'/'结尾
public class WebSocketServer {
@OnOpen
public void onOpen(Session session, @PathParam("token") String token) {
// 建立连接
}
@OnClose
public void onClose() {
// 关闭链接
}
@OnMessage
public void onMessage(String message, Session session) {
// 从Client接收消息
}
@OnError
public void onError(Session session, Throwable error) {
error.printStackTrace();
}
}
配置config.SecurityConfig
java
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/websocket/**");
}
如果在卸载的时候没有断掉链接的话,每一次打开都会建立一个额外的链接
验证jwt
实现对战前端界面
对手图片:https://cdn.acwing.com/media/article/image/2022/08/09/1_1db2488f17-anonymous.png
云端生成地图
在数据库中创建表record
record表用来记录每局对战的信息
表中的列:
id: int
a_id: int
a_sx: int
a_sy: int
b_id: int
b_sx: int
b_sy: int
a_steps: varchar(1000)
b_steps: varchar(1000)
map: varchar(1000)
loser: varchar(10)
createtime: datetime
实现微服务
thrift----socket
SpringCloud----http
matchingsystem收到请求后:
将所有用户放到匹配池中(数组),开一个额外的新线程,每隔1秒钟扫描一遍数组,将能够匹配的人匹配到一起,匹配两名分值接近的玩家,随着时间推移允许的分差可以越来越大