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 { //ハンドシェイクじゃない } } } } } } }
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。