質問編集履歴
1
追記
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
|
```
|