精华内容
下载资源
问答
  • 通过HTTP请求WebSocket

    2020-09-23 15:28:29
  • 通过HTTP请求Websocket

    千次阅读 2018-12-30 18:31:45
    当浏览器A(Browser)向服务端发起HTTP请求时,服务端S接收HTTP请求通过websocket向客户端B返回消息。 流程图: 客户端B的代码:用html实现,用于发送websocket请求和接收。 <!DOCTYPE html> <...

    原理:客户端B(Client/Browser)通过websocket向服务端S发起连接,服务端保存这个websocket连接。当浏览器A(Browser)向服务端发起HTTP请求时,服务端S接收HTTP请求并通过websocket向客户端B返回消息。

    流程图:

     

    客户端B的代码:用html实现,用于发送websocket请求和接收。

    <!DOCTYPE html>
    <html>
    <head>
        <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
        <title>websocket client</title>
        <script type="text/javascript">
            //**************zzt****************
            var webSocket;
            //HTTP处理程序的地址
            var handlerUrl = "ws://localhost:8082/api/Values";
    
            function doConnection() {
                InitWebSocket();
            }
    
            function SendData() {
                var input = document.getElementById('sendText');
                //初始化WebSocket
                InitWebSocket();
                //如果WebSocket打开,发送数据
                if (webSocket.OPEN && webSocket.readyState == 1) {
                    if (input.value != "")
                        webSocket.send(input.value);
                }
    
                //如果WebSocket关闭,显示消息
                if (webSocket.readyState == 2 || webSocket.readyState == 3) {
                    alert("WebSocket关闭了,无法发送数据");
                }
            }
    
            function CloseWebSocket() {
                webSocket.close();
                webSocket = undefined;
            }
    
            function InitWebSocket() {
    
                //如果WebSocket对象未初始化,我们将初始化它
                if (webSocket == undefined) {
                    webSocket = new WebSocket(handlerUrl);
    
                    //打开连接处理程序
                    webSocket.onopen = function () {
                        alert("WebSocket已连接");
                    };
    
                    //消息数据处理程序
                    webSocket.onmessage = function (e) {
                        var label = '<li>' + e.data + '</li>';
                        $("#receiveText").append(label);
                    };
    
                    //关闭事件处理程序
                    webSocket.onclose = function () {
                        alert("WebSocket closed.");
                    };
    
                    //错误事件处理程序
                    webSocket.onerror = function (e) {
                        alert(e.message);
                    };
                }
                else {
                    //webSocket.open();没有open方法
                }
            }
    
            function doDeleteConnection(devid) {
                //初始化WebSocket
                InitWebSocket();
    
                //如果WebSocket打开,发送数据
                if (webSocket.OPEN && webSocket.readyState == 1) {
    
                    webSocket.send("DelConnection^" + devid);
                }
    
                //如果WebSocket关闭,显示消息
                if (webSocket.readyState == 2 || webSocket.readyState == 3) {
                    //document.getElementById("di_span").innerText = "WebSocket关闭了,无法发送数据";
                    alert("WebSocket关闭了,无法发送数据");
                }
            }
            //**************zztend*************
    
        </script>
    </head>
    <body>
        <form id="sendForm">
            <input id="sendText" placeholder="Text to send" />
            <button type="button" onclick="SendData();">发送</button>
            <button type="button" onclick="doConnection();">连接</button>
            <button type="button" onclick="CloseWebSocket();">关闭</button>
            <br />
            <ul id="receiveText"></ul>
        </form>
    </body>
    </html>

    客户端A的代码:同样用HTML实现,用于发送Http请求。

    <!DOCTYPE html>
    <html>
    <head>
        <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
        <title>http client</title>
        <script type="text/javascript">
            function SendData() {
                var sendtext = $("#sendText").val();
                $.ajax({
                    type: 'GET',
                    url: 'http://localhost:8082/api/Values?text=' + sendtext,
                    dataType: "jsonp",  //数据格式设置为jsonp
                    jsonp: "callback", //Jquery生成验证参数的名称
                    success: function (e) {
    
                    }
                });
            }
        </script>
    </head>
    <body>
        <form id="sendForm">
            <input id="sendText" placeholder="Text to send" />
            <button type="button" onclick="SendData();">发送</button>
        </form>
    </body>
    </html>

    服务端S的代码:用Web API实现,用于接收HTTP和Websocket,还有返回Websocket消息。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Net.Http;
    using System.Net.WebSockets;
    using System.Threading;
    using System.Threading.Tasks;
    using System.Web;
    using System.Web.Http;
    using System.Web.WebSockets;
    
    namespace WebSocketServer.Controllers
    {
        public class ValuesController : ApiController
        {
            private static Dictionary<string, object> ws = new Dictionary<string, object>();
            // GET api/values
            public HttpResponseMessage Get()
            {
                //检查 查询是否是WebSocket请求
                if (HttpContext.Current.IsWebSocketRequest)
                {
                    //如果是,我们附加异步处理程序
                    HttpContext.Current.AcceptWebSocketRequest(ProcessWSMsg);
                }
                else
                {
                    //否则,认为是HTTP请求
                    if (ws.Count > 0)
                    {
                        var WebSocket = ws["1"];
                        var Content = HttpContext.Current.Request["text"];
                        BackWs((WebSocket)WebSocket, Content);
    
                    }
                }
                return new HttpResponseMessage(HttpStatusCode.SwitchingProtocols);
            }
    
            private async Task ProcessWSMsg(AspNetWebSocketContext arg)
            {
                //获取当前的WebSocket对象
                WebSocket webSocket = arg.WebSocket;
                if (ws.ContainsKey("1"))
                    ws["1"] = webSocket;
                else
                    ws.Add("1", webSocket);
                /*
                 * 我们定义一个常数,它将表示接收到的数据的大小。 它是由我们建立的,我们可以设定任何值。 我们知道在这种情况下,发送的数据的大小非常小。
                */
                const int maxMessageSize = 1024;
    
                //received bits的缓冲区
                var receivedDataBuffer = new ArraySegment<Byte>(new Byte[maxMessageSize]);
    
                var cancellationToken = new CancellationToken();
    
                //检查WebSocket状态
                while (webSocket.State == WebSocketState.Open)
                {
                    //读取数据 
                    WebSocketReceiveResult webSocketReceiveResult = await webSocket.ReceiveAsync(receivedDataBuffer, cancellationToken);
    
                    //如果输入帧为取消帧,发送close命令
                    if (webSocketReceiveResult.MessageType == WebSocketMessageType.Close)
                    {
                        await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, String.Empty, cancellationToken);
                    }
                    else
                    {
                        byte[] payloadData = receivedDataBuffer.Array.Where(b => b != 0).ToArray();
    
                        //因为我们知道这是一个字符串,我们转换它
                        string receiveString = System.Text.Encoding.UTF8.GetString(payloadData, 0, payloadData.Length);
    
                        //将字符串转换为字节数组. 
                        var newString = String.Format("Hello, " + receiveString + " ! Time {0} 消息来自客户端B", DateTime.Now.ToString());
                        Byte[] bytes = System.Text.Encoding.UTF8.GetBytes(newString);
    
                        //发回数据
                        await webSocket.SendAsync(new ArraySegment<byte>(bytes), WebSocketMessageType.Text, true, cancellationToken);
                    }
    
                }
            }
    
            /// <summary>
            /// 返回websocket消息
            /// </summary>
            /// <param name="webSocket"></param>
            /// <param name="Content"></param>
            private void BackWs(WebSocket webSocket,string Content)
            {
                var cancellationToken = new CancellationToken();
    
                Content = String.Format("Hello, " + Content + " ! Time {0} 消息来自客户端A", DateTime.Now.ToString());
                //检查WebSocket状态
                if (webSocket.State == WebSocketState.Open)
                {
                    //将字符串转换为字节数组. 
                    Byte[] bytes = System.Text.Encoding.UTF8.GetBytes(Content);
                    //发回数据
                    webSocket.SendAsync(new ArraySegment<byte>(bytes), WebSocketMessageType.Text, true, cancellationToken);
    
                }
            }
    
        }
    }
    

    实现效果:

    展开全文
  • 通过HTTPWebSocket对的事件进行上报以及接收请求来调用调用酷Q的DLL接口,从而可以使用其他语言编写酷Q插件。支持Windows 7和Windows Server 2008及更新版本,也可以运行在Wine,Docker 。 使用方法 使用方法见的...
  • 主要介绍了vue发送websocket请求http post请求的方法,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值 ,需要的朋友可以参考下
  • accept_websocket-—可以接受websocket请求和普通http请求 require_websocket----只接受websocket请求,拒绝普通http请求 from dwebsocket.decorators import accept_websocket,require_websocket @accept_websocket ...
  • Django通过dwebsocket实现websocket

    万次阅读 热门讨论 2019-02-28 21:42:14
    与django推荐的channel不同,dwebsocket使用更加方便...accept_websocket-—可以接受websocket请求和普通http请求 require_websocket----只接受websocket请求,拒绝普通http请求 from dwebsocket.decorators import ...

    与django推荐的channel不同,dwebsocket使用更加方便简单

    使用方法1:

    只需views.py文件中,将对应的视图函数添加装饰器

    • accept_websocket-—可以接受websocket请求和普通http请求
    • require_websocket----只接受websocket请求,拒绝普通http请求
    from dwebsocket.decorators import accept_websocket,require_websocket
    
    @accept_websocket
    def test_websocket(request):
        if request.is_websocket():
            while 1:
                time.sleep(1) ## 向前端发送时间
                dit = {
                    'time':time.strftime('%Y.%m.%d %H:%M:%S',time.localtime(time.time()))
                }
                request.websocket.send(json.dumps(dit))
    
    

    使用方法2:

    使用中间件
    步骤:
    1. settings.py文件中,添加如下信息

    import dwebsocket
    # 为所有的URL提供websocket,如果只是单独的视图需要可以不选
    MIDDLEWARE_CLASSES=['dwebsocket.middleware.WebSocketMiddleware']
    
    WEBSOCKET_ACCEPT_ALL=True  # 可以允许每一个单独的视图实用websockets
    

    官方说明:做了如上配置,仍然会拒绝普通视图的websockets。所以必须在视图上设置’ accept_websocket ’ '属性来允许websockets,所以继续做如下配置。
    2. views.py文件中,相关视图添加装饰器

    from dwebsocket.decorators import accept_websocket,require_websocket
    
    @accept_websocket
    def test_websocket(request):
        if request.is_websocket():
            while 1:
                time.sleep(1) ## 向前端发送时间
                dit = {
                    'time':time.strftime('%Y.%m.%d %H:%M:%S',time.localtime(time.time()))
                }
                request.websocket.send(json.dumps(dit))
    

    看起来跟方法一没什么区别,还多了一步settings配置,但是区别在哪呢???
    官方是这么说的:These attributes are always available if you use the middleware
    翻译过来就是,如果使用中间件,有以下这下方法可用:

    request.is_websocket()  #websocket请求返回True,普通请求返回False
    request.websocket  # websocket建立连接后,request将有websocket提供的相关api属性,如果没有建立连接则是None
    WebSocket.wait()  # 阻塞接收消息
    WebSocket.read()  # 非阻塞接收消息
    WebSocket.count_messages()  #返回队列中的消息数量
    WebSocket.has_messages()  # 有消息返回True,反之False
    WebSocket.send(message)  # 发送消息
    WebSocket.__iter__()  # 当迭代器使用
    
    

    官方链接

    展开全文
  • 这里写自定义目录标题Jmeter-websocket获取信息,加入参数,传入http请求 Jmeter-websocket获取信息,加入参数,传入http请求 测试计划 测试目的: 直播抢答接口,测试接口并发性. 测试分析 进入直播间后,形成websocket长...

    Jmeter-websocket获取信息,加入参数,传入http请求

    测试计划

    • 测试目的:
      直播抢答接口,测试接口并发性.
    • 测试分析
      进入直播间后,形成websocket长连接传输的协议, 此时教师端发起请求, 通过websocket协议传递queuename值, 学员端发起直播抢答接口,传递参数包含queuename值
    • 测试计划
      • 1 用户定义变量
      • 2用户参数
      • 3创建线程组
        获取queuename ,此处添加websocket sampler
        该线程组执行一次
      • 4创建线程组
        直播抢答接口,此处添加http request sampler
        该线程组按照实际并发需求配置
        在这里插入图片描述
        jmeter 没有自带的websocket sampler , 需要网上查找添加多个jar
        在这里插入图片描述

    websocket 获取消息并解压
    websocket 获取消息后, jmeter 将获取的消息加上了
    [message 1]=回车 (这里是真的坑)
    下面才是真正从服务端传来的数据.所以在BeanShell PostProcessor 要对捕获的数据进行处理.

    import com.dongao.app.GetQueueName;
    
    String responsedata = prev.getResponseDataAsString();
    String finaldata=responsedata.split("1]")[1]; //拦截去掉[message 1]
    log.info("--------------------------->finaldata="+finaldata.replaceFirst("\r|\n",""));//去掉第一个回车,这里值得注意,一开始用错了方法replaceAll,导致整个捕获的消息都被去掉了回车,然后再调用jar包里的方法,就会报 java.util.zip.DataFormatException: incorrect header check
    String que=GetQueueName.getQueueName(finaldata.replaceFirst("\r|\n",""));
    props.put("QueueName",que);
    
    

    多线程组,beanshell的参数传递
    同一线程组内,可用vars这个容器来传递参数
    多线程组间,可以用props 这个容器来传递参数
    (props实际的意义就是将变量定义为jmeter的内部变量)

    展开全文
  • HTTPWebSocket详解

    千次阅读 2018-05-09 11:41:17
    在整合之前需要搞清楚下面几个问题:1、Socket是什么2、为什么有了http还要用Socket3、springBoot整合...并翻译成漂亮的网页浏览器(客户端)通过HTTP协议通过URL向服务器发送请求服务器再返回相对应的数据2、socketH...
  • httpwebsocket

    2018-04-24 16:28:06
    当时我的做法是用setInterval('toPage(1)',1000)来定时执行函数,toPage()方法是通过ajax请求访问服务器,并在成功后拿到后台返回的数据然后去更新页面。但是这种定时的方法有很多不足:(1)频繁的网络请求...
  • HTTP的生命周期通过Request来界定,也就是一个Request 一个Response,那么在HTTP1.0中,这次HTTP请求就结束了。在HTTP1.1中进行了改进,使得有一个keep-alive,也就是说,在一个HTTP连接中,可以发送多个Request,...
  • WebSocket基于单个 tcp 连接提供...交互模式流的内容都是 http 请求和响应,区别在于编码和打包方式。WebSocket 增加了一些特性对流进行管理,并保留旧语义。使用加密 WebSocket 连接,WebSocket 连接使用 Transport...
  • httpwebsocket的区别

    2020-09-17 20:58:23
    应用层协议,基于传输层TCP协议,...多个http请求需经过长时间的轮询 1.1后默认使用长连接(persistent connection),头部字段加入Connection:keep-alive,默认保持75S,短时间不断开,可以发送多个请求 长轮询,..
  • WebSocket是html5中实现的一种新协议,相比http优势的是它是一种双向通信协议,不用像通过ajax长轮询请求服务器去实现类似的需求。我们先来看下需要的基础知识:1、autobahn:autobahn是websocket的python实现。2、...
  • 在之前的博文中,我们已经学完了如果使用swoole搭建websocket长连接,也学会了swoole的多进程数据共享操作。但在一个完整的websocket长连接日常操作链中...也就是我们可以通过http请求websocket中调取数据,进而发...
  • http websocket socket

    2020-01-09 11:13:22
    TCP/IP协议栈主要分为四层:应用层 ->...如果需要即时通讯,只能通过轮询(即在特定的时间间隔 如1秒),由浏览器向服务器发送请求,然后服务器再将最新数据返回给浏览器。 缺点:轮询需要不...
  • WebSocket

    2019-08-12 22:13:02
    WebSocket客户端首先通过HTTP协议发送几个特别的Header到Server,告诉Server我现在是HTTP请求,但我要升级到WebSocket。 Upgrade:websocket Connection:Upgrade Sec-WebSocket-Key: XXX Sec-WebSocket-Protocol: ...
  • websocket

    2020-04-09 10:52:05
    websocket todo TCP 跨源通信 websocket是一种应用层的网络协议,可在...WebSocket通过HTTP/1.1协议的101状态码进行握手。 客户端请求: GET / HTTP/1.1 Upgrade: websocket Connection: Upgrade Host: example.c...
  • Http的url和ws请求不一致,无法连接WebSocket的解决办法 网上找了很多资料,都没找到解决办法,都说url要和ws的请求地址一致,没办法,只好自己去看底层,通过自己不断的debug,最终找到了解决方法。 问题原因:...
  • 浏览器客户端和服务器建立起websocket的链接,最初也是http请求握手,通过httpServletRequest发送http请求到服务器,其中头部就包含需要请求websocket链接的一系列信息,大概过程如下1.客户端请求一个链接,头部中...
  • websocket使用HTTP链接

    2019-09-12 14:20:58
    背景 websocket是html5提出的新的协议规范,填补了无法长连接的空缺。在没有websocket之前,由于http是短连接,只能由客户端请求服务器,一些功能(即时通讯/处理耗时的请求...不用频繁送HTTP请求,只需要发送一个H...
  • WebSocket是html5中实现的一种新协议,相比http优势的是它是一种双向通信协议,不用像通过ajax长轮询请求服务器去实现类似的需求。我们先来看下需要的基础知识:1、autobahn:autobahn是websocket的python实现。2、...
  • websocket先通过http建立连接,后续数据交互不在需要通过http请求 websocket是一个双向通信的连接,在同一个TCP中可以接收,也可以发送 pom.xml <dependency> <groupId>org.springfra.
  • 假设有这样一个场景:服务端的资源经常在更新,客户端需要尽量及时地了解到这些更新发生后展示给用户,如果是 HTTP 1.1,通常会开启 ajax 请求询问服务端是否有更新,通过定时器反复轮询服务端响应的资源是否有更新...
  • 构建HTTP服务 TCP和UDP都是网络中传输层协议,但如果要...HTTP的报文可以通过下面这样获取,获取的内容主要是由三次握手、请求报文、相应内容、结束信息组成。 curl -v http://127.0.0.1:1337 运行图: HTTP服务器...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 843
精华内容 337
关键字:

通过http请求websocket