Menghubungkan ke Soket TCP dari browser menggunakan javascript

111

Saya memiliki aplikasi vb.net yang membuka soket dan mendengarkannya.

Saya perlu berkomunikasi melalui soket ini ke aplikasi itu menggunakan javascript yang berjalan di browser. Yaitu saya perlu mengirim beberapa data di soket ini sehingga aplikasi yang mendengarkan di soket ini dapat mengambil data itu, melakukan beberapa hal menggunakan beberapa panggilan jarak jauh dan mendapatkan lebih banyak data dan meletakkannya kembali di soket yang dibutuhkan javascript saya membaca dan mencetaknya di browser.

Saya sudah mencoba, socket.io, websockify tetapi tidak ada yang terbukti berguna.

Oleh karena itu pertanyaannya, apakah yang saya coba mungkin? Adakah cara agar javascript yang berjalan di browser dapat terhubung ke soket tcp dan mengirim beberapa data dan mendengarkannya untuk beberapa respons data lagi pada soket dan mencetaknya ke browser.

Jika ini memungkinkan, dapatkah seseorang mengarahkan saya ke arah yang benar yang akan membantu saya menetapkan tujuan.

ikan todak
sumber
3
Tidak, Anda terbatas pada WebSockets
Bergi
2
@Bergi - HTTP adalah protokol di atas tcp, jadi mengapa koneksi HTTP dapat dibuat tetapi bukan TCP?
AlikElzin-kilaka
@kilaka: Karena API (standar) yang tersedia di lingkungan browser dibatasi untuk itu .
Bergi
Kemungkinan duplikat: stackoverflow.com/questions/9154035/…
AlikElzin-kilaka
6
Saya melihat standar baru merayap di punggung Javascript: w3.org/TR/raw-sockets .
AlikElzin-kilaka

Jawaban:

57

Adapun masalah Anda, saat ini Anda harus bergantung pada XHR atau websockets untuk ini.

Saat ini tidak ada browser populer yang menerapkan api soket mentah untuk javascript yang memungkinkan Anda membuat dan mengakses soket mentah, tetapi draf untuk penerapan api soket mentah di JavaScript sedang dalam proses. Lihat tautan ini:
http://www.w3.org/TR/raw-sockets/
https://developer.mozilla.org/en-US/docs/Web/API/TCPSocket

Chrome sekarang memiliki dukungan untuk soket TCP dan UDP mentah di API 'eksperimental'. Fitur-fitur ini hanya tersedia untuk ekstensi dan, meskipun didokumentasikan, disembunyikan untuk saat ini. Karena itu, beberapa pengembang sudah membuat proyek menarik dengan menggunakannya, seperti klien IRC ini .

Untuk mengakses API ini, Anda harus mengaktifkan tanda eksperimental di manifes ekstensi Anda. Menggunakan soket cukup mudah, misalnya:

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!");         
    });
});
Robin Rizvi
sumber
Browser apa yang mendukung soket mentah?
AlikElzin-kilaka
2
Adakah peningkatan kinerja dibandingkan dengan Websockets dan Rawsockets?
NiCk Newman
3
Bukankah mengizinkan javascript di Browser untuk terhubung ke port tcp, sebuah celah keamanan? Bayangkan javascript di firefox / chrome Anda terhubung ke apa pun yang Anda jalankan secara lokal (katakanlah MySQL DB) dan publikasikan data ke situs jahat?
Arun Avanathan
@ArunAvanathan apa pun yang Anda lakukan dengan ajax dapat Anda lakukan dengan soket dan sebaliknya ... tidak ada masalah keamanan seperti yang saya pikirkan.
Firas Abd Alrahman
1
@FirasAbdAlrahman Saya rasa ada berbagai kebijakan keamanan yang mengatur perilaku browser untuk HTTP / S. Jadi koneksi soket browser melalui TCP tidak sama dengan HTTP / S.
Arun Avanathan
30

Ini akan dimungkinkan melalui antarmuka navigator seperti yang ditunjukkan di bawah ini:

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

Detail selengkapnya diuraikan di dokumentasi tcp-udp-sockets w3.org.

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

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

Alternatif lain adalah menggunakan Soket Chrome

Membuat koneksi

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

Mengirim data

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

Menerima data

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

