"Merhaba Dünya" WebSocket örneği oluşturma


86

Aşağıdaki kodu neden çalıştıramadığımı anlamıyorum. JavaScript ile sunucu konsolu uygulamama bağlanmak istiyorum. Ve sonra verileri sunucuya gönderin.

İşte sunucu kodu:

    static void Main(string[] args)
    {            
        TcpListener server = new TcpListener(IPAddress.Parse("127.0.0.1"), 9998);
        server.Start();
        var client = server.AcceptTcpClient();
        var stream = client.GetStream();

        while (true)
        {
            var buffer = new byte[1024]; 
            // wait for data to be received
            var bytesRead = stream.Read(buffer, 0, buffer.Length);                
            var r = System.Text.Encoding.UTF8.GetString(buffer);
            // write received data to the console
            Console.WriteLine(r.Substring(0, bytesRead));
        }
    }

ve işte JavaScript:

        var ws = new WebSocket("ws://localhost:9998/service");
        ws.onopen = function () {
            ws.send("Hello World"); // I WANT TO SEND THIS MESSAGE TO THE SERVER!!!!!!!!
        };

        ws.onmessage = function (evt) {
            var received_msg = evt.data;
            alert("Message is received...");
        };
        ws.onclose = function () {
            // websocket is closed.
            alert("Connection is closed...");
        };

Bu kodu çalıştırdığımda şu olur:

JavaScript'i çalıştırdığımda, sunucunun bir bağlantı kabul ettiğini ve başarıyla kurduğunu unutmayın. Yine de JavaScript veri gönderemez. Gönderme yöntemini her yerleştirdiğimde, bağlantı kurulsa bile gönderilmiyor. Bunu nasıl çalıştırabilirim?


10
Bu "soru" artık bir soru gibi görünmüyor ve bu nedenle StackOverflow'un formatına gerçekten uygun değil. FWIW, müşterinin mesajı değildir şifreli s maskeli çerçevenin bir parçası olarak iletilen bir rastgele değere karşı XOR'ing ile (karartılmış). Bu protokol ayrıntısı, trafiği yanlış anlayabilecek proxy sunuculara karşı zehirlenme saldırılarını önlemek için mevcuttur.
EricLaw

2
teşekkürler, bu cevap çok yardımcı :) hey, tek bir şey var, bu "statik özel dize guid =" 258EAFA5-E914-47DA-95CA-C5AB0DC85B11 ";" her zaman sabit mi? değilse bu değerleri nereden alabilirim?
Charmie

2
Bunu anladım: "Bir sunucu istemciye gönderdiği kareleri maskelememelidir"
Charmie

6
Muhtemelen orijinal soruyu olduğu gibi bırakmalıydın. Soruların amacı çözümü değil konuyu sunmaktır. Cevaplar, tahmin edebileceğiniz gibi, çözümler içindir.
Kehlan Krumme

2
WebSocket url'si neden '/ service' (ws: // localhost: 8080 / service) ile bitiyor? Neden sadece 'ws: // localhost: 8080' değil?
andree

Yanıtlar:


72

WebSockets, TCP akışlı bağlantıya dayanan protokoldür. WebSockets Mesaj tabanlı bir protokol olmasına rağmen.

Kendi protokolünüzü uygulamak istiyorsanız, en son ve kararlı spesifikasyonu (18/04/12 için) RFC 6455 kullanmanızı tavsiye ederim . Bu şartname, el sıkışma ve çerçeveleme ile ilgili tüm gerekli bilgileri içerir. Ayrıca, tarayıcı tarafından ve sunucu tarafından davranma senaryolarının çoğu açıklaması. Kodunuzu uygularken sunucu tarafı ile ilgili önerilerin izlenmesi şiddetle tavsiye edilir.

