精华内容
下载资源
问答
  • http websocket

    2018-11-09 10:37:00
    WebSocket 教程 – 阮一峰的网络日志 二、简介 WebSocket 协议在2008年诞生,2011年成为国际标准。所有浏览器都已经支持了。 它的最大特点就是,服务器可以主动向客户端推送信息...(2)与 HTTP 协议有着良好的兼容...

    WebSocket 教程 – 阮一峰的网络日志
    在这里插入图片描述
    二、简介
    WebSocket 协议在2008年诞生,2011年成为国际标准。所有浏览器都已经支持了。

    它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。
    在这里插入图片描述
    其他特点包括:

    (1)建立在 TCP 协议之上,服务器端的实现比较容易。

    (2)与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。

    (3)数据格式比较轻量,性能开销小,通信高效。

    (4)可以发送文本,也可以发送二进制数据。

    (5)没有同源限制,客户端可以与任意服务器通信。

    (6)协议标识符是ws(如果加密,则为wss),服务器网址就是 URL。–

    四、客户端的 API
    五、服务端的实现

    -------------------------http中长连接和websocket的长连接的区别

    一、什么是http协议
    HTTP是一个应用层协议,无状态的,端口号为80。主要的版本有1.0/1.1/2.0.

    HTTP/1.* 一次请求-响应,建立一个连接,用完关闭;
    HTTP/1.1 串行化单线程处理,可以同时在同一个tcp链接上发送多个请求,但是只有响应是有顺序的,只有上一个请求完成后,下一个才能响应。一旦有任务处理超时等,后续任务只能被阻塞(线头阻塞);
    HTTP/2 并行执行。某任务耗时严重,不会影响到任务正常执行

    二、什么是websocket

    Websocket是html5提出的一个协议规范,是为解决客户端与服务端实时通信。本质上是一个基于tcp,先通过HTTP/HTTPS协议发起一条特殊的http请求进行握手后创建一个用于交换数据的TCP连接。

    WebSocket优势: 浏览器和服务器只需要要做一个握手的动作,在建立连接之后,双方可以在任意时刻,相互推送信息。同时,服务器与客户端之间交换的头信息很小。

    三、什么是长连接、短连接

    短连接:
    连接->传输数据->关闭连接
    HTTP是无状态的,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。
    也可以这样说:短连接是指SOCKET连接后发送后接收完数据后马上断开连接。

    长连接、
    连接->传输数据->保持连接 -> 传输数据-> 。。。 ->关闭连接。
    长连接指建立SOCKET连接后不管是否使用都保持连接,但安全性较差。

    四、http和websocket的长连接区别

    HTTP1.1通过使用Connection:keep-alive进行长连接,HTTP 1.1默认进行持久连接。在一次 TCP 连接中可以完成多个 HTTP 请求,但是对每个请求仍然要单独发 header,Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。这种长连接是一种“伪链接”
    websocket的长连接,是一个真的全双工。长连接第一次tcp链路建立之后,后续数据可以双方都进行发送,不需要发送请求头。

    keep-alive双方并没有建立正真的连接会话,服务端可以在任何一次请求完成后关闭。WebSocket 它本身就规定了是正真的、双工的长连接,两边都必须要维持住连接的状态。

    -------------------------------------WebSocket 和socket 的区别 面试题

    展开全文
  • 2)WebSocket 是需要握手进行建立连接的(需要借助HTTP)。 5.Socket和TCP/IP Socket 是应用层与 TCP/IP 协议族通信的中间软件抽象层,它是一组接口,提供一套调用 TCP/IP 或UDP协议的 API。 在设计模式中,Socket ...

    1.网络分层层级

    2.ws的由来

    我们知道HTTP是为了规范HTML页面的发布、接收而提出的。

    为了规范HTML5,WebSocket协议提出了。

    3.长轮训短轮询

    短轮询的方式是:页面定时向服务器发送请求,看有没有更新的数据。
    
    而长轮询的方式是,页面向服务器发起一个请求,服务器一直保持 TCP连接打开,知道有数据可发送。发送完
    数据后,页面关闭该连接,随即又发起一个新的服务器请求,在这一过程中循环。
    
    短轮询和长轮询的区别是:短轮询中服务器对请求立即响应,而长轮询中服务器等待新的数据到来才响应,因
    此实现了服务器向页面推送实时,并减少了页面的请求次数。

    4.HTTP与WS

    相同点
    1)都是一样基于 TCP 的,都是可靠性传输协议。
    2)都是应用层协议。
    
    不同点
    1)WebSocket 是双向通信协议,模拟 Socket 协议,可以双向发送或接受信息。HTTP 是半双工的。
    2)WebSocket 是需要握手进行建立连接的(需要借助HTTP)。

    5.Socket和TCP/IP

    Socket 是应用层与 TCP/IP 协议族通信的中间软件抽象层,它是一组接口,提供一套调用 TCP/IP 或UDP协议的 API。

    在设计模式中,Socket 其实就是一个门面模式,它把复杂的 TCP/IP 协议族隐藏在 Socket 接口后面,对用户来说,一组简单的接口就是全部,让 Socket 去组织数据,以符合指定的协议。2

    6.WebSocket 与 Socket 的关系

    WebSocket是一个应用层的协议,而Socket是介于应用层和传输层的一个接口。

    展开全文
  • 服务器代码 <?php use Swoole\WebSocket\Server; class Test { public $ws; public $redis; public function __construct() { Co::set(['enable_preemptive_scheduler' => 0])...
        

    服务器代码

    <?php
    
    use Swoole\WebSocket\Server;
    
    class Test
    {
        public $ws;
        public $redis;
    
        public function __construct()
        {
    
            Co::set(['enable_preemptive_scheduler' => 0]);
            $this->ws = new Server('0.0.0.0', 9501, SWOOLE_PROCESS, SWOOLE_SOCK_TCP);
            $Config = [
                'open_http_protocol' => true,
            ];
            $this->ws->set($Config);
            $this->ws->on('open', [$this, 'onOpen']);
            $this->ws->on('message', [$this, 'onMessage']);
            $this->ws->on('WorkerStart', [$this, 'onWorkerStart']);
            $this->ws->on('request', [$this, 'onRequest']);
            $this->ws->on('close', [$this, 'onClose']);
    
            $serv = $this->ws->addlistener('0.0.0.0', 9503, SWOOLE_SOCK_TCP);
            $serv->set([]);
            $serv->on('receive', [$this, 'onReceive']);
        }
    
        public function onWorkerStart()
        {
            $this->redis = new Swoole\Coroutine\Redis();
            $this->redis->connect('127.0.0.1', '6379');
            $this->redis->auth('123456');
            //清空绑定关系
            $this->redis->del('user_fd');
            $this->redis->del('device_user');
            $this->redis->del('device_fd');
        }
    
    
        /**打开webscokt连接
         * @param $ws
         * @param $request
         */
        public function onOpen($ws, $request)
        {
            $ws->push($request->fd, "hello, welcome\n");
    
        }
    
        /**websockt收到数据回调
         * @param $ws
         * @param $frame
         * @return bool
         */
        public function onMessage($ws, $frame)
        {
    
            $data = json_decode($frame->data, true);
            $user_id = $data['user_id'] ?? null;
            $device_id = $data['device_id'] ?? null;
            if (!$user_id || !$device_id) {
                $this->ws->push($frame->fd, "Parameter error");
                return false;
            }
            $this->redis->hset('user_fd', $user_id, $frame->fd);
            $this->redis->hset('device_user', $device_id, $user_id);
            $this->ws->push($frame->fd, "server: {$frame->data}");
        }
    
        public function onClose($ws, $fd)
        {
            echo "client-{$fd} is closed\n";
    
        }
    
        /**http请求回调
         * @param $request
         * @param $response
         */
        public function onRequest($request, $response)
        {
            $post_data = $request->post;
            $device_cmd = $post_data['cmd'] ?? null;
            $device_id = $post_data['device_id'] ?? null;
            $device_fd = $this->redis->hget('device_fd', $device_id);
    
            $user_id = $this->redis->hget('device_user', $device_id);
            $user_fd = $this->redis->hget('user_fd', $user_id);
            if ($user_fd) $this->ws->push($user_fd, $device_cmd);
    
            //发送数据到tcp服务
            if ($device_fd) {
                $client = new \Swoole\Coroutine\Client(SWOOLE_SOCK_TCP);
                $client->set(['max_coroutine' => 5,]);
                if (!$client->connect('127.0.0.1', 9503, 0.5)) {
                    exit("connect failed. Error: {$client->errCode}\n");
                }
                $str = json_encode(['device_fd' => $device_fd, 'device_cmd' => $device_cmd]);
                $client->send($str . "\r\n");
    //        echo $client->recv();
                $client->close();
            }
            $response->header("Content-Type", "text/html; charset=utf-8");
            $response->end("<h1>OK. #" . rand(1000, 9999) . "</h1>");
        }
    
    
        /**tcp接收数据回调
         * @param $serv
         * @param $fd
         * @param $threadId
         * @param $data
         */
        public function onReceive($serv, $fd, $threadId, $data)
        {
            $data = json_decode($data, true);
            $device_id = $data['device_id'] ?? null;
            $device_fd = $data['device_fd'] ?? null;
            $device_cmd = $data['device_cmd'] ?? null;
            //绑定设备关系
            if ($device_id) $this->redis->hset('device_fd', $device_id, $fd);
            //发送到设备数据
            if ($device_fd) $serv->send($device_fd, $device_cmd);
    
        }
    
        public function start()
        {
            $this->ws->start();
        }
    }
    
    $model = new Test();
    $model->start();
    

    web前端代码

    <!DOCTYPE HTML>
    <html>
       <head>
       <meta charset="utf-8">
       <title>测试</title>
        
          <script type="text/javascript">
           
        
                   
                   // 打开一个 web socket
                   var ws = new WebSocket("ws://127.0.0.1:9501");
                    
                   ws.onopen = function()
                   {
                    var str='{"user_id":1,"device_id":1}';
                        ws.send(str);
                          console.log('已链接');
                   };
                    
                   ws.onmessage = function (evt) 
                   { 
                      var received_msg = evt.data;
                     console.log(evt.data);
                   };
                    
                   ws.onclose = function()
                   { 
                      // 关闭 websocket
                        console.log('已关闭');
                   };
              
          </script>
            
       </head>
       <body>
          
       </body>
    </html>
    

    测试,我们用tcp与WebSocket分别连接上服务器,然后通过http发送数据,然后在tcp与WebSocket都能收到数据
    postman发送数据


    13034051-504f40781c375316.png
    image.png

    tcp端


    13034051-4912a90644e7c15c.png
    image.png

    WebSocket端


    13034051-9531d8d88203ddb2.png
    image.png
    展开全文
  • 客户端WebSocket Vert.x之HttpClient支持WebSockets.可以调用任一websocket操作并提供一个处理器连接一个WebSocket到客户端。在连接成功后,处理器将会得到WebSocket实例参数并且被调用。 client.websocket("/some...

    客户端WebSocket

    Vert.x之HttpClient支持WebSockets.可以调用任一websocket操作并提供一个处理器连接一个WebSocket到客户端。在连接成功后,处理器将会得到WebSocket实例参数并且被调用。

    client.websocket("/some-uri",websocket -> {

     System.out.println("Connected!");

    });

    向WebSockets中写入数据

    如果你想向WebSocket写入二进制消息,writeBinaryMessage可以做到:

    Buffer buffer =Buffer.buffer().appendInt(123).appendFloat(1.23f);

     websocket.writeBinaryMessage(buffer);

    如果WebSocket消息的大小超过setMaxWebSocketFrameSize设置的最大Websocket帧大小,Vert.x在发送之前,会把消息分成多个WebSocket帧。

     将帧写到WebSocket

    一个WebSocket可以组成多个帧。这种情况下,第一帧(二进制或文本)后面紧跟0个或多个后续帧。

    最后一帧会标记为最终帧。

    为了发送包含多个侦的消息,可以使用WebSocketFrame.binaryFrame , WebSocketFrame.textFrame 或者WebSocketFrame.continuationFrame 方法创建并用writeFrame方法将帧发到WebSocket.

    下面是一个二进制帧的例子:

    WebSocketFrame frame1 =WebSocketFrame.binaryFrame(buffer1, false);

    websocket.writeFrame(frame1);

     WebSocketFrame frame2 =WebSocketFrame.continuationFrame(buffer2, false);

    websocket.writeFrame(frame2);

     // Write the final frame

    WebSocketFrame frame3 =WebSocketFrame.continuationFrame(buffer2, true);

    websocket.writeFrame(frame3);

    一些情况下,只需要发送俱有单个帧的WebSocket消息。所以Vert.x提供了两个快捷方法,writeFinalBinaryFrame 和 writeFinalTextFrame.

    下面是个例子:

    websocket.writeFinalTextFrame("Geronimo!");

    // Send a websocket messages consisting of asingle final binary frame:

    Buffer buff =Buffer.buffer().appendInt(12).appendString("foo");

    websocket.writeFinalBinaryFrame(buff);

    从WebSockets中读取帧

    用frameHandler从WebSocket中读取帧。在帧到达时,帧处理器中将处理WebSocketFrame实例,例如:

    websocket.frameHandler(frame -> {

     System.out.println("Received a frame of size!");

    });

    关闭WebSocket

    在用完WebSocket连接后,用close方法关闭WebSocket连接。

    流式WebSocket

    WebSocket实例也是ReadStream和WriteStream,所以可以泵接。在使用WebSocket作为读取流或写入流时应和WebSocket连接一起使用,使用时必须是二进制帧且不能分成多帧。

    为HTTPS连接使用代理

    HTTP客户端支持通过HTTPS(HTTP/1.xCONNECT方法,如Squid)代理,或SOCK4,SOCKS5代理访问htts服务器。使用HTTP/1.x代理可以连接HTTP/1.x和HTTP2服务器。可以通过使用HttpClientOptions中的ProxyOptions对象设置代理类型,主机,端口和可选的用户名和密码进行代理设置。

    这是一个例子:

    HttpClientOptions options = newHttpClientOptions()

       .setProxyOptions(new ProxyOptions().setType(ProxyType.HTTP)

            .setHost("localhost").setPort(3128)

           .setUsername("username").setPassword("secret"));

    HttpClient client =vertx.createHttpClient(options);

    也可以使用SOCKS5代理

    HttpClientOptions options = newHttpClientOptions()

       .setProxyOptions(new ProxyOptions().setType(ProxyType.SOCKS5)

           .setHost("localhost").setPort(1080)

           .setUsername("username").setPassword("secret"));

    HttpClient client =vertx.createHttpClient(options);

    The DNS resolution is always done on the proxyserver, to achieve the 

    DNS解析总是在代理服务器上,为了完成SOCK4客户端的功能,需要本地解决DNS地址。

    请注意:一般地在使用HTTP时,请求是连接到代理服务器,大多数当然不能工作,因为正确设置的代理会拒绝连接到非安全的端口。这个特性将在下一个版中将被差异地实现,非http请求能代通用的代理请求。

    作为一个变通的方法,http代理请求可以象这样执行:

    client.get(80, "the-proxy","http://www.google.com", resp -> {});

     Verticle中的自动清理

    如果在Verticle中创建http服务器和客户端,这此服务器和客户端将在verticle御载时自动关闭。

    展开全文
  • 转自:http://blog.csdn.net/sinat_31057219/article/details/72872359https://www.jianshu.com/p/42260a2575f8TCP/IP协议栈主要分为四层:应用层、传输层、网络层、数据链路层, 每层都有相应的协议,如下图IP:网络...
  • WebSocket

    2021-04-07 23:54:14
    HTTP WebSocket WebSocket 属性 WebSocket 事件 WebSocket 方法 websocketpp 介绍 示例工程 参考 Socket是什么? Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。 HTML5 和 WebSocket ...
  • websockethttp

    2019-01-08 17:22:34
    一、websockethttp WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算) 首先HTTP有 1.1 和 1.0 之说,也就是所谓的 keep-alive ,...
  • websockethttp,轻松理解websocket

    千次阅读 2018-07-18 15:28:52
    一、websockethttp WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算) 首先HTTP有 1.1 和 1.0 之说,也就是所谓的 keep-...
  • HTTP/WebSocket

    2017-09-14 17:36:14
    HTTP/WebSocket
  • 有关httpWebSocket 的区别网上有很多的质料。个人在此仅仅是记录以下自己的学习心得,自己的理解。1. http协议是用在应用层的协议,他是基于tcp协议的,http协议建立链接也必须要有三次握手才能发送信息。http链接...
  • websocket

    2018-02-08 10:38:50
    html html5 websocket http websocket 是一种网络通信协议。 一.为什么需要websocket? 因为HTTP协议有一个缺陷:通信只能由客户端发起。  这种单项请求的特点,注定如果服务器有连续的状态变化...
  • 看完让你彻底搞懂Websocket原理

    万次阅读 多人点赞 2016-03-11 15:46:38
    偶然在知乎上看到一篇回帖,瞬间觉得之前看的那么多资料都不及这一篇回帖让我对websocket的认识深刻有木有。...WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接...
  • 通过HTTP请求WebSocket

    2020-09-23 15:28:29
    通过HTTP请求WebSocket
  • 有关httpWebSocket 的区别网上有很多的质料。个人在此仅仅是记录以下自己的学习心得,自己的理解。1. http协议是用在应用层的协议,他是基于tcp协议的,http协议建立链接也必须要有三次握手才能发送信息。http链接...
  • websockethttp优缺点

    千次阅读 2018-09-03 14:19:16
    一、websockethttp WebSocket是HTML5中的协议,支持持久连接;而Http协议不支持持久连接。 首先HTMl5指的是一系列新的API,或者说新规范,新技术。WebSocket是HTML5中新协议、新API.跟HTTP协议基本没有关系。 ...
  • http请求建立连接只能发送一次请求,不能由服务器主动向客户端发送请求,websocket建立的长连接,一次连接,后续一直通信。 http协议是用在应用层的协议,它是基于TCP协议的,http协议建立连接也必须要有三次握手...
  • 文中比较websockethttp的部分的大意:websocket请求头很小, 数据帧(frame)控制也很简单, 所以低延时(low latency)由于websocket是先由http连接后, 发送upgrade请求后“升级”上去的一个新连接, 所以在安全性, 负载...
  • 最近面试总被问WebSocketHTTP两种协议的关系以及相关实现原理,翻了翻资料,知乎上的一篇回帖让我恍然大悟,把它也分享给大家。 2、WebSocketHTTP WebSocket:是HTML5出的东西(协议),也就是说HTTP协议没有...
  • 偶然在知乎上看到一篇回帖,瞬间觉得之前看的那么多资料都不及这一篇回帖让我对 websocket 的认识深刻有木有...WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接
  • 通过HTTP请求Websocket

    千次阅读 2018-12-30 18:31:45
    当浏览器A(Browser)向服务端发起HTTP请求时,服务端S接收HTTP请求并通过websocket向客户端B返回消息。 流程图: 客户端B的代码:用html实现,用于发送websocket请求和接收。 <!DOCTYPE html> <...
  • 偶然在知乎上看到一篇回帖,瞬间觉得之前看的那么多资料都不及这一篇回帖让我对 websocket 的认识深刻有木有。...WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 18,142
精华内容 7,256
关键字:

httpwebsocket