JavaScript kullanarak tarayıcıdan TCP Soketine bağlanma


111

Soket açıp onu dinleyen vb.net uygulamam var.

Tarayıcıda çalışan bir javascript kullanarak bu uygulama ile bu soket üzerinden iletişim kurmam gerekiyor. Yani, bu soket üzerinde dinleyen uygulamanın bu verileri alabilmesi, bazı uzaktan aramaları kullanarak bazı şeyler yapabilmesi ve biraz daha fazla veri alıp javascript'imin ihtiyaç duyduğu sokete geri koyabilmesi için bu sokete bazı veriler göndermem gerekiyor. tarayıcıda okuyun ve yazdırın.

Soket.io, websockify'ı denedim ama hiçbiri işe yaramadı.

Dolayısıyla soru, denediğim şey mümkün mü? Bir tarayıcıda çalışan bir javascript'in bir tcp soketine bağlanmasının ve bazı verileri göndermesinin ve sokette daha fazla veri yanıtı için dinlemesinin ve tarayıcıya yazdırmasının bir yolu var mı?

Eğer bu mümkünse, biri bana hedefi belirlememe yardımcı olacak doğru yönü gösterebilir.


3
Hayır, WebSockets ile sınırlısınız
Bergi

2
@Bergi - HTTP, tcp üzerinden bir protokoldür, öyleyse neden bir HTTP bağlantısı yapılabilir ama TCP yapılamaz?
AlikElzin-kilaka

@kilaka: Çünkü bir tarayıcı ortamında bulunan (standart) API'ler bunlarla sınırlıdır .
Bergi


6
Javascript'in omurgasında sürünen yeni bir standart görüyorum: w3.org/TR/raw-sockets .
AlikElzin-kilaka

Yanıtlar:


57

Sorununuza gelince, şu anda bunun için XHR veya web soketlerine güvenmeniz gerekecek.

Şu anda hiçbir popüler tarayıcı, ham soketler oluşturmanıza ve bunlara erişmenize olanak tanıyan javascript için böyle bir ham soket api uygulamamıştır, ancak JavaScript'te ham soket api uygulaması için bir taslak hazırlanmaktadır. Şu bağlantılara bir 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 soketlerini destekliyor. Bu özellikler yalnızca uzantılar için mevcuttur ve belgelenmesine rağmen şu an için gizlidir. Bunu söyledikten sonra, bazı geliştiriciler zaten bu IRC istemcisi gibi onu kullanarak ilginç projeler oluşturuyorlar. .

Bu API'ye erişmek için, uzantınızın bildiriminde deneysel bayrağı etkinleştirmeniz gerekir. Soket 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!");         
    });
});

Hangi tarayıcılar ham soketleri destekler?
AlikElzin-kilaka

2
Websockets ve Rawsockets ile karşılaştırıldığında herhangi bir performans artışı var mı?
NiCk Newman

3
Tarayıcıdaki javascript'in bir güvenlik açığı olan bir tcp bağlantı noktasına bağlanmasına izin vermiyor mu? Firefox / chrome'unuzda yerel olarak çalıştırdığınız herhangi bir şeye bağlanan (örneğin MySQL DB) ve kötü bir sitede veri yayınlayan javascript hayal edin?
Arun Avanathan

@ArunAvanathan ajax ile ne yaparsan yap, soketlerle yapabilirsin ya da tam tersi ... sanırım güvenlik sorunu yok.
Firas Abd Alrahman

1
@FirasAbdAlrahman HTTP / S için tarayıcı davranışını yöneten çeşitli güvenlik politikaları olduğunu düşünüyorum . Dolayısıyla, TCP üzerinden tarayıcı soket bağlantısı HTTP / S ile aynı değildir.
Arun Avanathan

30

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-soketleri belgelerinde özetlenmiştir.

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

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

Diğer bir alternatif ise Chrome Sockets kullanmaktır

Bağlantılar oluşturma

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

Veri gönderme

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

Veri alıyor

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