Birkaç kelimeyle WebSockets ile çalışmayı şu şekilde tanımlayabilirim:

  1. Sunucu Soketi (System.Net.Sockets) oluşturun, onu belirli bir bağlantı noktasına bağlayın ve bağlantıları eşzamansız olarak kabul ederek dinlemeye devam edin. Bunun gibi bir şey:

    Socket serverSocket = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
    serverSocket.Bind (yeni IPEndPoint (IPAddress.Any, 8080));
    serverSocket.Listen (128);
    serverSocket.BeginAccept (null, 0, OnAccept, null);
  2. Sen olmalıdır kabul el sıkışma uygulayacak işlevi "OnAccept". Gelecekte, eğer sistem saniyede büyük miktarda bağlantıyı idare edecekse, başka bir iş parçacığında olması gerekir.

    private void OnAccept (IAsyncResult sonucu) {
    Deneyin {
        Soket istemcisi = boş;
        eğer (serverSocket! = null && serverSocket.IsBound) {
            client = serverSocket.EndAccept (sonuç);
        }
        eğer (müşteri! = null) {
            / * El sıkışma ve ClientSocket'i yönetme * /
        }
    } catch (SocketException istisnası) {
    
    } en sonunda {
        eğer (serverSocket! = null && serverSocket.IsBound) {
            serverSocket.BeginAccept (null, 0, OnAccept, null);
        }
    }
    }
  3. Bağlantı kurulduktan sonra, el sıkışma yapmanız gerekir . 1.3 şartnamesine göre El Sıkışmayı Açma , bağlantı kurulduktan sonra bazı bilgilerle birlikte temel HTTP talebini alacaksınız. Misal:

    GET / sohbet HTTP / 1.1
    Ana bilgisayar: server.example.com
    Yükseltme: websocket
    Bağlantı: Yükselt
    Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ ==
    Menşei: http://example.com
    Sec-WebSocket-Protokolü: sohbet, süper sohbet
    Sec-WebSocket Sürümü: 13

    Bu örnek, protokol 13'ün sürümüne dayanmaktadır. Eski sürümlerin bazı farklılıkları olduğunu, ancak çoğunlukla en son sürümlerin çapraz uyumlu olduğunu unutmayın. Farklı tarayıcılar size bazı ek veriler gönderebilir. Örneğin Tarayıcı ve işletim sistemi ayrıntıları, önbellek ve diğerleri.

    Sağlanan el sıkışma ayrıntılarına bağlı olarak, cevap satırları oluşturmanız gerekir, bunlar çoğunlukla aynıdır, ancak sağlanan Sec-WebSocket-Key'e dayanan Accpet-Key'i içerecektir. 1.3 spesifikasyonunda, yanıt anahtarının nasıl üretileceği açıkça açıklanmıştır. İşte V13 için kullandığım işlevim:

    statik özel dize guid = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
    private string AcceptKey (ref dize anahtarı) {
        string longKey = anahtar + kılavuz;
        SHA1 sha1 = SHA1CryptoServiceProvider.Create ();
        bayt [] hashBytes = sha1.ComputeHash (System.Text.Encoding.ASCII.GetBytes (longKey));
        return Convert.ToBase64String (hashBytes);
    }
    

    El sıkışma yanıtı şuna benzer:

    HTTP / 1.1 101 Anahtarlama Protokolleri
    Yükseltme: websocket
    Bağlantı: Yükselt
    Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK + xOo =

    Ancak, kabul anahtarının, istemciden sağlanan anahtara ve daha önce sağladığım AcceptKey yöntemine göre oluşturulan anahtar olması gerekir. Ayrıca, kabul anahtarının son karakterinden sonra iki yeni satır "\ r \ n \ r \ n" koyduğunuzdan emin olun.

  4. Sunucudan el sıkışma yanıtı gönderildikten sonra, istemci " onopen " işlevini tetiklemelidir , yani daha sonra mesaj gönderebilirsiniz.
  5. Mesajlar ham formatta gönderilmez, ancak Veri Çerçeveleme özelliğine sahiptirler . Ve istemciden sunucuya, ayrıca mesaj başlığında sağlanan 4 bayta dayalı olarak veriler için maskeleme uygular. Sunucudan istemciye veri üzerinde maskeleme uygulamanıza gerek yoktur. Şartnamedeki 5. Veri Çerçeveleme bölümünü okuyun . İşte kendi uygulamamdan kopyala-yapıştır. Kullanıma hazır bir kod değil ve değiştirilmesi gerekiyor, sadece bir fikir vermek ve WebSocket çerçeveleme ile genel okuma / yazma mantığı vermek için gönderiyorum. Git bu bağlantıyı .
  6. Çerçeveleme uygulandıktan sonra, soketleri kullanarak verileri doğru şekilde aldığınızdan emin olun. Örneğin, bazı mesajların tek bir mesajda birleştirilmesini önlemek için, çünkü TCP hala akış tabanlı protokoldür. Bu, YALNIZCA belirli bayt miktarını okumanız gerektiği anlamına gelir. Mesajın uzunluğu her zaman başlığa bağlıdır ve kendi başlığında sağlanan veri uzunluğu ayrıntılarını içerir. Dolayısıyla, Soket'ten veri alırken, önce 2 bayt alın, Çerçeveleme spesifikasyonuna göre başlıktan ayrıntıları alın, ardından maske başka bir 4 bayt sağladıysa ve sonra veri uzunluğuna bağlı olarak 1, 4 veya 8 bayt olabilir. Ve veriden sonra kendisi. Okuduktan sonra, demasking uygulayın ve mesaj verileriniz kullanıma hazır.
  7. Bazı Veri Protokollerini kullanmak isteyebilirsiniz , JavaScript'te trafik ekonomisi ve istemci tarafında kullanımı kolay JSON kullanmanızı öneririm. Sunucu tarafı için bazı ayrıştırıcıları kontrol etmek isteyebilirsiniz. Birçoğu var, google gerçekten yardımcı olabilir.

