teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

追記

2020/08/03 01:06

投稿

tc_hiro
tc_hiro

スコア17

title CHANGED
File without changes
body CHANGED
@@ -144,4 +144,122 @@
144
144
  public int cnt { get; set; }
145
145
  }
146
146
  }
147
+ ```
148
+
149
+
150
+ ###追記
151
+ 下記のとおりC#のソースを修正し、何度も接続することは可能になりました。
152
+ しかし、WebSocketを起動したままで
153
+ 一度webブラウザを閉じて再度開いて接続しようとしてもできません。
154
+ デバッグすると`var ret = await ws.ReceiveAsync(buff, CancellationToken.None);`で
155
+ 止まってしまっています。
156
+ 何かお分かりになる方、お教授お願いいたします。
157
+
158
+ ```
159
+ using System;
160
+ using System.Collections.Generic;
161
+ using System.Linq;
162
+ using System.Net;
163
+ using System.Net.WebSockets;
164
+ using System.Text;
165
+ using System.Threading;
166
+ using System.Threading.Tasks;
167
+ using System.Runtime.Serialization.Json;
168
+ using System.IO;
169
+
170
+ namespace webSocketServer
171
+ {
172
+ class Program
173
+ {
174
+ static void Main(string[] args)
175
+ {
176
+ Run();
177
+ Console.ReadKey();
178
+ }
179
+ static async Task Run()
180
+ {
181
+ HttpListener s = new HttpListener();
182
+ s.Prefixes.Add("http://xxxx/");
183
+ s.Start();
184
+ Console.WriteLine("サーバ起動");
185
+
186
+ while (true)
187
+ {
188
+ var hc = await s.GetContextAsync();
189
+
190
+ if (hc.Request.IsWebSocketRequest)
191
+ {
192
+ ProcessRequest(hc);
193
+
194
+ //クライアントからのリクエストがWebSocketでない場合は処理を中断
195
+ }
196
+ else {
197
+ hc.Response.StatusCode = 400;
198
+ hc.Response.Close();
199
+ return;
200
+ }
201
+ }
202
+ }
203
+
204
+ static async void ProcessRequest(HttpListenerContext hc)
205
+ {
206
+ //WebSocketでレスポンスを返却
207
+ var wsc = await hc.AcceptWebSocketAsync(null);
208
+ var ws = wsc.WebSocket;
209
+
210
+ var response = "";
211
+
212
+ /// WebSocketの送受信ループ
213
+ while (ws.State == WebSocketState.Open)
214
+ {
215
+ try
216
+ {
217
+ var buff = new ArraySegment<byte>(new byte[1024]);
218
+
219
+ /// 受信待機
220
+ var ret = await ws.ReceiveAsync(buff, CancellationToken.None);
221
+
222
+ Console.WriteLine("受信");
223
+
224
+ /// テキスト
225
+ if (ret.MessageType == WebSocketMessageType.Text)
226
+ {
227
+ response = Encoding.UTF8.GetString(buff.Take(ret.Count).ToArray());
228
+ Console.WriteLine(response);
229
+
230
+ var serializer = new DataContractJsonSerializer(typeof(ReceiveData));
231
+ var ms = new MemoryStream(Encoding.UTF8.GetBytes(response));
232
+ var JsRes = (ReceiveData)serializer.ReadObject(ms);
233
+ ms.Close();
234
+
235
+ response = JsRes.item;
236
+
237
+ //文字列をByte型に変換
238
+ var buffer = Encoding.UTF8.GetBytes(response);
239
+ var segment = new ArraySegment<byte>(buffer);
240
+
241
+ //クライアント側に文字列を送信
242
+ await ws.SendAsync(segment, WebSocketMessageType.Text, true, CancellationToken.None);
243
+ Console.WriteLine(segment);
244
+ }
245
+ else if (ret.MessageType == WebSocketMessageType.Close) /// クローズ
246
+ {
247
+ Console.WriteLine("クローズ要求");
248
+ }
249
+ }
250
+ catch
251
+ {
252
+ /// 例外 クライアントが異常終了
253
+ Console.WriteLine("異常終了");
254
+ break;
255
+ }
256
+ }
257
+ }
258
+ }
259
+ public class ReceiveData
260
+ {
261
+ public string item { get; set; }
262
+ public int cnt { get; set; }
263
+ }
264
+ }
147
265
  ```