Anda juga dapat menggunakan upaya untuk menggunakan HTML5 Web Sockets(Meskipun ini bukan komunikasi TCP langsung):

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/

Server Anda juga harus mendengarkan dengan server WebSocket seperti pywebsocket, atau Anda dapat menulis sendiri seperti yang diuraikan di Mozilla

Darren
sumber
25
Untuk menguraikan lebih banyak tentang jawaban ini: server juga harus mendengarkan dengan server WebSocket. WebSockets tidak dapat terhubung langsung ke soket TCP mentah. websockify adalah alat yang bertindak sebagai proxy WebSocket-to-TCP: ia berada di server Anda dan mendengarkan koneksi WebSocket, lalu meneruskan komunikasi WebSocket ke dan dari soket TCP yang ditentukan.
apsillers
58
Ini tidak menjawab pertanyaan - websocket adalah protokol melalui TCP (seperti HTTP misalnya) dan bukan komunikasi TCP langsung.
AlikElzin-kilaka
1
tapi bagaimana cara meletakkan pesan di jendela browser? :(
shzyincu
3
Jawaban ini sepenuhnya salah dan harus dihapus.
Brad
1
@Brad, jawaban ini membantu saya dan pasti telah membantu beberapa orang lain yang juga memiliki 22 suara positif.
user1378687
6

Proyek ws2s ditujukan untuk membawa soket ke sisi browser js. Ini adalah server websocket yang mengubah websocket menjadi socket.

diagram skematik ws2s

masukkan deskripsi gambar di sini

contoh kode:

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)
}
chenyan
sumber
5

Lihat jsocket . Belum pernah menggunakannya sendiri. Sudah lebih dari 3 tahun sejak pembaruan terakhir (per 26/6/2014).

* Menggunakan flash :(

Dari dokumentasi :

<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>
AlikElzin-kilaka
sumber
0

Solusi yang benar-benar Anda cari adalah soket web. Namun proyek chromium telah mengembangkan beberapa teknologi baru yaitu koneksi TCP langsung chromium TCP

Sdedelbrock
sumber
0

Untuk mencapai apa yang Anda inginkan, Anda harus menulis dua aplikasi (dalam Java atau Python, misalnya):

  1. Aplikasi jembatan yang berada di mesin klien dan dapat menangani soket TCP / IP dan WebSockets. Ini akan berinteraksi dengan soket TCP / IP yang dimaksud.

  2. Aplikasi sisi server (seperti JSP / Servlet WAR) yang dapat menggunakan WebSockets. Ini mencakup setidaknya satu halaman HTML (termasuk kode pemrosesan sisi server jika perlu) untuk diakses oleh browser.

Ini harus bekerja seperti ini

  1. Bridge akan membuka koneksi WS ke aplikasi web (karena server tidak dapat terhubung ke klien).
  2. Aplikasi Web akan meminta klien untuk mengidentifikasi dirinya sendiri
  3. Klien jembatan mengirimkan beberapa informasi ID ke server, yang menyimpannya untuk mengidentifikasi jembatan.
    1. Halaman yang dapat dilihat browser terhubung ke server WS menggunakan JS.
    2. Ulangi langkah 3, tetapi untuk halaman berbasis JS
    3. Halaman berbasis JS mengirimkan perintah ke server, termasuk jembatan mana yang harus dituju.
    4. Server meneruskan perintah ke jembatan.
    5. Bridge membuka soket TCP / IP dan berinteraksi dengannya (mengirim pesan, mendapat respons).
    6. Bridge mengirimkan respons ke server melalui WS
    7. WS meneruskan respons ke halaman yang dapat dilihat browser
    8. JS memproses respons dan bereaksi sesuai itu
    9. Ulangi hingga salah satu klien memutuskan / membongkar

Catatan 1: Langkah-langkah di atas adalah penyederhanaan yang sangat besar dan tidak menyertakan informasi tentang penanganan kesalahan dan permintaan keepAlive, jika klien memutuskan sambungan sebelum waktunya atau server perlu memberi tahu klien bahwa ia sedang mematikan / memulai ulang.

Catatan 2: Bergantung pada kebutuhan Anda, dimungkinkan untuk menggabungkan komponen-komponen ini menjadi satu jika server soket TCP / IP yang dimaksud (yang dibicarakan jembatan) berada di komputer yang sama dengan aplikasi server.

Agi Hammerthief
sumber