Kendi WebSockets protokolünü uygulamak kesinlikle bazı faydalara ve harika deneyime sahip olmanın yanı sıra kendi protokolü üzerinde kontrol sahibi olmanızı sağlar. Ancak bunu yapmak için biraz zaman harcamalı ve uygulamanın oldukça güvenilir olduğundan emin olmalısınız.

Aynı zamanda, Google'ın (yine) yeteri kadar sahip olduğu, kullanıma hazır çözümlere de göz atabilirsiniz.


Sanırım el sıkışmaya takılı kaldım. yeni bir bağlantı alındığında istemciye uzun anahtarın sha1 hashini ve kısa anahtarını göndermem gerekiyor, değil mi?
Tono Nam

Bölüm 3'e daha fazla bilgi ekledim. Sunucu tarafında el sıkışma hakkında daha fazla ayrıntı açıklıyor.
moka

1
Ayrıca, istek protokolleri sağlanmışsa, Sec-WebSocket-Protokol hattı için yanıt olarak aynısını kullanın. Ancak sadece talepte sağlanmışsa. Ayrıca yanıt için Versiyona ihtiyacınız yok. Ve sonuna başka bir NewLine ekleyin. Ayrıca, UTF8: Encoding.UTF8.GetBytes (responseBytes) kullanılarak kodlanmış tüm yanıt dizesini gönderin
moka

Kapalıyız. Yardımın için çok teşekkürler. Şimdi bir mesaj gönderebiliyorum ama mesajın şifreli olduğuna inanıyorum. Yakında üzerinde çalışmaya başlayacağım düzenlememe bir göz atın ...
Tono Nam

Veri çerçevelemesini uygulamak zorundasınız, bu WebSockets protokolünün uygulanmasında en karmaşık bit olduğuna inanıyorum. Uygulamamdan postaya kopyala-yapıştır kodu ekleyeceğim, ancak düzenlediğinizden emin olun, çünkü değiştirilecek bazı şeyler var, ancak genel olarak çerçeve ile çalışma fikri ve mantığı veriyor.
moka

