首页 > 其他分享 >【计算机网络】WebSocket协议

【计算机网络】WebSocket协议

时间:2024-08-25 20:55:23浏览次数:15  
标签:协议 WebSocket 计算机网络 session import 连接 客户端

目录

一、WebSocket协议概述

二、WebSocket协议基本特点

三、WebSocket协议代码实现

3.1 WebSocket协议python实现

3.2 WebSocket协议JAVA实现

3.3 WebSocket协议C++实现

四、WebSocket协议发展趋势


一、WebSocket协议概述

        WebSocket协议是一种在单个TCP连接上进行全双工通信的协议。它为网络应用提供了一种在客户端和服务器之间建立持久连接的方式,使得双方可以进行实时数据交换。WebSocket协议由RFC 6455定义,它允许服务器主动向客户端推送信息,而不需要客户端的请求。

        WebSocket连接的建立是通过一个握手过程完成的,这个过程通常发生在HTTP升级请求中。一旦握手成功,连接就从HTTP协议升级到WebSocket协议,之后的数据传输就不再遵循HTTP协议的规则。

二、WebSocket协议基本特点

        WebSocket协议的主要特点包括:

        1. 实时性:由于是持久连接,数据可以即时双向传输,非常适合需要实时通信的应用,如在线游戏、实时聊天、股票交易等。

        2. 节省资源:与HTTP轮询或长轮询相比,WebSocket减少了不必要的请求和响应,从而降低了服务器和网络的负载。

        3. 全双工通信:服务器和客户端可以同时发送和接收数据,这使得通信更加高效。

        4. 跨域支持:WebSocket协议支持跨域通信,允许不同源的客户端和服务器之间建立连接。

        5. 简化开发:开发者可以使用相同的API进行服务器和客户端之间的通信,简化了开发过程。

        WebSocket协议的使用场景非常广泛,它为现代网络应用提供了一种高效、实时的通信方式。

三、WebSocket协议代码实现

3.1 WebSocket协议python实现

        以下是一个使用Python实现的简单WebSocket服务器端的例子,使用了websockets库。首先,确保安装了websockets库,然后,下面是一个简单的WebSocket服务器端代码示例:

import asyncio
import websockets
 
async def echo(websocket, path):
    async for message in websocket:
        await websocket.send(message)
 
start_server = websockets.serve(echo, "localhost", 8765)
 
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

        这个服务器会接受连接,然后将接收到的任何消息原样发送回客户端。客户端代码(使用JavaScript,假设你在浏览器中运行):

var ws = new WebSocket("ws://localhost:8765");
 
ws.onopen = function(event) {
    console.log("WebSocket connected.");
    ws.send("Hello, Server!");
};
 
ws.onmessage = function(event) {
    console.log("Received message: " + event.data);
};
 
ws.onclose = function(event) {
    console.log("WebSocket closed.");
};

        这个客户端代码连接到上面的服务器,发送一条消息,并在接收到消息时在控制台打印出来。

3.2 WebSocket协议JAVA实现

        在Java中实现WebSocket通常可以使用Java EE的@ServerEndpoint注解或者使用第三方库如Netty。以下是使用@ServerEndpoint注解的一个简单示例,首先,确保你的Java EE环境(如Tomcat 7+或者Jetty 9+)支持WebSocket。然后,创建一个带有@ServerEndpoint注解的类:

import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
 
@ServerEndpoint("/websocket")
public class WebSocketTest {
    private static final Set<Session> sessions = Collections.synchronizedSet(new HashSet<>());
 
    @OnOpen
    public void onOpen(Session session) {
        sessions.add(session);
        System.out.println("Connected ... " + session.getId());
    }
 
    @OnClose
    public void onClose(Session session) {
        sessions.remove(session);
        System.out.println("Disconnected ... " + session.getId());
    }
 
    @OnMessage
    public void onMessage(String message, Session session) {
        System.out.println("Received message ... " + message);
        for (Session peer : sessions) {
            if (!peer.equals(session)) {
                try {
                    peer.getBasicRemote().sendText(message);
                } catch (IOException e) {
                    System.out.println("Error sending message to peer: " + peer.getId());
                }
            }
        }
    }
 
