سؤال

أرغب في استخدام WebSockets في تطبيق Windows Forms أو WPF الخاص بي.هل تم تنفيذ عنصر تحكم .NET يدعم WebSockets حتى الآن؟أم أن هناك أي مشروع مفتوح المصدر بدأ حول هذا الموضوع؟

يمكن أن يساعدني أيضًا حل مفتوح المصدر لعميل Java الذي يدعم WebSockets.

هل كانت مفيدة؟

المحلول

الآن، يتضمن SuperWebSocket أيضًا تطبيق عميل WebSocketالصفحة الرئيسية لمشروع SuperWebSocket

تتضمن تطبيقات عميل .NET الأخرى ما يلي:

نصائح أخرى

وهنا تمريرة الأول سريعة على ترقية هذا الرمز جافا لC #. لا يعتمد وضع SSL وفقط تم اختبارها طفيفة جدا، ولكن من البداية.

using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;

public class WebSocket
{
    private Uri mUrl;
    private TcpClient mClient;
    private NetworkStream mStream;
    private bool mHandshakeComplete;
    private Dictionary<string, string> mHeaders;

    public WebSocket(Uri url)
    {
        mUrl = url;

        string protocol = mUrl.Scheme;
        if (!protocol.Equals("ws") && !protocol.Equals("wss"))
            throw new ArgumentException("Unsupported protocol: " + protocol);
    }

    public void SetHeaders(Dictionary<string, string> headers)
    {
        mHeaders = headers;
    }

    public void Connect()
    {
        string host = mUrl.DnsSafeHost;
        string path = mUrl.PathAndQuery;
        string origin = "http://" + host;

        mClient = CreateSocket(mUrl);
        mStream = mClient.GetStream();

        int port = ((IPEndPoint)mClient.Client.RemoteEndPoint).Port;
        if (port != 80)
            host = host + ":" + port;

        StringBuilder extraHeaders = new StringBuilder();
        if (mHeaders != null)
        {
            foreach (KeyValuePair<string, string> header in mHeaders)
                extraHeaders.Append(header.Key + ": " + header.Value + "\r\n");
        }

        string request = "GET " + path + " HTTP/1.1\r\n" +
                         "Upgrade: WebSocket\r\n" +
                         "Connection: Upgrade\r\n" +
                         "Host: " + host + "\r\n" +
                         "Origin: " + origin + "\r\n" +
                         extraHeaders.ToString() + "\r\n";
        byte[] sendBuffer = Encoding.UTF8.GetBytes(request);

        mStream.Write(sendBuffer, 0, sendBuffer.Length);

        StreamReader reader = new StreamReader(mStream);
        {
            string header = reader.ReadLine();
            if (!header.Equals("HTTP/1.1 101 Web Socket Protocol Handshake"))
                throw new IOException("Invalid handshake response");

            header = reader.ReadLine();
            if (!header.Equals("Upgrade: WebSocket"))
                throw new IOException("Invalid handshake response");

            header = reader.ReadLine();
            if (!header.Equals("Connection: Upgrade"))
                throw new IOException("Invalid handshake response");
        }

        mHandshakeComplete = true;
    }

    public void Send(string str)
    {
        if (!mHandshakeComplete)
            throw new InvalidOperationException("Handshake not complete");

        byte[] sendBuffer = Encoding.UTF8.GetBytes(str);

        mStream.WriteByte(0x00);
        mStream.Write(sendBuffer, 0, sendBuffer.Length);
        mStream.WriteByte(0xff);
        mStream.Flush();
    }

    public string Recv()
    {
        if (!mHandshakeComplete)
            throw new InvalidOperationException("Handshake not complete");

        StringBuilder recvBuffer = new StringBuilder();

        BinaryReader reader = new BinaryReader(mStream);
        byte b = reader.ReadByte();
        if ((b & 0x80) == 0x80)
        {
            // Skip data frame
            int len = 0;
            do
            {
                b = (byte)(reader.ReadByte() & 0x7f);
                len += b * 128;
            } while ((b & 0x80) != 0x80);

            for (int i = 0; i < len; i++)
                reader.ReadByte();
        }

        while (true)
        {
            b = reader.ReadByte();
            if (b == 0xff)
                break;

            recvBuffer.Append(b);           
        }

        return recvBuffer.ToString();
    }

    public void Close()
    {
        mStream.Dispose();
        mClient.Close();
        mStream = null;
        mClient = null;
    }

    private static TcpClient CreateSocket(Uri url)
    {
        string scheme = url.Scheme;
        string host = url.DnsSafeHost;

        int port = url.Port;
        if (port <= 0)
        {
            if (scheme.Equals("wss"))
                port = 443;
            else if (scheme.Equals("ws"))
                port = 80;
            else
                throw new ArgumentException("Unsupported scheme");
        }

        if (scheme.Equals("wss"))
            throw new NotImplementedException("SSL support not implemented yet");
        else
            return new TcpClient(host, port);
    }
}

ودعم مآخذ الويب هو القادمة في. NET 4.5 . أن الروابط يحتوي أيضا على سبيل المثال باستخدام نظام . Net.WebSockets.WebSocket الصف.

وKaazing.com توفير مكتبة عميل .NET التي يمكن الوصول بمآخذ الويب. لديهم البرامج التعليمية عبر الإنترنت في المرجعية: عملاء بناء مايكروسوفت دوت نت الدائرة المرجعية: بناء مايكروسوفت دوت نت AMQP عملاء

وهناك المشروع جافا Websocket العميل على جيثب.

وهناك تنفيذ العميل: http://websocket4net.codeplex.com/

وخيار آخر: XSockets.Net ، لديها تنفيذ الخادم والعميل

ويمكن تثبيت الملقم:

PM> Install-Package XSockets

وأو تثبيت العميل:

PM> Install-Package XSockets.Client

والإصدار الحالي هو: 3.0.4

فيما يلي قائمة بحزم nuget المدعومة من websocket.net

حزم Websocket.

أفضّل متابعة العملاء

  1. مقبس ويب الكيمياء
  2. المقبسIO

إنه بروتوكول بسيط جدًا.هناك تطبيق جافا هنا لا ينبغي أن يكون من الصعب جدًا ترجمته إلى c#.إذا تمكنت من القيام بذلك، فسوف أقوم بنشره هنا ...

صدر

ومؤخرا الجسور ومختبرات مركز العمل المشترك لتنفيذ النموذج (في التعليمات البرمجية المدارة) اثنين من مسودات مواصفات بروتوكول بمآخذ الويب:

مسودة hixie-thewebsocketprotocol-75 و <م> مسودة hixie-thewebsocketprotocol-76

والنموذج يمكن العثور عليها في HTML5 مختبرات. أنا وضعت في هذا بلوق وظيفة جميع المعلومات وجدت (حتى الآن)، وقصاصات من التعليمات البرمجية حول كيف يمكن أن يتم ذلك باستخدام WCF.

إذا كنت تريد شيئا أكثر من ذلك بقليل خفيفة الوزن، وتحقق من C # خادم صديق، وصدر: <لأ href = "https://github.com/Olivine-Labs/Alchemy-Websockets" يختلط = " نوفولو "> https://github.com/Olivine-Labs/Alchemy-Websockets

ويدعم مآخذ الويب الفانيليا وكذلك مآخذ الويب فلاش. أنها بنيت لعبة على الانترنت مع التركيز على قابلية وكفاءة.

وهناك أيضا الخيمياء. http://olivinelabs.com/Alchemy-Websockets/ التي بدلا تبرد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top