質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

2626閲覧

C#でGMOコインのPublic Websocket API のorderbooksを動作させてみたい。

hemuhemu777

総合スコア12

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2020/02/12 04:27

前提・実現したいこと

C#でGMO CoinのPublic Websocket API のorderbooksを動作させてみたい。

https://api.coin.z.com/docs/?csharp#ws-orderbooks

発生している問題・エラーメッセージ

サンプルソースを動作させたところ、応答データのresultが1024文字で見切れる。応答データを見切れずに取得したい。 応答例: {"channel":"orderbooks","asks":[{"price":"1132560","size":"5.03"},{"price":"1132590","size":"5.59"},{"price":"1132600","size":"5"},{"price":"1132640","size":"0.08"},{"price":"1132720","size":"0.04"},{"price":"1132750","size":"0.1"},{"price":"1132770","size":"0.01"},{"price":"1132790","size":"0.05"},{"price":"1132847","size":"0.02"},{"price":"1132900","size":"0.01"},{"price":"1132965","size":"0.38"},{"price":"1133000","size":"5.21"},{"price":"1133130","size":"1"},{"price":"1133140","size":"0.12"},{"price":"1133207","size":"0.21"},{"price":"1133221","size":"0.3"},{"price":"1133225","size":"0.1"},{"price":"1133235","size":"0.1"},{"price":"1133320","size":"0.04"},{"price":"1133350","size":"1.06"},{"price":"1133400","size":"5"},{"price":"1133499","size":"0.01"},{"price":"1133500","size":"0.21"},{"price":"1133551","size":"0.2"},{"price":"1133564","size":"0.25"},{"price":"1133610","size":"2"},{"price":"1133632","size":"0.01"},{"price":"1133640","size":"4.3"},{"price":"1133667","size":"0.06"},{"price":"1133700","size

該当のソースコード

C#

1 2Request example: 3 4using System; 5using System.Net.WebSockets; 6using System.Text; 7using System.Threading; 8using System.Threading.Tasks; 9 10class Example 11{ 12 public static void Main(string[] args) 13 { 14 var task = Orderbooks(); 15 task.Wait(); 16 } 17 18 static async Task Orderbooks() 19 { 20 const string endpoint = "wss://api.coin.z.com/ws/public/v1"; 21 const string message = "{ \"command\" : \"subscribe\", \"channel\": \"orderbooks\", \"symbol\": \"BTC\" }"; 22 using (var client = new ClientWebSocket()) 23 { 24 await client.ConnectAsync(new Uri(endpoint), CancellationToken.None); 25 26 var messageBytes = Encoding.UTF8.GetBytes(message); 27 await client.SendAsync(new ArraySegment<byte>(messageBytes), WebSocketMessageType.Text, true, 28 CancellationToken.None); 29 30 while (client.State == WebSocketState.Open) 31 { 32 var incomingData = new byte[1024]; 33 var result = await client.ReceiveAsync(new ArraySegment<byte>(incomingData), CancellationToken.None); 34 Console.WriteLine(Encoding.UTF8.GetString(incomingData, 0, result.Count)); 35 } 36 } 37 } 38}

試したこと

var incomingData = new byte[1024];→var incomingData = new byte[2056];に変更したところ、2056文字の応答になりましたがデータは見切れてました。そのため、[10240]に変更したら、1024文字の応答で、データは見切れたままです。

補足情報(FW/ツールのバージョンなど)

Microsoft Visual Studio Professional 2017
Version 15.9.17
VisualStudio.15.Release/15.9.17+28307.905
Microsoft .NET Framework
Version 4.8.03761

インストールされているバージョン:Professional

C# ツール 2.10.0-beta2-63501-03+b9fb1610c87cccc8ceb74a770dba261a58e39c4a
C# コンポーネントが IDE で使用されました。プロジェクト タイプと設定に応じて、異なるバージョンのコンパイラを使用できます。

Common Azure Tools 1.10
Provides common services for use by Azure Mobile Services and Microsoft Azure Tools.

NuGet パッケージ マネージャー 4.6.0
Visual Studio 内の NuGet パッケージ マネージャー。NuGet の詳細については、http://docs.nuget.org/ にアクセスしてください。

ProjectServicesPackage Extension 1.0
ProjectServicesPackage Visual Studio Extension Detailed Info

ResourcePackage 拡張機能 1.0
Visual Studio の拡張機能 ResourcePackage に関する詳細情報

ResourcePackage 拡張機能 1.0
Visual Studio の拡張機能 ResourcePackage に関する詳細情報

Visual Basic ツール 2.10.0-beta2-63501-03+b9fb1610c87cccc8ceb74a770dba261a58e39c4a
Visual Basic コンポーネントが IDE で使用されました。プロジェクト タイプと設定に応じて、異なるバージョンのコンパイラを使用できます。

Visual Studio Code デバッグ アダプターのホスト パッケージ 1.0
Visual Studio Code デバッグ アダプターを Visual Studio でホストするための相互運用レイヤー

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんにちは。

提示のサンプルコードは1024バイトごとに改行が挟まる設計になっていますが、見切れではなくきちんと全てのデータが取れています。

WebSocket はあなたが思っているより低レイヤの API なので、受信したデータを正しくメッセージ単位で扱いたいなら、データの終端処理なども自分でやらないとダメです。
ReceiveAsync の result が EndOfMessage プロパティを持っているので、これが true になるまでデータを取得し続け、最後に結合するような処理を行うことが多いです。

雑な実装例を出すとこんな感じです。効率は良くないですが。

csharp

1while (client.State == WebSocketState.Open) 2{ 3 var incomingData = new List<string>(); 4 var buffer = new byte[1024]; 5 while (true) 6 { 7 var result = await client.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None); 8 incomingData.Add(Encoding.UTF8.GetString(buffer, 0, result.Count)); 9 if (result.EndOfMessage) 10 break; 11 } 12 Console.WriteLine(string.Concat(incomingData)); 13} 14

投稿2020/02/12 05:15

tamoto

総合スコア4252

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hemuhemu777

2020/02/12 12:23

ありがとうございました。サンプルもつけていただき助かります。無事解決いたしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問