🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

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

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

WebSocket

WebSocketとは双方向・全二重コミュニケーションのためのAPIでありプロトコルのことを指します。WebSocketはHTML5に密接に結びついており、多くのウェブブラウザの最新版に導入されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Chrome extension

Chrome拡張機能

Q&A

解決済

2回答

3272閲覧

C#のTcpListenerでChrome拡張機能からjsonを受け取る方法

yonotsui

総合スコア28

C#

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

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

WebSocket

WebSocketとは双方向・全二重コミュニケーションのためのAPIでありプロトコルのことを指します。WebSocketはHTML5に密接に結びついており、多くのウェブブラウザの最新版に導入されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Chrome extension

Chrome拡張機能

0グッド

0クリップ

投稿2020/12/17 16:48

C#のTcpListenerでChrome拡張機能からjsonを受け取るにはどうすればいいのでしょうか。
javascriptでWebSocketのsendでjsonを渡そうとしているのですが、文字化けして解析できません。
デシリアライズする必要があるとは思うのですが、デシリアライズの方法がわかりません。
どうすればjsonを渡せるのでしょうか。

javascriptのコード

class SendData { name=""; price=0; } var sendData=new SendData(); sendData.name="aiueo"; sendData.price=1500; var socket=new WebSocket("ws://localhost:6889") socket.onopen = function() { try { var traceJson=JSON.stringify(sendData); socket.send(traceJson); var test=0; } catch(exception) { console.log(exception); } // socket.close(); };

C#のコード

//サーバーを立てる public static async Task ServerTest() { //Listenするポート番号 int port = 6889; //TcpListenerオブジェクトを作成する System.Net.Sockets.TcpListener listener = new System.Net.Sockets.TcpListener(System.Net.IPAddress.IPv6Any, port); //IPv6Onlyを0にする listener.Server.SetSocketOption( System.Net.Sockets.SocketOptionLevel.IPv6, System.Net.Sockets.SocketOptionName.IPv6Only, 0); //Listenを開始する listener.Start(); Console.WriteLine("Listenを開始しました({0}:{1})。", ((System.Net.IPEndPoint)listener.LocalEndpoint).Address, ((System.Net.IPEndPoint)listener.LocalEndpoint).Port); for (; ; ) { var tcpClient = await listener.AcceptTcpClientAsync(); var dustTask = Task.Run(() => LisTest(tcpClient)); } } static async Task LisTest(System.Net.Sockets.TcpClient tcpClient) { using (var stream = tcpClient.GetStream()) { using (var reader = new StreamReader(stream)) { using (var writer = new BinaryWriter(stream)) { int ReadSplitLineth = 1024; int splitLength = ReadSplitLineth; using (var ms = new MemoryStream(splitLength)) { var resBytes = new byte[splitLength]; int numBytesRead; for (; ; ) { numBytesRead = await stream.ReadAsync(resBytes, 0, resBytes.Length).ConfigureAwait(false); if (numBytesRead > 0) { ms.Write(resBytes, 0, numBytesRead); if (numBytesRead == splitLength) { continue; } } else { //clientが閉じた return; } var lastIdx = Enumerable.Range(0, resBytes.Length).LastOrDefault(idx => { return resBytes[idx] != '\0'; }); resBytes = resBytes.Length == lastIdx + 1 ? resBytes : resBytes.Remove(lastIdx + 1); var byteText = Encoding.UTF8.GetString(resBytes); if (byteText.IndexOf("GET", StringComparison.OrdinalIgnoreCase) == 0) { //ハンドシェイクのレスポンスを返す const string eol = "\r\n"; // HTTP/1.1 defines the sequence CR LF as the end-of-line marker Byte[] response = Encoding.UTF8.GetBytes("HTTP/1.1 101 Switching Protocols" + eol + "Connection: Upgrade" + eol + "Upgrade: websocket" + eol + "Sec-WebSocket-Accept: " + Convert.ToBase64String( System.Security.Cryptography.SHA1.Create().ComputeHash( Encoding.UTF8.GetBytes( new System.Text.RegularExpressions.Regex("Sec-WebSocket-Key: (.*)").Match(byteText).Groups[1].Value.Trim() + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" ) ) ) + eol + eol); stream.Write(response, 0, response.Length); //データ受け取り using (var ms2 = new MemoryStream(splitLength)) { for (; ; ) { numBytesRead = await stream.ReadAsync(resBytes, 0, resBytes.Length).ConfigureAwait(false); if (numBytesRead > 0) { ms2.Write(resBytes, 0, numBytesRead); if (numBytesRead == splitLength) { continue; } } else { //clientが閉じた return; } //json受け取ったはずだがどうエンコードしても文字化けしている resBytes = resBytes.Length == lastIdx + 1 ? resBytes : resBytes.Remove(lastIdx + 1); var texts = new string[] { (Encoding.ASCII.GetString(resBytes)), (Encoding.UTF7.GetString(resBytes)), (Encoding.Unicode.GetString(resBytes)), (Encoding.Default.GetString(resBytes)), (Encoding.ASCII.GetString(resBytes)), (Encoding.UTF8.GetString(resBytes)), (Encoding.UTF32.GetString(resBytes)), (Encoding.GetEncoding("Shift_JIS").GetString(resBytes)), }; } } } else { //ハンドシェイクじゃない } } } } } } }

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

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

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

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

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

guest

回答2

0

自己解決

TcpListenerで解決する方法が見つからなかったのでHttpListnerでもう一つWebSocket用のサーバーを作成して運用することにしました

public static async Task Run() { //Httpリスナーを立ち上げ、クライアントからの接続を待つ HttpListener s = new HttpListener(); s.Prefixes.Add("http://localhost:8000/"); s.Start(); var hc = await s.GetContextAsync(); //クライアントからのリクエストがWebSocketでない場合は処理を中断 if (!hc.Request.IsWebSocketRequest) { //クライアント側にエラー(400)を返却し接続を閉じる hc.Response.StatusCode = 400; hc.Response.Close(); return; } //WebSocketでレスポンスを返却 var wsc = await hc.AcceptWebSocketAsync(null); var ws = wsc.WebSocket; /// WebSocketの送受信ループ const int splitLength = 1024; using (var ms = new MemoryStream(splitLength)) { for (; ; ) { if (ws.State != WebSocketState.Open) { return; } try { var buff = new ArraySegment<byte>(new byte[splitLength]); var ret = await ws.ReceiveAsync(buff, System.Threading.CancellationToken.None); if (ret.MessageType != WebSocketMessageType.Text) { return; } ms.Write(buff.Array, 0, buff.Count); if (buff.Count < splitLength) { break; } if (ret.EndOfMessage ) { break; } } catch { //クライアントが閉じた Console.WriteLine("{0}:Session Abort:{1}", DateTime.Now.ToString(), hc.Request.RemoteEndPoint.Address.ToString()); return; } } //ここでms.GetBuffer()をjsonに変換 } //接続を閉じる await ws.CloseAsync(WebSocketCloseStatus.NormalClosure, "Done", CancellationToken.None); }

投稿2020/12/18 15:12

yonotsui

総合スコア28

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

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

0

受信したメッセージを一旦デコードする必要があるみたいですが。
C# で WebSocket サーバーを記述する - メッセージのデコード

NugetをWebSocketで検索するとライブラリが色々HITするので、それらを使った方が楽出来そうな気はします。

投稿2020/12/18 00:25

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問