html - Tarayıcıdan javascript kullanarak TCP Soketine bağlanma


Bir socket açan ve dinleyen bir vb.net uygulamam var.

Bu soket üzerinden o uygulama ile, tarayıcıda çalışan bir JavaScript kullanarak iletişim kurmam gerekiyor. Yani, bu sokete bazı veriler göndermem gerekiyor ki bu soketi dinleyen uygulama o verileri alabilsin, bazı uzak çağrılar kullanarak bazı işlemler yapabilsin ve daha fazla veri alıp bunu tekrar JavaScriptimin okuyup tarayıcıda yazdırması için sokete koyabilsin.

Denedim, socket.io, websockify ama hiçbiri faydalı olmadı.

Dolayısıyla soru şu: Benim denemeye çalıştığım şey mümkün mü? Tarayıcıda çalışan bir JavaScript'in bir TCP soketine bağlanıp veri gönderebilmesi, sokette daha fazla veri yanıtı dinleyebilmesi ve bunu tarayıcıya yazdırabilmesi için bir yol var mı?

Eğer bu mümkünse, biri bana hedefi belirlememe yardımcı olacak şeyin ne olacağı konusunda doğru yönü gösterebilir mi?

Cevap #1

Sorununuzla ilgili olarak, şu anda bunun için XHR veya websockets'e bağlı kalmanız gerekecek.

Şu anda popüler hiçbir tarayıcı, javascript için ham soketler oluşturmanıza ve erişmenize izin veren böyle bir ham soketler API'sini uygulamamıştır, ancak JavaScript'te ham soketler API'sinin uygulanması için bir taslak üzerinde çalışılmaktadır. Bu bağlantılara göz atın:
http://www.w3.org/TR/raw-sockets/
https://developer.mozilla.org/en-US/docs/Web/API/TCPSocket

Chrome artık ‘deneysel’ API'lerinde ham TCP ve UDP soketleri için destek sunuyor. Bu özellikler sadece Chrome uygulamaları için kullanılabilir ve belgelenmiş olmasına rağmen, şimdilik gizlidir. Bununla birlikte, bazı geliştiriciler, bu özelliği kullanarak bu IRC istemcisi gibi ilginç projeler yaratmaya başlamış durumda.

Bu API'ye erişmek için, uzantınızın manifestosunda deneysel bayrağı etkinleştirmeniz gerekecek. Soketleri kullanmak oldukça basittir, örneğin:

chrome.experimental.socket.create('tcp', '127.0.0.1', 8080, function(socketInfo) {
  chrome.experimental.socket.connect(socketInfo.socketId, function (result) {
        chrome.experimental.socket.write(socketInfo.socketId, "Hello, world!");         
    });
});

Cevap #2

Bu, aşağıda gösterildiği gibi gezgin arayüzü aracılığıyla mümkün olacaktır:

navigator.tcpPermission.requestPermission({remoteAddress:"127.0.0.1", remotePort:6789}).then(
  () => {
    // Permission was granted
    // Create a new TCP client socket and connect to remote host
    var mySocket = new TCPSocket("127.0.0.1", 6789);

    // Send data to server
    mySocket.writeable.write("Hello World").then(
        () => {

            // Data sent sucessfully, wait for response
            console.log("Data has been sent to server");
            mySocket.readable.getReader().read().then(
                ({ value, done }) => {
                    if (!done) {
                        // Response received, log it:
                        console.log("Data received from server:" + value);
                    }

                    // Close the TCP connection
                    mySocket.close();
                }
            );
        },
        e => console.error("Sending error: ", e)
    );
  }
);

Daha fazla ayrıntı w3.org tcp-udp-sockets belgelerinde belirtilmiştir.

http://raw-sockets.sysapps.org/#interface-tcpsocket

https://www.w3.org/TR/tcp-udp-sockets/

Bir başka alternatif de Chrome Soketlerini kullanmaktır

Bağlantılar kurmak

chrome.sockets.tcp.create({}, function(createInfo) {
  chrome.sockets.tcp.connect(createInfo.socketId,
    IP, PORT, onConnectedCallback);
});

Veri gönderiliyor

chrome.sockets.tcp.send(socketId, arrayBuffer, onSentCallback);

Veri alma

chrome.sockets.tcp.onReceive.addListener(function(info) {
  if (info.socketId != socketId)
    return;
  // info.data is an arrayBuffer.
});

Ayrıca HTML5 Web Sockets kullanmayı deneyebilirsiniz (Her ne kadar bu doğrudan TCP iletişimi olmasa da):

var connection = new WebSocket('ws://IPAddress:Port');

connection.onopen = function () {
  connection.send('Ping'); // Send the message 'Ping' to the server
};

http://www.html5rocks.com/en/tutorials/websockets/basics/

Sunucunuz ayrıca pywebsocket gibi bir WebSocket sunucusu ile dinliyor olmalıdır, alternatif olarak Mozilla'da açıklandığı gibi kendi sunucunuzu yazabilirsiniz

İlgili makaleler