精华内容
下载资源
问答
  • 浏览器控制台(1)F12进入控制台,点击Network,选中ws栏,注意选中Filter。(2)刷新页面会得到一个ws链接。(3)点击链接可以查看链接详情测试网站http://www.websocket.org/echo.htmlfiddler抓包Websocket1、fiddle配置...

    浏览器控制台

    (1)F12进入控制台,点击Network,选中ws栏,注意选中Filter。

    (2)刷新页面会得到一个ws链接。

    (3)点击链接可以查看链接详情

    测试网站http://www.websocket.org/echo.html

    20200422010048991778.png

    fiddler抓包Websocket

    1、fiddle配置 点击Rules选着Customize Rules,在FiddlerScript中找到如下代码进行调整

    在class Handlers中加入以下代码

    static function OnWebSocketMessage(oMsg: WebSocketMessage) {

    // Log Message to the LOG tab

    FiddlerApplication.Log.LogString(oMsg.ToString());

    }

    2、保存后就可以在Fiddler右边栏的Log标签里

    20200422010049663679.png

    原文:https://www.cnblogs.com/dwdw/p/12749111.html

    展开全文
  • 然而,webSocket是长连接,只要进行一次连接,即可服务器和客户端进行双向通信,可以服务器向客户端推送信息。以前还没有websocket这个技术的时候是 通过ajax轮询来完成操作的。但是,隔一段时间就去问服务器,这样对...

    WebSocket是Html5里面的一个东西。

    WebSocket有别于从前的Http协议,http是无状态的。请求了一次服务器,下一次请求连自己都不知道自己上一次请求了什么内容,

    然而,webSocket是长连接,只要进行一次连接,即可服务器和客户端进行双向通信,可以服务器向客户端推送信息。以前还没有websocket这个技术的时候是

    通过ajax轮询来完成操作的。但是,隔一段时间就去问服务器,这样对服务器的压力是可想而知的。websocket就没有这样的问题。可以十分方便的实现长连接,

    而且开销还不大。

     

    注意,websocket是一个底层协议,可以理解为跟http是一个级别的。 STOMP则是基于websocket的上层协议。

    还有一点需要注意的是,客户端浏览器有的还不支持websocket,此时可以用Sockjs来作为Websocket的备选方案。

    sockjs一样可以作为STOMP的客户端。

    那么现在来看Springboot环境下的代码。

     

    代码摘自官网demo

     

    
     
    1. package hello;

    2.  
    3. import org.springframework.context.annotation.Configuration;

    4. import org.springframework.messaging.simp.config.MessageBrokerRegistry;

    5. import org.springframework.web.socket.config.annotation.AbstractWebSocketMessageBrokerConfigurer;

    6. import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;

    7. import org.springframework.web.socket.config.annotation.StompEndpointRegistry;

    8.  
    9. @Configuration

    10. @EnableWebSocketMessageBroker

    11. public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer

    12. {

    13.  
    14. @Override

    15. public void configureMessageBroker(MessageBrokerRegistry config)

    16. {

    17.  
    18. <span style="white-space:pre"> </span>//这行代码是配置中间人的 url 一会儿服务器会将产生的信息发送到这个地址,由订阅该地址的websocket客户端消费掉。<span style="white-space:pre"> </span>

    19. config.enableSimpleBroker( "/topic" );

    
    
    
    
    
     
    1. <span style="white-space:pre"> </span>//websocket客户端将要发送到websocket服务端的信息地址,个人觉得是为了区别于像其他servlet地址

    2. config.setApplicationDestinationPrefixes( "/app" );

    3. }

    4.  
    5. @Override

    6. public void registerStompEndpoints(StompEndpointRegistry registry)

    7. {

    8.  
    9.  
    10. //这个方法是产生了一个endpoint,参数为websocket的客户端要对服务器端进行连接的地址

    11. registry.addEndpoint( "/gs-guide-websocket" ).withSockJS();

    12. }

    13.  
    14. }

    第一个java代码是启动WebSocket配置。不知读者朋友们是否写过tomcat下的websocket代码。

     

    那会儿一个类实现了一个ServerApplicationConfig接口, 该接口位于 javax.websocket.server这个包下。

    并且在tomcat容器启动时,寻找并注册开发者用@ServerEndPoint注解修饰的类

     

    这里的代码也是一个意思
     

     

     

     

    
     
    1. package hello;

    2.  
    3. import org.springframework.messaging.handler.annotation.MessageMapping;

    4. import org.springframework.messaging.handler.annotation.SendTo;

    5. import org.springframework.stereotype.Controller;

    6.  
    7. @Controller

    8. public class GreetingController

    9. {

    10.  
    
     
    1. <span style="white-space:pre"> </span>//这个地址也是让用户用户发送websocket客户端数据的地址 ,与上一个java代码 拼接起来 ,所有websocket客户端应该发送的地址是 -----> /app/hello

    2. @MessageMapping("/hello")

    
     
    1. <span style="white-space:pre"> </span>//这个地址是websocket服务器端要把服务器回送的消息发送的地址,消息内容会由订阅了这个地址的websocket客户端消费掉

    2. @SendTo("/topic/greetings")

    3. public Greeting greeting(HelloMessage message) throws Exception

    4. {

    5.  
    6.  
    7. System.out.println("欢迎得到调用........");

    8.  
    9. System.out.println(message.getName());

    10.  
    11. Thread.sleep( 1000 ); // simulated delay

    12. return new Greeting( "Hello, " + message.getName() + "!" );

    13. }

    14.  
    15. }

     

     

     

     

    
     
    1. /**

    2. * 连接

    3. *

    4. * subscribe '/topic/greetings'

    5. */

    6. function connect()

    7. {

    8. var socket = new SockJS('/gs-guide-websocket');

    9. stompClient = Stomp.over(socket);

    10. stompClient.connect({}, function (frame)

    11. {

    12. setConnected(true);

    13. console.log('Connected: ' + frame);

    14. stompClient.subscribe('/topic/greetings', function (greeting)

    15. {

    16. showGreeting(JSON.parse(greeting.body).content);

    17. });

    18. });

    19. }

    这段代码是用于进行websocket连接用的.

     

     

     var socket = new SockJS('/gs-guide-websocket');

    这行代码里写的参数即为endpoint的地址。

     

     

    
     
    1. stompClient.subscribe('/topic/greetings', function (greeting)

    2. {

    3. showGreeting(JSON.parse(greeting.body).content);

    4. });

    subscribe方法则是写的订阅的地址,订阅的地址一旦有了消息,就将其消费掉。得到信息后,在web浏览器内显示数据

     

    
     
    1. /**

    2. * 发送自己的信息

    3. */

    4. function sendName()

    5. {

    6. stompClient.send("/app/hello", {}, JSON.stringify({'name': $("#name").val()}));

    7. }

    send方法里的参数就是websocket要发送的地址,上面的java代码里已经有了说明.

     



    完整的代码在Spring的官网上有。

    http://spring.io/guides/gs/messaging-stomp-websocket/

    展开全文
  • linuxwebsocket server demo例程

    千次阅读 2017-08-22 17:28:50
    websocket的协议,原理参考... 2、握手,当与客户端建立tcp连接后,客户端会发送websocket请求,此时,服务器端需要提取客户端在websocket请求中包含一个握手的唯一Key,服务端在拿到这个Key后,需要加入一个GUID,然

    websocket的协议,原理参考文档:WebScoket 规范 + WebSocket 协议


    主要步骤:1、创建socket套接字进行监听客户端;
      2、握手,当与客户端建立tcp连接后,客户端会发送websocket请求,此时,服务器端需要提取客户端在websocket请求中包含一个握手的唯一Key,服务端在拿到这个Key后,需要加入一个GUID,然后进行sha1的加密,再转换成base64,最后再发回到客户端。这样就完成了一次握手。此种握手方式是针对chrome websocket 13的版本,其他版本的可能会有所不同。握手只需一次即可,握手成功后进行正常的数据通信。

      3、后面的过程跟tcp通信一样;


    附上代码:

    websocket.c

    /*********************************************************************************
     *      Copyright:  (C) 2017 Yang Zheng<yz2012ww@gmail.com>  
     *                  All rights reserved.
     *
     *       Filename:  websocket.c
     *    Description:  This file 
     *                 
     *        Version:  1.0.0(08/17/2017~)
     *         Author:  Yang Zheng <yz2012ww@gmail.com.com>
     *      ChangeLog:  1, Release initial version on "08/17/2017 02:03:22 PM"
     *                 
     ********************************************************************************/
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    
    #include "base64.h"
    #include "sha1.h"
    #include "intlib.h"
    
    
    #define REQUEST_LEN_MAX         1024
    #define DEFEULT_SERVER_PORT     8000
    #define WEB_SOCKET_KEY_LEN_MAX  256
    #define RESPONSE_HEADER_LEN_MAX 1024
    #define PER_LINE_MAX            256
    
    
    /**************************************************************************************
     * Function Name: extract_client_key 
     *   Description: 提取客户端发送的handshake key值
     *    Input Args: @buffer 客户端发送的握手数据
     *   Output Args: 输出客户端发来handshake key
     *  Return Value: server_key 客户端发来的handshake key
     *************************************************************************************/
    static char *extract_client_key(const char * buffer)
    {
        char    *key = NULL;
        char    *start = NULL; /* 要提取字符串的起始地址 */
        char    *flag = "Sec-WebSocket-Key: ";
        int     i = 0;
        int     buf_len = 0;
    
        if(NULL == buffer) {
            printf("buffer is NULL.\n");
            return NULL;
        }
    
        key=(char *)malloc(WEB_SOCKET_KEY_LEN_MAX);
        if (NULL == key) {
            printf("key alloc failure.\n");
            return NULL;
        }
        memset(key,0, WEB_SOCKET_KEY_LEN_MAX);
    
    
        start = strstr(buffer, flag);
        if(NULL == start) {
            printf("start is NULL.\n");
            return NULL;
        }
    
        start += strlen(flag);
        buf_len = strlen(buffer);
        for(i=0;i<buf_len;i++) {
            if(start[i]==0x0A || start[i]==0x0D) /* 回车换行标志 */
                break;
            key[i] = start[i];
        }
    
        return key;
    } /* ----- End of extract_client_key()  ----- */
    
    
    /**************************************************************************************
     * Function Name: calculate_accept_key
     *   Description: 计算handshake key值
     *    Input Args: @buffer 客户端发送的握手数据
     *   Output Args: 输出服务器发送的handshake key
     *  Return Value: server_key 服务器发送的handshake key
     *************************************************************************************/
    static char *calculate_accept_key(const char * buffer)
    {
        int         i;
        int         n;
        char        *client_key = NULL;
        char        *server_key = NULL; 
        char        *sha1_data_tmp = NULL;
        char        *sha1_data = NULL;
        const char  *guid = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; /* "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" 存放于.rodata段 */
    
    
        if(NULL == buffer) {
            printf("buffer is NULL.\n");
            return NULL;
        }
    #if 0
        client_key = (char *)malloc(PER_LINE_MAX);
        if (NULL == client_key) {
            printf("client_key alloc failure.\n");
            return NULL;
        }
    
        memset(client_key, 0, PER_LINE_MAX);
    #endif
        client_key = extract_client_key(buffer);
        if(NULL == client_key) {
            printf("client_key is NULL.");
            return NULL;
        }
    
        strcat(client_key, guid); /* 构建新key */
    
        sha1_data_tmp = sha1_hash(client_key); /* hash 加密 */
        n = strlen(sha1_data_tmp);
    
        sha1_data=(char *)malloc(n/2+1);
        if (NULL == sha1_data) {
            printf("sha1_data alloc failure.\n");
            return NULL;
        }
        memset(sha1_data,0,n/2+1);
    
        for(i=0; i<n; i+=2)
            sha1_data[i/2] = htoi(sha1_data_tmp, i, 2);    
    
        server_key = base64_encode(sha1_data, strlen(sha1_data)); 
    
        if (client_key != NULL) {
            free(client_key);
            client_key = NULL;
        }
    
        if (sha1_data != NULL) {
            free(sha1_data);
            sha1_data = NULL;
        }
    
        if (sha1_data_tmp != NULL) {
            free(sha1_data_tmp);
            sha1_data_tmp = NULL;
        }
    
        return server_key;
    } /* ----- End of calculate_accept_key()  ----- */
    
    /**************************************************************************************
     * Function Name: websocket_shakehand
     *   Description: 服务器发送握手消息
     *    Input Args: @conn_fd 连接句柄
     *                @server_key 服务器加密后的handshake key
     *   Output Args: 无
     *  Return Value: 无
     *************************************************************************************/
    static void websocket_shakehand(int conn_fd, const char *server_key)
    {
        char response_header[RESPONSE_HEADER_LEN_MAX];
    
        if(!conn_fd) {
            printf("connfd is error.\n");
            return ;
        }
    
        if(NULL == server_key) {
            printf("server_key is NULL.\n");
            return ;
        }
    
        memset(response_header,'\0',RESPONSE_HEADER_LEN_MAX);
    
        sprintf(response_header, "HTTP/1.1 101 Switching Protocols\r\n");
        sprintf(response_header, "%sUpgrade: websocket\r\n", response_header);
        sprintf(response_header, "%sConnection: Upgrade\r\n", response_header);
        sprintf(response_header, "%sSec-WebSocket-Accept: %s\r\n\r\n", response_header, server_key);
    
        printf("Response Header:%s\n", response_header);
    
        write(conn_fd, response_header, strlen(response_header));
    } /* ----- End of websocket_shakehand()  ----- */
    
    /**************************************************************************************
     * Function Name: deal_data 
     *   Description: 处理客户端数据
     *    Input Args: @buffer 接收的数据
     *                @buf_len 接收的数据长度
     *   Output Args: 无
     *  Return Value: payload_data 返回负载数据
     *************************************************************************************/
    char *deal_data(const char *buffer,const int buf_len)
    {
        int             i = 0; 
        char            fin;
        char            mask_flag;
        char            masks[4];
        char            *payload_data = NULL;
        char            temp[8];
        unsigned long   n;
        unsigned long   payloadLen = 0;
    
        if (buf_len < 2) {
            printf("buf_len less than 2.\n");
            return NULL;
        }
    
        fin = (buffer[0] & 0x80) == 0x80; // 1bit,1表示最后一帧  
        if (!fin) {
            printf("fin is error.\n");
            return NULL;// 超过一帧暂不处理 
        }
    
        mask_flag = (buffer[1] & 0x80) == 0x80; // 是否包含掩码  
        if (!mask_flag) {
            printf("no mask.\n");
            return NULL;// 不包含掩码的暂不处理
        }
    
        payloadLen = buffer[1] & 0x7F; // 数据长度 
        if (payloadLen == 126) {      
            memcpy(masks, buffer+4, 4);      
            payloadLen =(buffer[2]&0xFF) << 8 | (buffer[3]&0xFF);  
            payload_data=(char *)malloc(payloadLen);
            memset(payload_data,0,payloadLen);
            memcpy(payload_data,buffer+8,payloadLen);
        } else if (payloadLen == 127) {
            memcpy(masks,buffer+10,4);  
            for ( i = 0; i < 8; i++)
                temp[i] = buffer[9 - i];
    
            memcpy(&n,temp,8);  
            payload_data=(char *)malloc(n); 
            memset(payload_data,0,n); 
            memcpy(payload_data,buffer+14,n);//toggle error(core dumped) if data is too long.
            payloadLen=n;    
        } else {   
            memcpy(masks,buffer+2,4);    
            payload_data=(char *)malloc(payloadLen);
            memset(payload_data,0,payloadLen);
            memcpy(payload_data,buffer+6,payloadLen); 
        }
    
        for (i = 0; i < payloadLen; i++)
            payload_data[i] = (char)(payload_data[i] ^ masks[i % 4]);
    
        printf("data(%ld):%s\n", payloadLen, payload_data);
        return payload_data;
    } /* ----- End of deal_data()  ----- */
    
    /**************************************************************************************
     * Function Name: construct_packet_data
     *   Description: 组建websocket数据包
     *    Input Args: @message 发送的数据
     *                @len 发送数据长度
     *   Output Args: 无
     *  Return Value: data 返回组建后的包
     *************************************************************************************/
    static char *construct_packet_data(const char *message, unsigned long *len)
    {
        char *data = NULL;
        unsigned long n;
    
        if (NULL == message) {
            printf("message is NULL.\n");
            return NULL;
        }
    
        n = strlen(message);
        if (n < 126) {
            data=(char *)malloc(n+2);
            if (NULL == data) {
                printf("data is NNLL.\n");
                return NULL;
            }
            memset(data,0,n+2);	 
            data[0] = 0x81;
            data[1] = n;
            memcpy(data+2,message,n);
            *len=n+2;
        } else if (n < 0xFFFF) {
            data=(char *)malloc(n+4);
            if (NULL == data) {
                printf("data is NNLL.\n");
                return NULL;
            }
            memset(data,0,n+4);
            data[0] = 0x81;
            data[1] = 126;
            data[2] = (n>>8 & 0xFF);
            data[3] = (n & 0xFF);
            memcpy(data+4,message,n);    
            *len=n+4;
        } else {
            // 暂不处理超长内容  
            *len=0;
        }
    
        return data;
    } /* ----- End of construct_packet_data()  ----- */
    
    /**************************************************************************************
     * Function Name: response
     *   Description: 响应客户端
     *    Input Args: @conn_fd 连接句柄
     *                @message 发送的数据
     *   Output Args: 无
     *  Return Value: 无
     *************************************************************************************/
    void response(int conn_fd, const char *message)
    {
        char *data = NULL;
        unsigned long n=0;
    
        if(!conn_fd) {
            printf("conn_fd is error.\n");
            return ;
        }
    
        if(NULL == message) {
            printf("message is NULL.\n");
            return ;
        }
    
        data = construct_packet_data(message, &n); 
        if(NULL == data || n <= 0)
        {
            printf("data is empty!\n");
            return ;
        } 
    
        write(conn_fd, data, n);
    
        if (NULL == data) {
            free(data);
            data = NULL;
        }
    } /* ----- End of response()  ----- */
    
    
    /********************************************************************************
     * Function Name:
     *   Description:
     *    Input Args:
     *   Output Args:
     *  Return Value:
     ********************************************************************************/
    int main(int argc, char *argv[])
    {
        int                 listen_fd;
        int                 conn_fd;
        char                buf[REQUEST_LEN_MAX];
        char                *data = NULL;
        char                str[INET_ADDRSTRLEN];
        char                *sec_websocket_key = NULL;
        int                 n;
        int                 connected = 0;//0:not connect.1:connected.
        int                 port = DEFEULT_SERVER_PORT;
        struct sockaddr_in  servaddr;
        struct sockaddr_in  cliaddr;
        socklen_t           cliaddr_len;
    
        if(argc > 1) 
            port = atoi(argv[1]);
    
        if(port<=0 || port>0xFFFF) {
            printf("Port(%d) is out of range(1-%d)\n", port, 0xFFFF);
            return -1;
        }
        listen_fd = socket(AF_INET, SOCK_STREAM, 0);
    
        bzero(&servaddr, sizeof(servaddr));
        servaddr.sin_family = AF_INET;
        servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
        servaddr.sin_port = htons(port);
    
        bind(listen_fd, (struct sockaddr *)&servaddr, sizeof(servaddr));
    
        listen(listen_fd, 20);
    
        printf("Listen %d\nAccepting connections ...\n",port);
        cliaddr_len = sizeof(cliaddr);
        conn_fd = accept(listen_fd, (struct sockaddr *)&cliaddr, &cliaddr_len);
        printf("From %s at PORT %d\n", \
                inet_ntop(AF_INET, &cliaddr.sin_addr, str, sizeof(str)),
                ntohs(cliaddr.sin_port));
    
        while (1)
        {
            memset(buf, 0, REQUEST_LEN_MAX);
            n = read(conn_fd, buf, REQUEST_LEN_MAX);	
            printf("---------------------\n");
    
            if(!connected) {
                printf("read:%d\n%s\n", n, buf);
                sec_websocket_key = calculate_accept_key(buf);	
                websocket_shakehand(conn_fd, sec_websocket_key);
                if (sec_websocket_key != NULL) {
                    free(sec_websocket_key);
                    sec_websocket_key = NULL;
                }
                connected=1;
                continue;
            }
    
            data = deal_data(buf, n);
            response(conn_fd, data);
        }
    
        close(conn_fd);
        return 0;
    } /* ----- End of main() ----- */
    

    sha1.c

    /*********************************************************************************
     *      Copyright:  (C) 2017 Yang Zheng<yz2012ww@gmail.com>  
     *                  All rights reserved.
     *
     *       Filename:  sha1.c
     *    Description:  This file 
     *                 
     *        Version:  1.0.0(08/17/2017~)
     *         Author:  Yang Zheng <yz2012ww@gmail.com>
     *      ChangeLog:  1, Release initial version on "08/17/2017 02:08:20 PM"
     *                 
     ********************************************************************************/
    #include "sha1.h"
    
    static void sha1_process_message_block(sha1_context*);
    static void sha1_pad_message(sha1_context*);
    
    static void sha1_reset(sha1_context *context) // 初始化动作
    {
        context->length_low             = 0;
        context->length_high            = 0;
        context->message_block_index    = 0;
    
        context->message_digest[0]      = 0x67452301;
        context->message_digest[1]      = 0xEFCDAB89;
        context->message_digest[2]      = 0x98BADCFE;
        context->message_digest[3]      = 0x10325476;
        context->message_digest[4]      = 0xC3D2E1F0;
    
        context->computed   = 0;
        context->corrupted  = 0;
    }
    
    
    static int sha1_result(sha1_context *context) // 成功返回1,失败返回0
    {
        if (context->corrupted) {
            return 0;
        }
        if (!context->computed) {
            sha1_pad_message(context);
            context->computed = 1;
        }
        return 1;
    }
    
    
    static void sha1_input(sha1_context *context,const char *message_array,unsigned length)
    {
        if (!length) return;
    
        if (context->computed || context->corrupted){
            context->corrupted = 1;
            return;
        }
    
        while(length-- && !context->corrupted){
            context->message_block[context->message_block_index++] = (*message_array & 0xFF);
    
            context->length_low += 8;
    
            context->length_low &= 0xFFFFFFFF;
            if (context->length_low == 0){
                context->length_high++;
                context->length_high &= 0xFFFFFFFF;
                if (context->length_high == 0) context->corrupted = 1;
            }
    
            if (context->message_block_index == 64){
                sha1_process_message_block(context);
            }
            message_array++;
        }
    }
    
    static void sha1_process_message_block(sha1_context *context)
    {
        const unsigned K[] = {0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xCA62C1D6 };
        int         t;                
        unsigned    temp;             
        unsigned    W[80];            
        unsigned    A, B, C, D, E;    
    
        for(t = 0; t < 16; t++) {
            W[t] = ((unsigned) context->message_block[t * 4]) << 24;
            W[t] |= ((unsigned) context->message_block[t * 4 + 1]) << 16;
            W[t] |= ((unsigned) context->message_block[t * 4 + 2]) << 8;
            W[t] |= ((unsigned) context->message_block[t * 4 + 3]);
        }
    
        for(t = 16; t < 80; t++)  W[t] = SHA1_CIRCULAR_SHIFT(1,W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16]);
    
        A = context->message_digest[0];
        B = context->message_digest[1];
        C = context->message_digest[2];
        D = context->message_digest[3];
        E = context->message_digest[4];
    
        for(t = 0; t < 20; t++) {
            temp =  SHA1_CIRCULAR_SHIFT(5,A) + ((B & C) | ((~B) & D)) + E + W[t] + K[0];
            temp &= 0xFFFFFFFF;
            E = D;
            D = C;
            C = SHA1_CIRCULAR_SHIFT(30,B);
            B = A;
            A = temp;
        }
        for(t = 20; t < 40; t++) {
            temp = SHA1_CIRCULAR_SHIFT(5,A) + (B ^ C ^ D) + E + W[t] + K[1];
            temp &= 0xFFFFFFFF;
            E = D;
            D = C;
            C = SHA1_CIRCULAR_SHIFT(30,B);
            B = A;
            A = temp;
        }
        for(t = 40; t < 60; t++) {
            temp = SHA1_CIRCULAR_SHIFT(5,A) + ((B & C) | (B & D) | (C & D)) + E + W[t] + K[2];
            temp &= 0xFFFFFFFF;
            E = D;
            D = C;
            C = SHA1_CIRCULAR_SHIFT(30,B);
            B = A;
            A = temp;
        }
        for(t = 60; t < 80; t++) {
            temp = SHA1_CIRCULAR_SHIFT(5,A) + (B ^ C ^ D) + E + W[t] + K[3];
            temp &= 0xFFFFFFFF;
            E = D;
            D = C;
            C = SHA1_CIRCULAR_SHIFT(30,B);
            B = A;
            A = temp;
        }
        context->message_digest[0] = (context->message_digest[0] + A) & 0xFFFFFFFF;
        context->message_digest[1] = (context->message_digest[1] + B) & 0xFFFFFFFF;
        context->message_digest[2] = (context->message_digest[2] + C) & 0xFFFFFFFF;
        context->message_digest[3] = (context->message_digest[3] + D) & 0xFFFFFFFF;
        context->message_digest[4] = (context->message_digest[4] + E) & 0xFFFFFFFF;
        context->message_block_index = 0;
    }
    
    static void sha1_pad_message(sha1_context* context)
    {
        if (context->message_block_index > 55) {
            context->message_block[context->message_block_index++] = 0x80;
            while(context->message_block_index < 64)  context->message_block[context->message_block_index++] = 0;
            sha1_process_message_block(context);
            while(context->message_block_index < 56) context->message_block[context->message_block_index++] = 0;
        } else {
            context->message_block[context->message_block_index++] = 0x80;
            while(context->message_block_index < 56) context->message_block[context->message_block_index++] = 0;
        }
        context->message_block[56] = (context->length_high >> 24 ) & 0xFF;
        context->message_block[57] = (context->length_high >> 16 ) & 0xFF;
        context->message_block[58] = (context->length_high >> 8 ) & 0xFF;
        context->message_block[59] = (context->length_high) & 0xFF;
        context->message_block[60] = (context->length_low >> 24 ) & 0xFF;
        context->message_block[61] = (context->length_low >> 16 ) & 0xFF;
        context->message_block[62] = (context->length_low >> 8 ) & 0xFF;
        context->message_block[63] = (context->length_low) & 0xFF;
    
        sha1_process_message_block(context);
    }
    
    #define SHA1_SIZE   128
    char *sha1_hash(const char *source)
    {
        sha1_context    sha;
        char            *buf = NULL;
    
        sha1_reset(&sha);
        sha1_input(&sha, source, strlen(source));
    
        if (!sha1_result(&sha)){
            printf("SHA1 ERROR: Could not compute message digest");
            return NULL;
        } else {
            buf = (char *)malloc(SHA1_SIZE);
            if (NULL == buf) {
                printf("buf is NULL.\n");
                return NULL;
            }
            memset(buf, 0, sizeof(SHA1_SIZE));
            sprintf(buf, "%08X%08X%08X%08X%08X", sha.message_digest[0],sha.message_digest[1],
                    sha.message_digest[2],sha.message_digest[3],sha.message_digest[4]);
            //lr_save_string(buf, lrvar);
    
            //return strlen(buf);
            return buf;
        }
    }
    
    

    sha1.h

    /********************************************************************************
     *      Copyright:  (C) 2017 Yang Zheng<yz2012ww@gmail.com>
     *                  All rights reserved.
     *
     *       Filename:  sha1.h
     *    Description:  This head file 
     *
     *        Version:  1.0.0(08/17/2017~)
     *         Author:  Yang Zheng <yz2012ww@gmail.com>
     *      ChangeLog:  1, Release initial version on "08/17/2017 02:11:08 PM"
     *                 
     ********************************************************************************/
    #ifndef __SHA1_H__
    #define __SHA1_H__
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct _sha1_context{
    	unsigned        message_digest[5];      
    	unsigned        length_low;             
    	unsigned        length_high;            
    	unsigned char   message_block[64]; 
    	int             message_block_index;         
    	int             computed;                    
    	int             corrupted;                   
    }sha1_context;
    
    #define SHA1_CIRCULAR_SHIFT(bits,word) ((((word) << (bits)) & 0xFFFFFFFF) | ((word) >> (32-(bits))))
    
    char *sha1_hash(const char *source);
    #endif
    


    intlib.c

    /*********************************************************************************
     *      Copyright:  (C) 2017 Yang Zheng<yz2012ww@gmail.com>  
     *                  All rights reserved.
     *
     *       Filename:  intlib.c
     *    Description:  This file 
     *                 
     *        Version:  1.0.0(08/17/2017~)
     *         Author:  Yang Zheng <yz2012ww@gmail.com>
     *      ChangeLog:  1, Release initial version on "08/17/2017 02:09:51 PM"
     *                 
     ********************************************************************************/
    int tolower(int c) 
    { 
        if (c >= 'A' && c <= 'Z') 
        { 
            return c + 'a' - 'A'; 
        } 
        else 
        { 
            return c; 
        } 
    } 
    
    int htoi(const char s[],int start,int len) 
    { 
        int i,j; 
        int n = 0; 
        if (s[0] == '0' && (s[1]=='x' || s[1]=='X')) //判断是否有前导0x或者0X
        { 
            i = 2; 
        } 
        else 
        { 
            i = 0; 
        } 
        i+=start;
        j=0;
        for (; (s[i] >= '0' && s[i] <= '9') 
                || (s[i] >= 'a' && s[i] <= 'f') || (s[i] >='A' && s[i] <= 'F');++i) 
        {   
            if(j>=len)
            {
                break;
            }
            if (tolower(s[i]) > '9') 
            { 
                n = 16 * n + (10 + tolower(s[i]) - 'a'); 
            } 
            else 
            { 
                n = 16 * n + (tolower(s[i]) - '0'); 
            } 
            j++;
        } 
        return n; 
    } 
    
    
    
    
    

    intlib.h

    /********************************************************************************
     *      Copyright:  (C) 2017 Yang Zheng<yz2012ww@gmail.com>
     *                  All rights reserved.
     *
     *       Filename:  intlib.h
     *    Description:  This head file 
     *
     *        Version:  1.0.0(08/17/2017~)
     *         Author:  Yang Zheng <yz2012ww@gmail.com>
     *      ChangeLog:  1, Release initial version on "08/17/2017 02:10:46 PM"
     *                 
     ********************************************************************************/
    
    #ifndef __INT_LIB_H__
    #define __INT_LIB_H__
    
    int tolower(int c);
    int htoi(const char s[],int start,int len);
    #endif
    
    


    base64.c

    /*********************************************************************************
     *      Copyright:  (C) 2017 Yang Zheng<yz2012ww@gmail.com>  
     *                  All rights reserved.
     *
     *       Filename:  base64.c
     *    Description:  This file 
     *                 
     *        Version:  1.0.0(08/17/2017~)
     *         Author:  Yang Zheng <yz2012ww@gmail.com>
     *      ChangeLog:  1, Release initial version on "08/17/2017 02:09:12 PM"
     *                 
     ********************************************************************************/
    #include "base64.h"
    
    const char base[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; 
    
    char *base64_encode(const char* data, int data_len) 
    { 
        int prepare = 0; 
        int ret_len; 
        int temp = 0; 
        char *ret = NULL; 
        char *f = NULL; 
        int tmp = 0; 
        unsigned char changed[4]; 
        int i = 0; 
        ret_len = data_len / 3; 
        temp = data_len % 3; 
    
        if (temp > 0) 
            ret_len += 1; 
    
        ret_len = ret_len*4 + 1; 
        ret = (char *)malloc(ret_len); 
        if ( ret == NULL) { 
            printf("ret alloc failure.\n"); 
            return NULL; 
        } 
        memset(ret, 0, ret_len); 
    
        f = ret; 
        while (tmp < data_len) 
        { 
            temp = 0; 
            prepare = 0; 
            memset(changed, '\0', 4); 
            while (temp < 3) 
            { 
                if (tmp >= data_len) 
                    break; 
    
                prepare = ((prepare << 8) | (data[tmp] & 0xFF)); 
                tmp++; 
                temp++; 
            } 
    
            prepare = (prepare<<((3-temp)*8)); 
            for (i=0; i<4 ;i++) { 
                if (temp < i) 
                    changed[i] = 0x40; 
                else 
                    changed[i] = (prepare>>((3-i)*6)) & 0x3F; 
    
                *f = base[changed[i]]; 
                f++; 
            } 
        } 
        *f = '\0'; 
          
        return ret; 
    } 
    
    static char find_pos(char ch)   
    { 
        char *ptr = (char*)strrchr(base, ch);//the last position (the only) in base[] 
        return (ptr - base); 
    } 
    
    char *base64_decode(const char *data, int data_len) 
    { 
        int ret_len = (data_len / 4) * 3; 
        int equal_count = 0; 
        char *ret = NULL; 
        char *f = NULL; 
        int tmp = 0; 
        int temp = 0; 
        char need[3]; 
        int prepare = 0; 
        int i = 0; 
    
        if (*(data + data_len - 1) == '=') 
            equal_count += 1; 
    
        if (*(data + data_len - 2) == '=') 
            equal_count += 1; 
    
        if (*(data + data_len - 3) == '=') 
            equal_count += 1; 
    
        switch (equal_count) 
        { 
        case 0: 
            ret_len += 4;//3 + 1 [1 for NULL] 
            break; 
        case 1: 
            ret_len += 4;//Ceil((6*3)/8)+1 
            break; 
        case 2: 
            ret_len += 3;//Ceil((6*2)/8)+1 
            break; 
        case 3: 
            ret_len += 2;//Ceil((6*1)/8)+1 
            break; 
        } 
        ret = (char *)malloc(ret_len); 
        if (NULL == ret) { 
            printf("ret alloc failure.\n"); 
            return NULL; 
        } 
        memset(ret, 0, ret_len); 
    
        f = ret; 
        while (tmp < (data_len - equal_count)) 
        { 
            temp = 0; 
            prepare = 0; 
            memset(need, 0, 4); 
            while (temp < 4) 
            { 
                if (tmp >= (data_len - equal_count)) 
                    break; 
                prepare = (prepare << 6) | (find_pos(data[tmp])); 
                temp++; 
                tmp++; 
            } 
    
            prepare = prepare << ((4-temp) * 6); 
            for (i=0; i<3; i++) { 
                if (i == temp) 
                    break; 
                *f = (char)((prepare>>((2-i)*8)) & 0xFF); 
                f++; 
            } 
        } 
        *f = '\0'; 
        return ret; 
    }
    



    base64.h

    /********************************************************************************
     *      Copyright:  (C) 2017 Yang Zheng<yz2012ww@gmail.com>
     *                  All rights reserved.
     *
     *       Filename:  base64.h
     *    Description:  This head file 
     *
     *        Version:  1.0.0(08/17/2017~)
     *         Author:  Yang Zheng <yz2012ww@gmail.com>
     *      ChangeLog:  1, Release initial version on "08/17/2017 02:11:15 PM"
     *                 
     ********************************************************************************/
    #ifndef __BASE64_H__
    #define __BASE64_H__
     
    #include <stdio.h> 
    #include <stdlib.h>
    #include <string.h>
    
    char* base64_encode(const char* data, int data_len); 
    char *base64_decode(const char* data, int data_len); 
    #endif
    
    
    


    测试server的方法

    下载浏览器websocket插件,我用chrome浏览器测试,具体操作可参考:




    展开全文
  • WebSocket协议是html5的一种通信协议,该协议兼容我们常用的浏览器。例如Chrome、 Firefox、IE等。它可以使客户端和服务端双向数据传输更加简单快捷,并且在TCP连接进行一次握手后,就可以持久性连接,同时允许...

    简述ws wss区别:
    WebSocket协议是html5的一种通信协议,该协议兼容我们常用的浏览器。例如Chrome、 Firefox、IE等。它可以使客户端和服务端双向数据传输更加简单快捷,并且在TCP连接进行一次握手后,就可以持久性连接,同时允许服务端对客户端推送数据。外加传统模式的协议一般HTTP请求可能会包含较长的头部,但真正有效的可能只有小部分,从而就占用了很多资源和带宽。因此WebSocket协议不仅可以实时通讯,支持扩展;也可以压缩节省服务器资源和带宽。 WS协议和WSS协议两个均是WebSocket协议的SCHEM,两者一个是非安全的,一个是安全的。也是统一的资源标志符。就好比HTTP协议和HTTPS协议的差别。非安全的没有证书,安全的需要SSL证书。(SSL是Netscape所研发,用来保障网络中数据传输的安全性,主要是运用数据加密的技术,能够避免数据在传输过程被不被窃取或者监听。)其中WSS表示在TLS之上的WebSocket。WS一般默认是80端口,而WSS默认是443端口,大多数网站用的就是80和433端口。(在高防防护过程中,80和433端口的网站是需要备案才可以接入国内的。)当然网站也会有别的端口,这种如果做高防是方案是可以用海外高防的。WS和WSS的体现形式分别是TCP+WS AS WS ,TCP+TLS+WS AS WS。服务器网址就是 URL。最后墨者安全再说下WebSocket协议的特点:建立在 TCP 协议之上,服务端实现容易;与 HTTP 协议有良好的兼容性,握手时不容易被屏蔽,可以通过各种 HTTP 代理服务器;数据轻量,实时通讯;可以发送文本和二进制数据。不限制同源,客户端可以与任意服务器端进行通讯。因此WebSocket协议的出现,为很多人解决了关于扩展以及兼容性协议的烦恼问题。

    环境:
    配置好ws ,监听端口自定义为626

    URL为:ws://192.168.1.1.115:626
    域名:ws://data.wanbo.cn:626
    

    配置wss:

    1. 安装openssl,配置https,开启https 443 配置好证书
    2. 打开ssl.conf,找到SSLEngine On,在下面添加如下
      ProxyPass / ws://data.wanbo.cn:626
      ProxyPassReverse / ws://data.wanbo.cn:626
    

    重启apache

    systemctl restart httpd
    

    测试js链接wss

    ws = new WebSocket("wss://data.wanbo.cn");
    
    展开全文
  • 用php写的websocket后台 socket accept函数已经成功接受到请求 可是前端调用了onerror函数 firefox浏览器报无法连接到ws:localhost……的错误 就是后台运行很正常 打开前端想试一试 就出错了 感觉是浏览器的问题 ...
  • windows运行正常但是linux下程序在浏览器控制台console报websocket is closed before the connection is established 原因: 连接socket时需要通过IP获取到对应主机的域名来进行连接,此过程会相当耗时 前端有一个...
  • websocket is closed.linux

    2020-12-18 11:35:05
    Websocket在windows/Mac系统环境下运行正常,项目采用Vue前后端分离,但是linux环境下下程序,在浏览器控制台console报websocket is closed before the connection is established; 解决方法: 1.linux控制台: ...
  • WebSocket Under Linux

    千次阅读 2016-05-02 23:15:30
    要实现一个WebSocket有很多方案,客户端方面可以用原生的WebSocket对象,也可以使用类似Socket.IO、jQuery Websocket Plugin这样的封装API,服务器端则可以使用Jetty(Java)、Netty(Java)、mod_pywebsocket
  • JAVA websocket实现linux日志...这里主要实现web浏览器端实时展现linux中的日志。废话不多说见代码 后台代码实现 引包 <!-- spring websocket--> <dependency> <groupId>javax.websocket&...
  • WebSocket读取linuxlog

    2019-06-26 22:18:37
    刚才在帖子上看到这篇文章觉得很简单,写websocket的,在这记录一下。 直接线程代码 后端 package cn.worboy.websocket; import javax.websocket.Session; import java.io.BufferedReader; import java.io....
  • websocket连接机制 一个典型的Websocket握手请求 提取客户端的Sec-Websocket-Accept的client_key 获取client_key 通过SHA-1 信息摘要计算 server_key SHA-1信息摘 base64 解码&编码 发送经过SHA-1信息摘...
  • websocket

    2021-05-22 14:34:58
    一.websocket是什么 关系图 1.和HTTP一样基于TCP传输数据,都是应用层协议 2.HTML5提供的全双工通信的协议,一开始的握手需要HTTP请求完成。而HTTP是单向协议。 二.为什么要用websocket 因为HTTP协议是非持久化、...
  • 说明 我是在 ... 这篇文章上的项目进行修改实现的,该文章附带文件代码,大家可以直接去下 ...用户点击摄像头,建立websocket,后台服务查询对应摄像头信息,进行推流到websocket,浏览器用jsmpeg拉流,展示给用户 ...
  • linux下安装并使用websocket

    千次阅读 2018-04-25 16:54:00
    websocket是HTML5开始提供的一种浏览器与服务器进行全双工通讯的网络技术,属于应用层协议。 它基于TCP传输协议,并复用HTTP的握手通道。 但是如果对于我们来说可以很简单的这样来理解: 1、它可以被用于浏览器 ...
  • Linux下编写C++服务器(Websocket服务器)

    千次阅读 2019-08-14 18:18:47
    WebSocket服务器比HTTP服务器要简单一些 利用asio进行WebSocket服务器的开发,asio现在还是比较轻便的。 下载asio mv /home/aubin/下载/asio-1.12.2.tar.gz /usr cd /usr/ tar -xzvf /usr/asio-1.12.2.tar.gz ...
  • 二、创建一个支持 WebSocket 的服务1、从pywebsocket下载mod_pywebsocket(亲git clone),地址在这里啦~,这里请注意,mod_pywebsocket需要python环境支持,mac和linux通常自带python环境,windows系统的同学需要...
  • nginx.conf内容添加如下内容 #自定义变量 $connection_upgrade map $http_upgrade $connection_upgrade { default keep-alive;... 'websocket' upgrade; #如果为websocket 则为 upgrade 可升级的。 } location /
  • 访问www.y1.com 启动了5个浏览器,登录了5个账号,分别是PHP、Java、Hadoop、Python、Spark Hadoop负载均衡到136服务器上: PHP、Spark负载均衡到137服务器上: Python、Java负载均衡到138服务器上: 到此位置,...
  • 前言最近需要做一个新功能,要求在浏览器可以看到服务器上的日志文件的内容,并且实时显示,也就是相当于要在浏览器实现Linux下的tail -f 的功能。 最开始的思路是使用Ajax定时向后端请求数据并进行展示,但是这样...
  • wssh 可以让我们通过 HTTP 来调用远程的一个 shell,也就是说我们可以用浏览器来访问某个 Linux 服务器/虚拟机的终端(只要这个服务器上运行了 wsshd 服务器端)。这样wssh 客户端通过 ssh 帐号连接到 wsshd 服务器端...
  • 二、使用步骤(此篇讲的是ws连接,若需要了解wss请看下篇文章)1.ws源代码2.Websocket握手报文3.实现样例总结 一、什么是websocketWebsocket是一个持久化的协议,相对于HTTP这种非持久的协议来说。简单的举个...
  • 本地启动连接websocket成功,部署到Linux服务器,请求websocket后跳转到登录页,发现是请求的session与登录session不一致的问题,各位大佬如何解决?
  • webSocket 读取linux日志,并显示到前端页面 刚才在帖子上看到这篇文章觉得很简单,写websocket的,在这记录一下。 直接线程代码 后端 package cn.worboy.websocket; import javax.websocket.Session; import java....
  • WebSocket解析

    千次阅读 2019-10-21 15:56:39
    websocket

空空如也

空空如也

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

linuxwebsocket浏览器

linux 订阅