10

(OP adına yayınlanan cevap) .

Şimdi veri gönderebiliyorum. Bu, cevaplarınız ve @Maksims Mihejevs koduyla programın yeni versiyonudur.

Sunucu

using System;
using System.Net.Sockets;
using System.Net;
using System.Security.Cryptography;
using System.Threading;

namespace ConsoleApplication1
{
    class Program
    {
        static Socket serverSocket = new Socket(AddressFamily.InterNetwork, 
        SocketType.Stream, ProtocolType.IP);
        static private string guid = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";

        static void Main(string[] args)
        {            
            serverSocket.Bind(new IPEndPoint(IPAddress.Any, 8080));
            serverSocket.Listen(128);
            serverSocket.BeginAccept(null, 0, OnAccept, null);            
            Console.Read();
        }

        private static void OnAccept(IAsyncResult result)
        {
            byte[] buffer = new byte[1024];
            try
            {
                Socket client = null;
                string headerResponse = "";
                if (serverSocket != null && serverSocket.IsBound)
                {
                    client = serverSocket.EndAccept(result);
                    var i = client.Receive(buffer);
                    headerResponse = (System.Text.Encoding.UTF8.GetString(buffer)).Substring(0,i);
                    // write received data to the console
                    Console.WriteLine(headerResponse);

                }
                if (client != null)
                {
                    /* Handshaking and managing ClientSocket */

                    var key = headerResponse.Replace("ey:", "`")
                              .Split('`')[1]                     // dGhlIHNhbXBsZSBub25jZQ== \r\n .......
                              .Replace("\r", "").Split('\n')[0]  // dGhlIHNhbXBsZSBub25jZQ==
                              .Trim();

                    // key should now equal dGhlIHNhbXBsZSBub25jZQ==
                    var test1 = AcceptKey(ref key);

                    var newLine = "\r\n";

                    var response = "HTTP/1.1 101 Switching Protocols" + newLine
                         + "Upgrade: websocket" + newLine
                         + "Connection: Upgrade" + newLine
                         + "Sec-WebSocket-Accept: " + test1 + newLine + newLine
                         //+ "Sec-WebSocket-Protocol: chat, superchat" + newLine
                         //+ "Sec-WebSocket-Version: 13" + newLine
                         ;

                    // which one should I use? none of them fires the onopen method
                    client.Send(System.Text.Encoding.UTF8.GetBytes(response));

                    var i = client.Receive(buffer); // wait for client to send a message

                    // once the message is received decode it in different formats
                    Console.WriteLine(Convert.ToBase64String(buffer).Substring(0, i));                    

                    Console.WriteLine("\n\nPress enter to send data to client");
                    Console.Read();

                    var subA = SubArray<byte>(buffer, 0, i);
                    client.Send(subA);
                    Thread.Sleep(10000);//wait for message to be send


                }
            }
            catch (SocketException exception)
            {
                throw exception;
            }
            finally
            {
                if (serverSocket != null && serverSocket.IsBound)
                {
                    serverSocket.BeginAccept(null, 0, OnAccept, null);
                }
            }
        }

        public static T[] SubArray<T>(T[] data, int index, int length)
        {
            T[] result = new T[length];
            Array.Copy(data, index, result, 0, length);
            return result;
        }

        private static string AcceptKey(ref string key)
        {
            string longKey = key + guid;
            byte[] hashBytes = ComputeHash(longKey);
            return Convert.ToBase64String(hashBytes);
        }

        static SHA1 sha1 = SHA1CryptoServiceProvider.Create();
        private static byte[] ComputeHash(string str)
        {
            return sha1.ComputeHash(System.Text.Encoding.ASCII.GetBytes(str));
        }
    }
}

JavaScript:

