我正在尝试使用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;
它说未知协议,那我该怎么办?