SORU
6 ŞUBAT 2010, CUMARTESİ


Websocket sunucusu: web yuvada onopen işlevi asla denir

# Web C soket, bir sunucu, ama bana biraz sıkıyor onun uygulanması için çalışıyorum. Javascript ile ana sayfa için bir Web sunucusu(ASP.NET) koşuyorum ve web soket sunucu olarak uygulanır C# uygulama. konsol

İstemci (chrome javascript çalıştıran) bağlantı girişimi tespit edebilir ve aynı zamanda istemciden el sıkışma almak için geldim. Ama istemci (web soket onopen işlevi asla çağrılmaz) gönderiyorum karşılıklı kabul etmiyor.

The Web Socket protocol okudum ve neyi yanlış yaptığımı göremiyorum. İşte sunucu kodu biraz:

Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
IPEndPoint ep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8181);
listener.Bind(ep);
listener.Listen(100);
Console.WriteLine("Wainting for connection...");
Socket socketForClient = listener.Accept();
if (socketForClient.Connected)
{
    Console.WriteLine("Client connected");
    NetworkStream networkStream = new NetworkStream(socketForClient);
    System.IO.StreamWriter streamWriter = new System.IO.StreamWriter(networkStream);
    System.IO.StreamReader streamReader = new System.IO.StreamReader(networkStream);

    //read handshake from client:
    Console.WriteLine("HANDSHAKING...");
    char[] shake = new char[255];
    streamReader.Read(shake, 0, 255);

    string handshake =
       "HTTP/1.1 101 Web Socket Protocol Handshake\r\n"  
       "Upgrade: WebSocket\r\n"  
       "Connection: Upgrade\r\n"  
       "WebSocket-Origin: http://localhost:8080\r\n"  
       "WebSocket-Location: ws://localhost:8181\r\n"  
       "\r\n";

    streamWriter.Write(handshake);
    streamWriter.Flush();

Port 8080 ve port web soket sunucu üzerinde web server için koşuyorum 8181, benim localhost üzerinde.

Farklı kodlamalar el sıkışması (ASCII ve Hex bayt) göndermeye çalıştım ama bu bir fark yaratmak için görünmüyor. Bağlantı hiçbir zaman tam olarak kurulur. Javascript bu gibi görünüyor:

var ws;
var host = 'ws://localhost:8181';
debug("Connecting to "   host   " ...");
try {
 ws = new WebSocket(host);
} catch (err) {
 debug(err, 'error');
}
ws.onopen = function () {
 debug("connected...", 'success');
};
ws.onclose = function () {
 debug("Socket closed!", 'error');
};
ws.onmessage = function (evt) {
 debug('response: '   evt, 'response');
};

Hata C yattığını tahmin ediyorum# chrome gibi server olması gerektiği gibi bilgileri gönderiyor, ama dediğim gibi onopen işlevi hiçbir zaman denir.

Kısacası sorum şu ki: Evet Bunu daha başarılı - ve, bunu nasıl yaptın? Neden: kod (umarım fazla birşey değil dl) . görünürde herhangi bir hata görüyor musun

CEVAP
6 ŞUBAT 2010, CUMARTESİ


Muhtemelen bir kodlama sorunu var. Yazdım server işte çalışan bir C#:

class Program
{
    static void Main(string[] args)
    {
        var listener = new TcpListener(IPAddress.Loopback, 8181);
        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:8080");
            writer.WriteLine("WebSocket-Location: ws://localhost:8181/websession");
            writer.WriteLine("");
        }
        listener.Stop();
    }
}

Ve ilgili istemci localhost:8080 barındırılan:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <script type="text/javascript">
        var socket = new WebSocket('ws://localhost:8181/websession');
        socket.onopen = function() {
            alert('handshake successfully established. May send data now...');
        };
        socket.onclose = function() {
            alert('connection closed');
        };
    </script>
</head>
<body>
</body>
</html>

Bu örnek, sadece el sıkışma kurar. Anlaşma sağlandıktan sonra veri kabul devam etmek için sunucu optimize etmek gerekir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ABC News (Australia)

    ABC News (Au

    9 HAZİRAN 2008
  • AutoHotkey Tutorials

    AutoHotkey T

    29 Mayıs 2010
  • MikeyMacintosh

    MikeyM

    28 Aralık 2009