<!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">
        function connect() {
            var ws = new WebSocket("ws://localhost:8080/service");
            ws.onopen = function () {
                alert("About to send data");
                ws.send("Hello World"); // I WANT TO SEND THIS MESSAGE TO THE SERVER!!!!!!!!
                alert("Message sent!");
            };

            ws.onmessage = function (evt) {
                alert("About to receive data");
                var received_msg = evt.data;
                alert("Message received = "+received_msg);
            };
            ws.onclose = function () {
                // websocket is closed.
                alert("Connection is closed...");
            };
        };


    </script>
</head>
<body style="font-size:xx-large" >
    <div>
    <a href="#" onclick="connect()">Click here to start</a></div>
</body>
</html>

Bu kodu çalıştırdığımda, hem istemciden hem de sunucudan veri gönderip alabiliyorum. Tek sorun, mesajların sunucuya ulaştıklarında şifrelenmesidir. Programın nasıl çalıştığına dair adımlar şunlardır:

görüntü açıklamasını buraya girin

İstemciden gelen mesajın nasıl şifrelendiğine dikkat edin.


6

WebSockets, istemci ve sunucu arasında el sıkışmayı içeren bir protokol ile uygulanır . Normal prizler gibi çalıştıklarını sanmıyorum. Protokolü okuyun ve bunun için başvurunuzu alın. Alternatif olarak, mevcut bir WebSocket kitaplığını veya WebSocket API'si olan .Net4.5beta'yı kullanın .


Tabii ki normal prizler gibi çalışırlar. Soket, uygulama protokolünden daha düşük bir seviyededir ve bu nedenle ona bağlı değildir. Bu, bir soket üzerinde FTP, SMTP, HTTP, WebSockets vb. Çalıştırabileceğiniz anlamına gelir. Protokolü doğru şekilde izlediğinden emin olmak uygulayıcıya bağlıdır, aksi takdirde kimse sunucu ile konuşamayacaktır.
SRM

5

Hiçbir yerde basit bir çalışma örneği bulamadım (19 Ocak itibariyle), işte güncellenmiş bir sürüm. Chrome 71.0.3578.98 sürümüne sahibim.

C # Websocket sunucusu:

using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Security.Cryptography;

namespace WebSocketServer
{
    class Program
    {
    static Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
    static private string guid = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";

    static void Main(string[] args)
    {
        serverSocket.Bind(new IPEndPoint(IPAddress.Any, 8080));
        serverSocket.Listen(1); //just one socket
        serverSocket.BeginAccept(null, 0, OnAccept, null);
        Console.Read();
    }

    private static void OnAccept(IAsyncResult result)
    {
        byte[] buffer = new byte[1024];
        try
        {
            Socket client = null;
            string headerResponse = "";
            if (serverSocket != null && serverSocket.IsBound)
            {
                client = serverSocket.EndAccept(result);
                var i = client.Receive(buffer);
                headerResponse = (System.Text.Encoding.UTF8.GetString(buffer)).Substring(0, i);
                // write received data to the console
                Console.WriteLine(headerResponse);
                Console.WriteLine("=====================");
            }
            if (client != null)
            {
                /* Handshaking and managing ClientSocket */
                var key = headerResponse.Replace("ey:", "`")
                          .Split('`')[1]                     // dGhlIHNhbXBsZSBub25jZQ== \r\n .......
                          .Replace("\r", "").Split('\n')[0]  // dGhlIHNhbXBsZSBub25jZQ==
                          .Trim();

                // key should now equal dGhlIHNhbXBsZSBub25jZQ==
                var test1 = AcceptKey(ref key);

                var newLine = "\r\n";

                var response = "HTTP/1.1 101 Switching Protocols" + newLine
                     + "Upgrade: websocket" + newLine
                     + "Connection: Upgrade" + newLine
                     + "Sec-WebSocket-Accept: " + test1 + newLine + newLine
                     //+ "Sec-WebSocket-Protocol: chat, superchat" + newLine
                     //+ "Sec-WebSocket-Version: 13" + newLine
                     ;

                client.Send(System.Text.Encoding.UTF8.GetBytes(response));
                var i = client.Receive(buffer); // wait for client to send a message
                string browserSent = GetDecodedData(buffer, i);
                Console.WriteLine("BrowserSent: " + browserSent);

                Console.WriteLine("=====================");
                //now send message to client
                client.Send(GetFrameFromString("This is message from server to client."));
                System.Threading.Thread.Sleep(10000);//wait for message to be sent
            }
        }
        catch (SocketException exception)
        {
            throw exception;
        }
        finally
        {
            if (serverSocket != null && serverSocket.IsBound)
            {
                serverSocket.BeginAccept(null, 0, OnAccept, null);
            }
        }
    }