    @OnError
    public void one rror(Session session, Throwable throwable) {
        System.out.println("Error for session: " + session.getId() + " - " + throwable.getMessage());
    }
}

        这个简单的例子展示了如何创建一个WebSocket服务器端点,它处理连接打开、关闭、接收消息和错误事件。当一个新的客户端连接时,它会被添加到一个Set中,以便可以向所有连接的客户端广播消息。确保你的服务器(如Tomcat)已经启动,并且你的应用已经部署。然后,你可以使用支持WebSocket的客户端连接到ws://<your_server_address>/<your_app_context>/websocket

3.3 WebSocket协议C++实现

        以下是一个简化的C++ WebSocket服务器端的核心函数示例,用于处理连接和消息接收。请注意,这里没有异常处理,错误处理,或者完整的线程管理,仅作为教学使用。

#include <iostream>
#include <string>
#include <websocketpp/config/asio_no_tls.hpp>
#include <websocketpp/server.hpp>
 
typedef websocketpp::server<websocketpp::config::asio_no_tls> server;
 
// 当收到WebSocket连接请求时调用
void on_open(websocketpp::connection_hdl hdl) {
    std::cout << "WebSocket connection opened" << std::endl;
}
 
// 当收到WebSocket消息时调用
void on_message(websocketpp::connection_hdl hdl, server::message_ptr msg) {
    std::cout << "WebSocket message received: " << msg->get_payload() << std::endl;
}
 
// 当WebSocket连接关闭时调用
void on_close(websocketpp::connection_hdl hdl) {
    std::cout << "WebSocket connection closed" << std::endl;
}
 
int main() {
    // 创建WebSocket服务器对象
    server server_obj;
 
    // 初始化服务器端点
    server::endpoint_type& ep = server_obj.endpoint();
 
    // 设置WebSocket连接/消息/关闭事件的回调函数
    ep.set_open_handler(&on_open);
    ep.set_message_handler(&on_message);
    ep.set_close_handler(&on_close);
 
    // 启动服务器监听端口
    ep.listen(9002);
    ep.start_accept();
 
    std::cout << "Server start listening on port 9002" << std::endl;
 
    // 运行I/O服务循环
    server_obj.run();
 
    return 0;
}

        这段代码展示了如何使用websocketpp库来创建一个简单的WebSocket服务器。它定义了打开、关闭和接收消息时的回调函数,并在9002端口上监听WebSocket连接。当有事件发生时,相应的回调函数会被调用,并打印出相关信息。这个例子需要完整的websocketpp库来编译和运行。

四、WebSocket协议发展趋势

        随着互联网技术的快速发展,WebSocket协议作为实现客户端与服务器之间实时双向通信的有效手段,其发展趋势主要体现在以下几个方面:

        1. 更广泛的集成与应用:随着物联网、实时协作工具、在线教育等领域的兴起,WebSocket协议因其低延迟和高效率的通信能力,被越来越多的应用集成,成为这些领域不可或缺的技术组件。

        2. 标准化和兼容性增强:随着WebSocket协议的普及,标准化组织将继续推动协议的完善和优化,确保不同平台和浏览器之间的良好兼容性,减少开发者在跨平台开发时遇到的兼容性问题。

        3. 安全性提升:随着网络安全威胁的增加,WebSocket协议的安全性将成为重点发展领域。通过加强加密措施、改进认证机制等手段,提升WebSocket通信的安全性,保护用户数据和隐私。

        4. 优化和扩展功能:为了适应不断变化的网络环境和应用需求,WebSocket协议可能会引入新的功能和优化现有机制。例如,改进数据压缩算法以减少传输数据量,或者增加对流控制和拥塞控制的支持,以提高网络环境适应性。

        5. 与新兴技术的融合:WebSocket协议可能会与新兴技术如WebRTC、HTTP/2等进行融合,以提供更加丰富和高效的通信解决方案。这种融合将有助于WebSocket协议在新的应用场景中发挥更大的作用。

        6. 云服务和边缘计算的结合:随着云计算和边缘计算技术的发展,WebSocket协议可能会被集成到云服务和边缘计算平台中,以支持大规模、分布式的实时数据处理和通信需求。

        综上所述,WebSocket协议的发展趋势将围绕着应用集成、标准化、安全性、功能优化、新兴技术融合以及云服务和边缘计算的结合等方面展开,以满足未来网络应用对实时通信的需求。

