2012-07-03 61 views
0

如何使用ASP.NET 4.0(C#)創建簡單的HTML5 Websockets應用程序。 我的問題是關於創建Websockets。以下是被試用的代碼...使用C#實現的ASP.NET HTML5 WebSockets

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-Version和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