    public static T[] SubArray<T>(T[] data, int index, int length)
    {
        T[] result = new T[length];
        Array.Copy(data, index, result, 0, length);
        return result;
    }

    private static string AcceptKey(ref string key)
    {
        string longKey = key + guid;
        byte[] hashBytes = ComputeHash(longKey);
        return Convert.ToBase64String(hashBytes);
    }

    static SHA1 sha1 = SHA1CryptoServiceProvider.Create();
    private static byte[] ComputeHash(string str)
    {
        return sha1.ComputeHash(System.Text.Encoding.ASCII.GetBytes(str));
    }

    //Needed to decode frame
    public static string GetDecodedData(byte[] buffer, int length)
    {
        byte b = buffer[1];
        int dataLength = 0;
        int totalLength = 0;
        int keyIndex = 0;

        if (b - 128 <= 125)
        {
            dataLength = b - 128;
            keyIndex = 2;
            totalLength = dataLength + 6;
        }

        if (b - 128 == 126)
        {
            dataLength = BitConverter.ToInt16(new byte[] { buffer[3], buffer[2] }, 0);
            keyIndex = 4;
            totalLength = dataLength + 8;
        }

        if (b - 128 == 127)
        {
            dataLength = (int)BitConverter.ToInt64(new byte[] { buffer[9], buffer[8], buffer[7], buffer[6], buffer[5], buffer[4], buffer[3], buffer[2] }, 0);
            keyIndex = 10;
            totalLength = dataLength + 14;
        }

        if (totalLength > length)
            throw new Exception("The buffer length is small than the data length");

        byte[] key = new byte[] { buffer[keyIndex], buffer[keyIndex + 1], buffer[keyIndex + 2], buffer[keyIndex + 3] };

        int dataIndex = keyIndex + 4;
        int count = 0;
        for (int i = dataIndex; i < totalLength; i++)
        {
            buffer[i] = (byte)(buffer[i] ^ key[count % 4]);
            count++;
        }

        return Encoding.ASCII.GetString(buffer, dataIndex, dataLength);
    }

    //function to create  frames to send to client 
    /// <summary>
    /// Enum for opcode types
    /// </summary>
    public enum EOpcodeType
    {
        /* Denotes a continuation code */
        Fragment = 0,

        /* Denotes a text code */
        Text = 1,

        /* Denotes a binary code */
        Binary = 2,

        /* Denotes a closed connection */
        ClosedConnection = 8,

        /* Denotes a ping*/
        Ping = 9,

        /* Denotes a pong */
        Pong = 10
    }