标签:协议,WebSocket,计算机网络,session,import,连接,客户端
From: https://blog.csdn.net/xiaoyingxixi1989/article/details/141435007

相关文章

  • Zookeeper分布式一致性协议ZAB介绍
    目录ZAB协议介绍消息广播崩溃恢复数据同步ZAB写数据源码流程图整个Zookeeper就是一个多节点分布式一致性算法的实现,底层采用的实现协议是ZAB。ZAB协议介绍ZAB协议全称:ZookeeperAtomicBroadcast(Zookeeper原子广播协议)。Zookeeper是一个为分布式应用提供高效且......
  • 计算机网络--面试总结三(Http与Https)
    目前已更新系列:当前:计算机网络--面试总结三(Http与Https)计算机网络--面试知识总结一计算机网络-----面试知识总结二知识积累之ThreadLocal---InheritableThreadLocal总结HTTP与HTTPS区别1、HTTP是明文传输的所以存在安全风险,而HTTPS解决了这个问题,他在HTTP与TCP传输层之间......
  • 【JavaEE初阶】IP协议
    目录......
  • 计算机网络——TCP三次握手和四次挥手
    一、前言TCP的三次握手和四次挥手是面试被高频问到的一个知识点。其中有较多的细节问题,本篇文章全部会详细讲解!TCP使用三次握手和四次挥手来建立和终止连接。为什么建立和终止连接还需要这么麻烦呢?TCP设置三次握手和四次挥手是为了确保可靠的连接建立和终止,在网络通信中保护......
  • 【WiFi】精讲WiFi 6E协议!图解超赞超详细!!!
    目录1.Wi-Fi6E概念介绍2.Wi-Fi6E关键技术3.Wi-Fi6EvsWi-Fi6对比4.Wi-Fi4VsWi-Fi5VsWi-Fi6VsWi-Fi6E特性对比图1.Wi-Fi6E概念介绍    802.11ax(HE,HighEfficiency)(Wi-Fi6E):6G频段共有1200MHz的频谱给到WiFi6E使用,可用于从5.925GHz到7.125GH......
  • 【网络协议】精讲路由表概念!图解超赞超详细!!!
    亲爱的用户,搜索微信公众号:“风云说通信”,帮忙点点免费的广告,即可免费阅读该文章哦~~关注公众号,博主会定期给您推送更多免费干货喔~~目录前言1.路由表定义  2.路由控制分类3.路由协议的分类4.IP地址与路由控制5.IP数据报的发送和转发6.路由表和转发表区别6.1路由表......
  • 计算机网络面试真题总结(二)
    文章收录在网站:http://hardyfish.top/文章收录在网站:http://hardyfish.top/文章收录在网站:http://hardyfish.top/文章收录在网站:http://hardyfish.top/在浏览器中输入URL地址到显示主页的过程?URL解析:浏览器首先会解析你输入的URL,确定你要访问的是哪个网站这......
  • QT中通过Tcp协议的多线程的文件传输(服务器)
    首先新建一个项目命名为SendClientSever因为要进行网络通信,在pro文件的第一行代码中添加network 一、窗口设计拖一个Widget里面放入label,lineEdit,pushbutton,名称如图修改程序设计子线程recvfile类新建一个类用来执行子线程将新建的类的头文件、recvfie.h文件和.cp......
  • 应用程自定义协议与序列化反序列化
        本篇将主要介绍在应用层中自定义的协议,自定义协议的同时还需要将我们的数据继续序列化和反序列化,所以本篇的重点为序列化、反序列化的原因以及如何自定义协议,接着探讨了关于为什么tcp协议可以支持全双工协议。还根据用户自定义协议结合tcpsocket编写了一份三......
  • 计算机网络——TCP协议与UDP协议详解(下)
    一、TCP协议1.1TCP协议的报文TCP全称为"传输控制协议(TransmissionControlProtocol")。人如其名,要对数据的传输进行一个详细的控制。我们先看其报文格式,如下图:TCP报文由以下几个字段组成:源端口号和目标端口号:每个TCP连接都有一个源端口号和一个目标端口号。源端口号......