2012-07-03 2 views
0

ASP.NET 4.0 (C#)을 사용하여 간단한 HTML5 웹 소켓 응용 프로그램을 만드는 방법. 내 문제는 웹 소켓을 만드는 것입니다. 아래 코드는 시도한 코드입니다 ...ASP.NET HTML5 WebSockets with 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 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> 

을 onloading 계속 ..! 친절하게 저에게 해결책을 제공해주십시오 .... 미리 감사드립니다 ....

+1

실제로 질문에 답변하지는 않지만 [SignalR] (http : //signalr.net)? 나는 그것이 WebSocket 통신을 지원하고 그것이 당신을 위해 배관을 감쌀 수도 있다는 것을 믿는다. –

+0

그는 .NET 4.0을 요구한다 ... SignalR은 websocket을 위해 4.5와 IIS8을 필요로한다. –

답변

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을 사용할 수 있습니다.