    /// <summary>Gets an encoded websocket frame to send to a client from a string</summary>
    /// <param name="Message">The message to encode into the frame</param>
    /// <param name="Opcode">The opcode of the frame</param>
    /// <returns>Byte array in form of a websocket frame</returns>
    public static byte[] GetFrameFromString(string Message, EOpcodeType Opcode = EOpcodeType.Text)
    {
        byte[] response;
        byte[] bytesRaw = Encoding.Default.GetBytes(Message);
        byte[] frame = new byte[10];

        int indexStartRawData = -1;
        int length = bytesRaw.Length;

        frame[0] = (byte)(128 + (int)Opcode);
        if (length <= 125)
        {
            frame[1] = (byte)length;
            indexStartRawData = 2;
        }
        else if (length >= 126 && length <= 65535)
        {
            frame[1] = (byte)126;
            frame[2] = (byte)((length >> 8) & 255);
            frame[3] = (byte)(length & 255);
            indexStartRawData = 4;
        }
        else
        {
            frame[1] = (byte)127;
            frame[2] = (byte)((length >> 56) & 255);
            frame[3] = (byte)((length >> 48) & 255);
            frame[4] = (byte)((length >> 40) & 255);
            frame[5] = (byte)((length >> 32) & 255);
            frame[6] = (byte)((length >> 24) & 255);
            frame[7] = (byte)((length >> 16) & 255);
            frame[8] = (byte)((length >> 8) & 255);
            frame[9] = (byte)(length & 255);

            indexStartRawData = 10;
        }

        response = new byte[indexStartRawData + length];

        int i, reponseIdx = 0;

        //Add the frame bytes to the reponse
        for (i = 0; i < indexStartRawData; i++)
        {
            response[reponseIdx] = frame[i];
            reponseIdx++;
        }

        //Add the data bytes to the response
        for (i = 0; i < length; i++)
        {
            response[reponseIdx] = bytesRaw[i];
            reponseIdx++;
        }

        return response;
    }
}
}

İstemci html ve javascript:

<!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:8080/websession');
        socket.onopen = function() {
           // alert('handshake successfully established. May send data now...');
		   socket.send("Hi there from browser.");
        };
		socket.onmessage = function (evt) {
                //alert("About to receive data");
                var received_msg = evt.data;
                alert("Message received = "+received_msg);
            };
        socket.onclose = function() {
            alert('connection closed');
        };
    </script>
</head>
<body>
</body>
</html>


3

Konu

WebSocket kullandığınız için, harcayan doğru. WebSocket'ten ilk verileri aldıktan sonra, daha fazla bilgi akmadan önce C # sunucusundan el sıkışma mesajını göndermeniz gerekir.

HTTP/1.1 101 Web Socket Protocol Handshake
Upgrade: websocket
Connection: Upgrade
WebSocket-Origin: example
WebSocket-Location: something.here
WebSocket-Protocol: 13

Bu çizgide bir şey.

WebSocket'in w3 veya google'da nasıl çalıştığı hakkında biraz daha araştırma yapabilirsiniz.

Bağlantılar ve Kaynaklar

İşte bir protokol spesifikasyonu: http://tools.ietf.org/html/draft-hixie-thewebsocketprotocol-76#section-1.3

Çalışma örneklerinin listesi:


Ayrıca UTF8 kodlamasını kullanıyorum. ASCII gibi farklı bir tane kullanmalı mıyım?
Tono Nam

@TonoNam: Bildiğim kadarıyla UTF8 kodlaması doğru - bir HTML5 uzmanı olmasam da, bu yüzden emin değilim.
caesay

Safari ile çalıştırdım !!! Yine de google chrome ile çalışması için ona ihtiyacım var. Tüm örnekler birbirine bağlanır ancak hiçbiri başarıyla veri göndermez. Denemeye devam edeceğim. Yardımın için çok teşekkürler!
Tono Nam

Tabii ki .... Hala çalışmazsam, bu soruyu ödüllü bir soru haline getireceğim! Bunun işe yaradığını görmek için gerçekten merak ediyorum. Yardım için teşekkürler
Tono Nam

Protokol spesifikasyon bağlantınız güncel değil. Safari hala bunu kullanıyor ancak diğer tarayıcılar uyumsuz RFC 6455'e geçti . Ayrıca, ilk bağlantının bazı görüşmeler gerektirdiği konusunda haklıyken, sonraki mesajlar bunu yapmaz.
simonc
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.