2013-11-18 2 views
2

Я написал простой WebSocketServer, который я узнал на веб-сайте MSDN. Но это не сработает. Можете ли вы объяснить мне, как мне следует запускать этот простой проект, потому что я его запускаю, но ничего не произошло.WebSocketServer MSDN Пример

Сервер

namespace WebSocketServer 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 
     var task1 = Run(); 
     // Console.ReadLine(); 
    } 
    public static async Task Run() 
    { 
     HttpListener s = new HttpListener(); 
     s.Prefixes.Add("http://localhost:8000/ws"); 
     s.Start(); 

     var hc = await s.GetContextAsync(); 
     if (!hc.Request.IsWebSocketRequest) 
     { 
      hc.Response.StatusCode = 400; 
      hc.Response.Close(); 
      return; 
     } 
     var wsc = await hc.AcceptWebSocketAsync(null); 
     var ws = wsc.WebSocket; 

     for (int i = 0; i != 10; ++i) 
     { 
      // await Task.Delay(20); 
      var time = DateTime.Now.ToLongTimeString(); 
      var buffer = Encoding.UTF8.GetBytes(time); 
      var segment = new ArraySegment<byte>(buffer); 
      await ws.SendAsync(segment, System.Net.WebSockets.WebSocketMessageType.Text, true, CancellationToken.None); 
     } 
     await ws.CloseAsync(WebSocketCloseStatus.NormalClosure, "Done", CancellationToken.None); 
    } 
} 

}

Клиент

namespace WebSocketClient 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 
     var clientTask1 = Client(); 
     Console.ReadLine(); 
    } 

    static async Task Client() 
    { 
     ClientWebSocket ws = new ClientWebSocket(); 
     var uri = new Uri("ws://localhost:8000/ws/"); 

     await ws.ConnectAsync(uri, CancellationToken.None); 
     var buffer = new byte[1024]; 
     while (true) 
     { 
      var segment = new ArraySegment<byte>(buffer); 

      var result = await ws.ReceiveAsync(segment, CancellationToken.None); 

      if (result.MessageType == WebSocketMessageType.Close) 
      { 
       await ws.CloseAsync(WebSocketCloseStatus.InvalidMessageType, "I don't do binary", CancellationToken.None); 
       return; 
      } 

      int count = result.Count; 
      while (!result.EndOfMessage) 
      { 
       if (count >= buffer.Length) 
       { 
        await ws.CloseAsync(WebSocketCloseStatus.InvalidPayloadData, "That's too long", CancellationToken.None); 
        return; 
       } 

       segment = new ArraySegment<byte>(buffer, count, buffer.Length - count); 
       result = await ws.ReceiveAsync(segment, CancellationToken.None); 
       count += result.Count; 
      } 

      var message = Encoding.UTF8.GetString(buffer, 0, count); 
      Console.WriteLine(">" + message); 
     } 

    } 
} 
} 

И мне нужно, чтобы создать простой веб-сайт, который будет принимать некоторые данные (например Time) от WebSocketServer и показать его на этой странице. Я написал код, но ничего не происходит

<html> 
<body> 
<script type ="text/javascript"> 

var ws = new WebSocket("ws://localhost:8000/ws/"); 
ws.onmessage = function (args) 
{ 
    var time = args.data; 
}; 

</script> 
</body> 
</html> 
+1

В какой операционной системе вы используете? (HTTP.SYS, требуемый для веб-сокетов, - это win-8 вверх и похожие серверные версии) И: вы работаете как admin? (обратите внимание: вам не нужно запускать такой сервер, как администратор, но это быстрый способ проверить, что это не проблема ACL доступа к портам, так как учетная запись администратора автоматически имеет доступ) –

+0

Я использую 7 (((Могу ли я использовать WebSockets в Windows 7? –

+0

да, вы можете - это просто TCP, однако, не используя реализацию MS, к сожалению: «Однако единственные публичные реализации клиентских и серверных WebSockets поддерживаются в Windows 8 и Windows Server 2012. « –

ответ

7

На сервере, Run является async метод; он вернется к вызывающему абоненту , как только достигнет первого await, для которого результат еще не завершен. Это означает, что ваш сервер выйдет из Main, и в отсутствие каких-либо других первичных (нерабочих) потоков ваш сервер завершит. Console.ReadLine был там по какой-то причине. Верните его:

static void Main(string[] args) 
{ 
    var task1 = Run(); 
    Console.WriteLine("Press return to exit the server"); 
    Console.ReadLine(); 
} 
Смежные вопросы