質問編集履歴

1

追記

2020/08/03 01:06

投稿

tc_hiro
tc_hiro

スコア17

test CHANGED
File without changes
test CHANGED
@@ -291,3 +291,239 @@
291
291
  }
292
292
 
293
293
  ```
294
+
295
+
296
+
297
+
298
+
299
+ ###追記
300
+
301
+ 下記のとおりC#のソースを修正し、何度も接続することは可能になりました。
302
+
303
+ しかし、WebSocketを起動したままで
304
+
305
+ 一度webブラウザを閉じて再度開いて接続しようとしてもできません。
306
+
307
+ デバッグすると`var ret = await ws.ReceiveAsync(buff, CancellationToken.None);`で
308
+
309
+ 止まってしまっています。
310
+
311
+ 何かお分かりになる方、お教授お願いいたします。
312
+
313
+
314
+
315
+ ```
316
+
317
+ using System;
318
+
319
+ using System.Collections.Generic;
320
+
321
+ using System.Linq;
322
+
323
+ using System.Net;
324
+
325
+ using System.Net.WebSockets;
326
+
327
+ using System.Text;
328
+
329
+ using System.Threading;
330
+
331
+ using System.Threading.Tasks;
332
+
333
+ using System.Runtime.Serialization.Json;
334
+
335
+ using System.IO;
336
+
337
+
338
+
339
+ namespace webSocketServer
340
+
341
+ {
342
+
343
+ class Program
344
+
345
+ {
346
+
347
+ static void Main(string[] args)
348
+
349
+ {
350
+
351
+ Run();
352
+
353
+ Console.ReadKey();
354
+
355
+ }
356
+
357
+ static async Task Run()
358
+
359
+ {
360
+
361
+ HttpListener s = new HttpListener();
362
+
363
+ s.Prefixes.Add("http://xxxx/");
364
+
365
+ s.Start();
366
+
367
+ Console.WriteLine("サーバ起動");
368
+
369
+
370
+
371
+ while (true)
372
+
373
+ {
374
+
375
+ var hc = await s.GetContextAsync();
376
+
377
+
378
+
379
+ if (hc.Request.IsWebSocketRequest)
380
+
381
+ {
382
+
383
+ ProcessRequest(hc);
384
+
385
+
386
+
387
+ //クライアントからのリクエストがWebSocketでない場合は処理を中断
388
+
389
+ }
390
+
391
+ else {
392
+
393
+ hc.Response.StatusCode = 400;
394
+
395
+ hc.Response.Close();
396
+
397
+ return;
398
+
399
+ }
400
+
401
+ }
402
+
403
+ }
404
+
405
+
406
+
407
+ static async void ProcessRequest(HttpListenerContext hc)
408
+
409
+ {
410
+
411
+ //WebSocketでレスポンスを返却
412
+
413
+ var wsc = await hc.AcceptWebSocketAsync(null);
414
+
415
+ var ws = wsc.WebSocket;
416
+
417
+
418
+
419
+ var response = "";
420
+
421
+
422
+
423
+ /// WebSocketの送受信ループ
424
+
425
+ while (ws.State == WebSocketState.Open)
426
+
427
+ {
428
+
429
+ try
430
+
431
+ {
432
+
433
+ var buff = new ArraySegment<byte>(new byte[1024]);
434
+
435
+
436
+
437
+ /// 受信待機
438
+
439
+ var ret = await ws.ReceiveAsync(buff, CancellationToken.None);
440
+
441
+
442
+
443
+ Console.WriteLine("受信");
444
+
445
+
446
+
447
+ /// テキスト
448
+
449
+ if (ret.MessageType == WebSocketMessageType.Text)
450
+
451
+ {
452
+
453
+ response = Encoding.UTF8.GetString(buff.Take(ret.Count).ToArray());
454
+
455
+ Console.WriteLine(response);
456
+
457
+
458
+
459
+ var serializer = new DataContractJsonSerializer(typeof(ReceiveData));
460
+
461
+ var ms = new MemoryStream(Encoding.UTF8.GetBytes(response));
462
+
463
+ var JsRes = (ReceiveData)serializer.ReadObject(ms);
464
+
465
+ ms.Close();
466
+
467
+
468
+
469
+ response = JsRes.item;
470
+
471
+
472
+
473
+ //文字列をByte型に変換
474
+
475
+ var buffer = Encoding.UTF8.GetBytes(response);
476
+
477
+ var segment = new ArraySegment<byte>(buffer);
478
+
479
+
480
+
481
+ //クライアント側に文字列を送信
482
+
483
+ await ws.SendAsync(segment, WebSocketMessageType.Text, true, CancellationToken.None);
484
+
485
+ Console.WriteLine(segment);
486
+
487
+ }
488
+
489
+ else if (ret.MessageType == WebSocketMessageType.Close) /// クローズ
490
+
491
+ {
492
+
493
+ Console.WriteLine("クローズ要求");
494
+
495
+ }
496
+
497
+ }
498
+
499
+ catch
500
+
501
+ {
502
+
503
+ /// 例外 クライアントが異常終了
504
+
505
+ Console.WriteLine("異常終了");
506
+
507
+ break;
508
+
509
+ }
510
+
511
+ }
512
+
513
+ }
514
+
515
+ }
516
+
517
+ public class ReceiveData
518
+
519
+ {
520
+
521
+ public string item { get; set; }
522
+
523
+ public int cnt { get; set; }
524
+
525
+ }
526
+
527
+ }
528
+
529
+ ```