在websocket上编写Oracle PL / SQL

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在websocket上编写Oracle PL / SQL相关的知识,希望对你有一定的参考价值。

我正在编写一个需要PL / SQL将消息发送到WebSocket的应用程序。目前,我正在使用UTL_TCP来连接WebSocket。

我的WebSocket服务器有不同类型的客户端,javascriptphp,JAVA,Oracle PL / SQL。我能够连接并将消息发送给除Oracle PL / SQL之外的所有其他消息。

任何建议表示赞赏,

这是我的PL / Sql代码。

DECLARE
CONN         UTL_TCP.CONNECTION;
RETVAL       BINARY_INTEGER;
L_RESPONSE   VARCHAR2(1000) := '';
L_TEXT  VARCHAR2(1000);    
content varchar2(4000) := '{"clientSession": "rmmd5kfcbv7i3h0jeel57a4o62","message": "Hi from oracle", "msgClient": "php"}';
BEGIN
 CONN := UTL_TCP.OPEN_CONNECTION(
    REMOTE_HOST   => '127.0.0.1',
    REMOTE_PORT   => 5050,
    TX_TIMEOUT    => 10,
    charset     => 'UTF-8'
);
 RETVAL := UTL_TCP.WRITE_LINE(CONN,'GET / HTTP/1.1');
RETVAL := UTL_TCP.WRITE_LINE(CONN,'Upgrade: websocket');
RETVAL := UTL_TCP.WRITE_LINE(CONN,'Connection: Upgrade');
RETVAL := UTL_TCP.WRITE_LINE(CONN,'Host: localhost');
RETVAL := UTL_TCP.WRITE_LINE(CONN,'Origin: localhost');
RETVAL := UTL_TCP.WRITE_LINE(CONN,'Sec-WebSocket-Key: TyPfhFqWTjuw8eDAxdY8xg==');
RETVAL := UTL_TCP.WRITE_LINE(CONN,'Sec-WebSocket-Version: 13');
RETVAL := UTL_TCP.WRITE_LINE(CONN,'Content-Type: application/json');
RETVAL := UTL_TCP.WRITE_LINE(CONN,'Content-Length: ' || length(content));
RETVAL := UTL_TCP.WRITE_LINE(CONN,'Content: ' || content);
RETVAL := UTL_TCP.WRITE_LINE(CONN, '{"clientSession": "plloua8kg6nuqg53l2sv7m6do2","message": "Hi from oracle", "msgClient": "ora"}');

RETVAL := UTL_TCP.WRITE_LINE(CONN);
UTL_TCP.FLUSH(CONN);

   DBMS_OUTPUT.PUT_LINE('Response from Socket Server : ' || L_RESPONSE);
UTL_TCP.CLOSE_CONNECTION(CONN);
EXCEPTION
WHEN OTHERS THEN
    RAISE_APPLICATION_ERROR(-20101,SQLERRM);
    UTL_TCP.CLOSE_CONNECTION(CONN);
 END;
答案

检查传输WebSocket协议的数据

例如:HEXTORAW('810568656C6C6F'):

81 - 数据开始的字节

05 - 文字长度“你好”

68656C6C6F - “你好”

当然,在关闭连接之前不要引发异常。

DECLARE
    CONN         UTL_TCP.CONNECTION;
    RETVAL       BINARY_INTEGER;
begin
    CONN := UTL_TCP.OPEN_CONNECTION(
        REMOTE_HOST   => '127.0.0.1',
        REMOTE_PORT   => 5050,
        TX_TIMEOUT    => 10,
        charset     => 'UTF-8'
    );
    RETVAL := UTL_TCP.WRITE_LINE(CONN,'GET / HTTP/1.1');
    RETVAL := UTL_TCP.WRITE_LINE(CONN,'Upgrade: websocket');
    RETVAL := UTL_TCP.WRITE_LINE(CONN,'Connection: Upgrade');
    RETVAL := UTL_TCP.WRITE_LINE(CONN,'Host: 127.0.0.1:5050');
    RETVAL := UTL_TCP.WRITE_LINE(CONN,'Origin: null');
    RETVAL := UTL_TCP.WRITE_LINE(CONN,'Sec-WebSocket-Key: TyPfhFqWTjuw8eDAxdY8xg==');
    RETVAL := UTL_TCP.WRITE_LINE(CONN,'Sec-WebSocket-Version: 13');
    RETVAL := UTL_TCP.WRITE_LINE(CONN);
    BEGIN
        LOOP
            DBMS_OUTPUT.PUT_LINE(UTL_TCP.GET_Line(conn, false));  -- read handshake result
        END LOOP;
    EXCEPTION
        WHEN others THEN NULL;
    END;
    RETVAL := UTL_TCP.WRITE_RAW(conn,HEXTORAW('810568656C6C6F'));
    UTL_TCP.FLUSH(CONN);
    UTL_TCP.CLOSE_CONNECTION(CONN);
EXCEPTION WHEN OTHERS THEN
    dbms_output.put_line( sqlerrm );
    UTL_TCP.CLOSE_CONNECTION(CONN);
end;

以上是关于在websocket上编写Oracle PL / SQL的主要内容,如果未能解决你的问题,请参考以下文章

ORACLE PL/SQL编程总结

Oracle数据库的存储过程怎么写?

Oracle PL/SQL的安装

《oracle每日一练》免安装Oracle客户端使用PL/SQL

有没办法在postgreSQL中查询oracle上的数据

oracle存储过程连续执行结果不同