在websocket上编写Oracle PL / SQL
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在websocket上编写Oracle PL / SQL相关的知识,希望对你有一定的参考价值。
我正在编写一个需要PL / SQL将消息发送到WebSocket的应用程序。目前,我正在使用UTL_TCP来连接WebSocket。
我的WebSocket服务器有不同类型的客户端,javascript,php,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的主要内容,如果未能解决你的问题,请参考以下文章