Ayrıca şunu kullanma girişimini de kullanabilirsiniz HTML5 Web Sockets(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 sunucusuyla dinliyor olmalıdır, alternatif olarak Mozilla'da belirtildiği gibi kendi sunucunuzu yazabilirsiniz.


25
Bu yanıtı biraz daha detaylandırmak için: sunucu ayrıca bir WebSocket sunucusuyla dinliyor olmalıdır. WebSockets doğrudan ham bir TCP soketine bağlanamaz. websockify, WebSocket-TCP proxy'si olarak hareket eden bir araçtır: sunucunuzda oturur ve WebSocket bağlantılarını dinler ve ardından WebSocket iletişimini belirli bir TCP soketine yönlendirir.
apsillers

58
Bu soruya yanıt vermez - websocket, TCP üzerinden bir protokoldür (örneğin HTTP gibi) ve doğrudan TCP iletişimi değildir.
AlikElzin-kilaka

1
ancak mesaj tarayıcı penceresine nasıl yerleştirilir? :(
shzyincu

3
Bu cevap tamamen yanlış ve silinmesi gerekiyor.
Brad

1
@Brad bu cevap bana yardımcı oldu ve bazılarının da 22 oy almasına yardımcı olmuş olmalı.
user1378687

6

ws2s projesi, tarayıcı tarafı js'ye soket getirmeyi amaçlamaktadır. Websocket'i sokete dönüştüren bir websocket sunucusudur.

ws2s şematik diyagramı

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

kod örneği:

var socket = new WS2S("wss://ws2s.feling.io/").newSocket()

socket.onReady = () => {
  socket.connect("feling.io", 80)
  socket.send("GET / HTTP/1.1\r\nHost: feling.io\r\nConnection: close\r\n\r\n")
}

socket.onRecv = (data) => {
  console.log('onRecv', data)
}

5

Jsocket bakın . Kendim kullanmadım. Son güncellemeden bu yana 3 yıldan fazla oldu (26/6/2014 itibarıyla).

* Flaş kullanır :(

Gönderen belgeler :

<script type='text/javascript'>
    // Host we are connecting to
    var host = 'localhost'; 
    // Port we are connecting on
    var port = 3000;

    var socket = new jSocket();

    // When the socket is added the to document 
    socket.onReady = function(){
            socket.connect(host, port);             
    }

    // Connection attempt finished
    socket.onConnect = function(success, msg){
            if(success){
                    // Send something to the socket
                    socket.write('Hello world');            
            }else{
                    alert('Connection to the server could not be estabilished: ' + msg);            
            }       
    }
    socket.onData = function(data){
            alert('Received from socket: '+data);   
    }

    // Setup our socket in the div with the id="socket"
    socket.setup('mySocket');       
</script>

0

Gerçekten aradığınız çözüm web soketleridir. Ancak, krom proje doğrudan TCP bağlantıları olan bazı yeni teknolojiler geliştirdi TCP krom


0

İstediğinizi elde etmek için iki uygulama yazmanız gerekir (örneğin Java veya Python'da):

  1. İstemcinin makinesinde bulunan ve hem TCP / IP soketleri hem de Web Soketleri ile ilgilenebilen köprü uygulaması. Söz konusu TCP / IP soketi ile etkileşime girecektir.

  2. WebSockets konuşabilen sunucu tarafı uygulama (JSP / Servlet WAR gibi). Bir tarayıcı tarafından erişilebilecek en az bir HTML sayfası (gerekirse sunucu tarafı işleme kodu dahil) içerir.

Bu şekilde çalışmalı

  1. Bridge, web uygulamasına bir WS bağlantısı açacaktır (çünkü bir sunucu bir istemciye bağlanamaz).
  2. Web uygulaması, müşteriden kendisini tanıtmasını isteyecektir
  3. Köprü istemcisi, bazı kimlik bilgilerini, köprüyü tanımlamak için depolayan sunucuya gönderir.
    1. Tarayıcı tarafından görüntülenebilir sayfa, JS kullanarak WS sunucusuna bağlanır.
    2. 3. adımı tekrarlayın, ancak JS tabanlı sayfa için
    3. JS tabanlı sayfa, sunucuya, hangi köprüye gitmesi gerektiği de dahil olmak üzere bir komut gönderir.
    4. Sunucu, komutu köprüye iletir.
    5. Köprü bir TCP / IP soketi açar ve onunla etkileşime girer (bir mesaj gönderir, bir yanıt alır).
    6. Bridge, WS aracılığıyla sunucuya bir yanıt gönderir
    7. WS, yanıtı tarayıcıda görüntülenebilir sayfaya iletir
    8. JS yanıtı işler ve buna göre tepki verir
    9. İstemcilerden biri bağlantıyı kesene / kaldırana kadar tekrarlayın

Not 1: Yukarıdaki adımlar büyük bir basitleştirmedir ve istemcinin bağlantısının zamanından önce kesilmesi veya sunucunun istemcilere kapandığını / yeniden başlatıldığını bildirmesi gerektiğinde hata işleme ve keepAlive istekleri hakkında bilgi içermez.

Not 2: İhtiyaçlarınıza bağlı olarak, söz konusu TCP / IP soket sunucusu (köprünün iletişim kurduğu) sunucu uygulamasıyla aynı makinedeyse, bu bileşenleri tek bir yerde birleştirmek mümkün olabilir.

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.