خادم Websocket: لا يتم استدعاء وظيفة Onopen على مقبس الويب

StackOverflow https://stackoverflow.com/questions/2211898

  •  18-09-2019
  •  | 
  •  

سؤال

أحاول تنفيذ خادم مقبس الويب C #، لكن أعطني بعض المشاكل. أقوم بتشغيل WebServer (ASP.NET) لاستضافة الصفحة باستخدام JavaScript ويتم تطبيق خادم مقبس الويب كتطبيق C # Console.

أنا قادر على اكتشاف محاولة الاتصال من العميل (كروم تشغيل JavaScript) وأيضا لاسترداد المصافحة من العميل. لكن العميل لا يبدو أن يقبل المصافحة التي أرسلها مرة أخرى ( onopen لا يسمى الوظيفة الموجودة على مقبس الويب).

لقد كنت أقرأ بروتوكول مقبس الويب ولا أستطيع أن أرى ما أفعله خطأ. هيريس قليلا من رمز الخادم:

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();

أنا أركض إلى خادم الويب على منفذ 8080 وخادم مقبس الويب على المنفذ 8181، كلاهما على بلدي المحلي.

لقد حاولت إرسال المصافحة في الترميزات المختلفة (ASCII، BYTES و HEX)، لكن هذا لا يبدو أن يحدث فرقا. لا يتم تأسيس الاتصال بالكامل. جافا سكريبت تبدو وكأنها هذه:

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');
};

أنا أظن أن الخطأ يكمن في خادم C كما هو كروم يرسل المعلومات كما ينبغي، ولكن كما قال onopen وظيفة لا تسمى أبدا.

لذلك سؤالي في قصيرة:هل أنجز أي شيء من أي وقت مضى - وإذا كانت الإجابة بنعم، كيف فعلت ذلك؟ والعناية: هل ترى أي أخطاء واضحة في التعليمات البرمجية (نأمل أن لا تسأل كثيرا)

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

المحلول

من المحتمل أن تكون مشكلة ترميز. فيما يلي خادم عمل 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();
    }
}

والعميل المقابل استضافت على localhost:8080:

<!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>

يثبت هذا المثال فقط المصافحة. ستحتاج إلى تعديل الخادم من أجل مواصلة قبول البيانات بمجرد إنشاء المصافحة.

نصائح أخرى

يرجى استخدام ترميز UTF8 لإرسال رسالة نصية.

يوجد خادم Websocket مفتوح المصدر الذي يتم تنفيذه بواسطة C #، يمكنك استخدامه مباشرة.

http://superwebsocket.codeplex.com/

إنه مشروعي المصدر المفتوح!

يقدم .NET Framework 4.5 دعم لموبرسيات في مؤسسة اتصالات Windows. WebSockets هي تقنية فعالة ومقرها المعايير التي تتيح التواصل المزدوج عبر منافذ HTTP القياسية 80 و 443. إن استخدام منافذ HTTP القياسية تسمح برامج Websockets بالتواصل عبر الويب عبر الوسطاء. تمت إضافة اثنين من الارتباطات القياسية الجديدة لدعم التواصل عبر وسائل النقل WebSocket. nethttpbinding و nethttpsbinding. يمكن تكوين إعدادات محددة WebSockets على عنصر HTTPTransportBinding عن طريق الوصول إلى خاصية WebSocketsettings.

أعتقد أنه لا يزال يستخدم الصابون رغم ذلك

http://msdn.microsoft.com/en-us/library/hhh674271(V=VS.110).aspx.

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