Websocket快速学习使用及前后端示例代码 + websocket怎样获取request请求参数

Websocket

简单来说websocket实现了双向通信,即服务端可以主动发送消息给客户端,客户端也可以主动发送消息给服务端

·

Websocket与HTTP的区别

● websocket中可以双向通信服务器端可以主动给客户端发送消息,http只能客户端主动给服务端发送消息
● http客户端与服务端的通信必须建立在request和response,且一条response对应一条request
● websocket在连接时运用到了http中的tcp协议进行三次握手连接
● websocket是可持续状态的连接,而http是无状态连接

·

Websocket与HTTP各自的优势

● 在客户端与服务端进行一段持续的会话时用websocket更好。如开启会话,监控,历史回放等
● 在客户端与服务端只需进行短暂的交互时用HTTP消耗的资源更少也更方便。如用户登录,查看数据页面等

·

Websocket测试网址

http://websocket.org/echo.html

·

Websocket生命周期及代码实例

后端

    @onOpen
    public void onOpen(Session session, EndpointConfig config){
    /* 当websocket连接成功后 */
    }

    @onClose
    public void onClose(Session session, CloseReason closeReason) {
        /* 当websocket发送消息发生错误时 */
    }

    @onError
    public void onError(Session session, Throwable throwable) {
        /* 当websocket连接关闭后 */
    }
    
	@onMessage
    public void onMessage(String message) {
        /* 接收客户端发来的消息 */
    }
}

·

Websocket连接实例

后端在controller层编写websocket连接的类可继承Endpoint

@ServerEndpoint(
        value = "/url",
        configurator = xxxConfigurator.class // 配置类,通过配置类可以拿到初始连接时的request参数
)
@Component
public class xxx extends Endpoint{
	private RemoteEndpoint.Basic remote; // websocket发送消息
	private ObjectMapper objectMapper;  // 可将json类型转换成字符串


	@Override
    public void onOpen(Session session, EndpointConfig config) {
        System.out.println("连接成功");
        
		// 通过config中可以得到初始连接时request参数
        System.out.println(config.getUserProperties().get("id"));

		remote = session.getBasicRemote();
		// 向前端发送数据
		remote.sendText(String类型数据)
		remote.sendText(objectMapper.writeValueAsString(json类型的数据))

    }

	@OnMessage
    public void onMessage(String message){
        /* 从前端接收message消息 */
    }
}

配置Configurator类(可通过配置此类获取request请求参数)

public class xxxConfigurator extends ServerEndpointConfig.Configurator {
    @Override
    public void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request, HandshakeResponse response) {
    	// 可获取request中的请求参数的集合
        Map<String, List<String>> queryParam = request.getParameterMap();
        
        // 通过getUserProperties()使得websocket连接类中可获取到配置类中得到的数据
        Map<String, Object> userProperties = sec.getUserProperties();
        
        // 以获取get请求中的id参数为例
        userProperties.put("id", queryParam.get("id").get(0));
        super.modifyHandshake(sec, request, response);
    }
}

·

前端建立websocket连接

	// 创建空数组接收数据
	self.events = []
	// 连接websocket
	const socket = new WebSocket(`ws://localhost:8082/xxx?id=${this.$route.query.id}`)
	// 从后端接收消息
    socket.onmessage = event => {
    	// 将后端收到的json类型强转后的的字符串强转成json类型,加入到events数组中
      self.events.push(JSON.parse(event.data));
    }
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
WebSocket是一种在Web浏览器和服务器之间进行全双工通信的协议。以下是一个简单的WebSocket前后代码示例: 前代码: ```javascript var ws = new WebSocket("ws://localhost:8080/msg"); ws.onopen = function(evt) { console.log("Connection open ..."); ws.send("Hello WebSockets!"); }; ws.onmessage = function(evt) { console.log("Received Message: " + evt.data); ws.close(); }; ws.onclose = function(evt) { console.log("Connection closed."); }; ``` 这段代码首先创建了一个WebSocket对象,并通过指定URL("ws://localhost:8080/msg")来建立与服务器的连接。然后,通过监听onopen事件,在连接成功建立后发送一条消息 "Hello WebSockets!"。接下来,通过监听onmessage事件,当接收到服务器发送的消息时,在控制台上打印出接收到的消息,并关闭连接。最后,通过监听onclose事件,在连接关闭后,在控制台上打印出连接已关闭的消息。 后代码: 对于后代码的实现,可以根据不同的编程语言和框架进行实现。在这里,我以Node.js为例,使用WebSocket库ws。 ```javascript const WebSocket = require('ws'); const wss = new WebSocket.Server({ port: 8080 }); wss.on('connection', function connection(ws) { console.log('Connection established.'); ws.on('message', function incoming(message) { console.log('Received message: ', message); ws.send('Server received your message: ' + message); }); ws.on('close', function close() { console.log('Connection closed.'); }); }); ``` 这段代码创建了一个WebSocket服务器,并在8080口上监听客户的连接。当有新的连接建立时,会触发connection事件,在该事件的回调函数中,可以处理与客户的通信逻辑。在这个例子中,当收到客户发送的消息时,会在控制台上打印出接收到的消息,并将消息发送回客户。当连接关闭时,会触发close事件,在该事件的回调函数中,打印出连接已关闭的消息。 请注意,这只是一个简单的示例,实际的WebSocket应用可能需要更复杂的逻辑和安全措施来处理连接和消息。具体的实现方式还需要根据你使用的编程语言和框架来确定。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

此时一位小白路过

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值