2012-07-03 2 views
0

Как создать простое приложение Websockets HTML5 с использованием ASP.NET 4.0 (C#). Моя проблема заключается в создании веб-узлов. Ниже приведен код, который пытался ...ASP.NET HTML5 WebSockets с реализацией C#

try 
{ 
    var listener = new TcpListener(IPAddress.Loopback, 9988); 
    listener.Start();     
    using (var client = listener.AcceptTcpClient()) 
    using (var stream = client.GetStream()) 
    using (var reader = new StreamReader(stream)) 
    using (var writer = new StreamWriter(stream)) 
    { 
     writer.WriteLine("HTTP/1.1 101 Web Socket Protocol Handshake"); 
     writer.WriteLine("Upgrade: WebSocket"); 
     writer.WriteLine("Connection: Upgrade"); 
     writer.WriteLine("WebSocket-Origin: http://localhost:9988"); 
     writer.WriteLine("WebSocket-Location: ws://localhost:8181/websession"); 
     writer.WriteLine(""); 
    } 
    listener.Stop(); 
} 
catch (Exception ex) 
{ 
    ClientScript.RegisterClientScriptBlock(this.GetType(), "", ex.Message); 
} 

И HTML код следующим образом ...!

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head id="Head1" runat="server"> 
    <title></title> 
    <script type="text/javascript"> 
     var status = ''; 
     function conStatus(state) { 
      return (state == 0) ? 'Connecting..!' : (state == 1) ? 'Opened..!' : (state == 2) ? 'Closing..!' : 'Closed..!'; 
     } 
     function WebSocketTest() { 
      if ("WebSocket" in window) { 
       try { 
        debugger; 
        var connection = new WebSocket('ws://localhost:9988'); 
        status += '<br/>Socket Status: ' + conStatus(connection.readyState); 

        connection.onopen = function() { 
         status += 'Socket Opened..!'; 
        }; 

        connection.onmessage = function() { 
         status += 'Socket received a message..!'; 
        }; 
        connection.onclose = function() { 
         status += 'Socket Closed..!'; 
        }; 
        connection.send('Hello World..!'); 
       } 
       catch (exception) { 
        status += '<br/>EXCEPTION: ' + exception; 
       } 
      } 
      else { 
       status += "Your Browser does not support WebSockets...!" 
      } 
      document.write(status); 
     } 
    </script> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div id="sse"> 
     <a href="javascript:WebSocketTest()">Run WebSocket</a> 
    </div> 
    <div id="status"> 
    </div> 
    </form> 
</body> 
</html> 

Если я запустил этот файл, страница продолжает загружаться .. я не вижу никакого результата ..! Просьба предоставить мне решение .... Спасибо заранее.

+1

Не отвечайте на свой вопрос, но вы [SignalR] (http: //signalr.net)? Я верю, что он поддерживает связь с WebSocket и может обернуть для вас сантехнику –

+0

он просит .NET 4.0 ... SignalR требует 4.5 и IIS8 для websocket –

ответ

1

Вам нужно внести несколько изменений на свой сервер. Лучше всего начать с чтения раздела handshaking спецификации. Как минимум, вам нужно добавить заголовок Sec-WebSocket-Accept для ответа. Вы также можете рассмотреть возможность проверки Sec-WebSocket-версии и Sec-WebSocket-Protocol в запросе клиента.

После этого у вас должен быть сервер, который завершит свое рукопожатие, а затем немедленно закроет его соединение. Вы должны постоянно поддерживать постоянный клиент tcp, закрывая его только тогда, когда клиент закрывает или запрашивает закрыть или сервер хочет завершить работу.

Вам также потребуется обновить код клиента. Первоначальное рукопожатие, запрошенное new WebSocket(...), является асинхронным. Вы не можете использовать переменную подключения до тех пор, пока не будет выполнен обратный вызов onopen (поэтому переместите туда линию connection.send('Hello World..!')).

После этого вы должны прочитать раздел спецификаций data framing, чтобы узнать, как отправлять/получать сообщения.

Это добавляет разумный кусок работы. Возможно, вам будет проще использовать существующий сервер с открытым исходным кодом. Я не использовал его сам, но Fleck, кажется, хорошо расценен и выглядит так, как будто он должен быть простым в использовании.

1

Websocket Реализация требует больше, чем просто TcpListener. Вы можете попробовать PokeIn, чтобы иметь поддержку WebSocket на всех платформах, или вы можете просто обновить свое решение до ASP.NET 4.5 и придерживаться IIS 8

Смежные вопросы