从Delphi(交易平台)连接到websocket wss:// URL

时间:2016-02-24 17:42:41

标签: delphi websocket

我正在尝试使用websocket连接到Binary.com(二进制交易平台)服务器。他们的API指南(在https://developers.binary.com/demos/中显示)没有任何Delphi示例。我试过使用像websockets.esegece.com和http://github.com/andremussche/DelphiWebsockets这样的库,但是我没有任何线索,即使在我阅读手册和示例之后它们是如何工作的。一些例子展示了如何创建一个websocket服务器和客户端并且它可以工作,但我从来没有成功连接到Binary.com服务器。例如,当使用andremussche的库时,我不知道如何使用wss协议和sgc的库连接,我一直得到Socket Error 10054。

以下是一些使用JavaScript和C#的示例API,这些API来自他们的网站

var ws = new WebSocket('wss://ws.binaryws.com/websockets/v3');

ws.onopen = function(evt) {
    ws.send(JSON.stringify({ticks:'R_100'}));
};

ws.onmessage = function(msg) {
   var data = JSON.parse(msg.data);
   console.log('ticks update: %o', data);
};
using System;
using System.Text;
using System.Threading.Tasks;
using System.Net.WebSockets;
using System.Threading;
using System.Net;

namespace ConsoleApp
{
    class Program
    {
        static async Task SendTicksRequest()
        {
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11;
            var ws = new ClientWebSocket();
            var uri = new Uri("wss://ws.binaryws.com/websockets/v3");

            await ws.ConnectAsync(uri, CancellationToken.None);

            var reqAsBytes = Encoding.UTF8.GetBytes("{\"ticks\":\"R_100\"}");
            var ticksRequest = new ArraySegment<byte>(reqAsBytes);

            await ws.SendAsync(ticksRequest,
                WebSocketMessageType.Text,
                true,
                CancellationToken.None);

            var buffer = new ArraySegment<byte>(new byte[1024]);
            var result = await ws.ReceiveAsync(buffer, CancellationToken.None);

            string response = Encoding.UTF8.GetString(buffer.Array, 0, result.Count);
            Console.WriteLine(response);
        }

        static void Main(string[] args)
        {
            SendTicksRequest();
            Console.ReadLine();
        }
    }
}

有人知道如何使用Delphi获得相同的结果,我应该使用哪个库?任何帮助将不胜感激,谢谢。

回答@Ken White,我的代码使用andremussche的库无效

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses IdHTTPWebsocketClient;

var client: TIdHTTPWebsocketClient;

procedure TForm1.Button1Click(Sender: TObject);
begin
  client := TIdHTTPWebsocketClient.Create(Self);
  client.Port := 443;
  client.Host := 'ws.binaryws.com';
  client.Connect;
  client.UpgradeToWebsocket;
end;

end.

它说HTTP Bad Request,似乎是用HTTP协议发出的请求,而不是WSS。我也不知道用什么属性来写URL路径。

我也试试这段代码

procedure TForm1.Button1Click(Sender: TObject);
var strm: TMemoryStream;
begin
  client := TIdHTTPWebsocketClient.Create(Self);
  client.Port := 443;
  client.Host := 'ws.binaryws.com';
  client.SocketIOCompatible := False;
  strm := TMemoryStream.Create;
  client.Get('wss://ws.binaryws.com/websockets/v3', strm);
end;

它说未知协议,那我该怎么办?

0 个答案:

没有答案