• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

TCP to websocket Bridge funktioniert nicht [Node.js]

xorg1990

Neues Mitglied
Hi, ich versuche die Daten einer TCP Verbindung in eine Websocket-Verbindung zu schreiben.
Nur beim connect auf den Server bricht das Skript ab, mit der Fehlermeldung:
Error: listen EADDRINUSE .

Manchmal kommt aber auch „read ECONNRESET“, das hängt ganz davon ab mit welchem Programm ich mein Script teste Netcat oder Telnet.

Code:
var net = require('net');
var BinaryServer = require('binaryjs').BinaryServer;

function InitSocketCallbacks(state,bs,s){
   
   
        function flushSocketBuffer() {
                if(state.sBuffer.length > 0) {
                        s.write(Buffer.concat(state.sBuffer));
                }
                state.sBuffer = null;
        };
       
        function flushWebsocketBuffer() {
                if(state.wsBuffer.length > 0) {
                bs.send(Buffer.concat(state.wsBuffer));
                }
                state.wsBuffer = null;
        };
           
        s.on('connect', function() {
                state.sReady = true;
                console.log('user connected');
                flushSocketBuffer();
        });
       
        bs.on('open', function () {
                state.wsReady = true;
                flushWebsocketBuffer();
        });
   
        s.on('data', function(data) {
           
                if(! state.wsReady) {
                        state.wsBuffer.push(data);
                } else {
                        bs.send(data);
                }
        });
   
}

var socket = net.createServer(function(s){
    var bs = BinaryServer({port: 8088});

    var state = {
                        sReady : false,
                        wsReady : false,
                        wsBuffer: [],
                        sBuffer : []
                };
    InitSocketCallbacks(state,bs,s);
});
socket.listen(3000);

console.log('Server started at port 3000');

Ich habe mir extra ein console.log('user connected'); eingebaut, aber selbst bis dahin kommt das Script nicht.

Sry das ich jetzt hier frage, ich habe noch kein passendes Forum für Node.js gefunden.
 
Werbung:
Moin,
ich bin jetzt nicht besonders affin mit node.js, aber was mir auffällt ist das du zwei server startest. Den normalen websocket und den BinaryServer. Ich glaube nicht dass das nötig ist, da du dem BinaryServer ja schon einen Port mitgibst.

Error: listen EADDRINUSE
das sagt, der Port ist belegt.

read ECONNRESET
sagt, das der zugreifende Client keine Daten entgegengenommen hat.

MfG
 
`N Abend ,
kann ich mir nicht so recht vorstellen das, dass Problem ist weil,
dann müsste der Fehler ja schon auftreten wenn ich das Script starte.

Der Fehler kommt erst wenn ich auf den TCP Server zugreife.

Der Binary Server wird benötigt damit ich später mit den Browser auf den Server connecten kann.
Außerdem hat der BinaryServer den Port 8088 und der TCP Server den Port 3000.

Vorher hatte ich mal was mit net.CreateConnection gemacht aber da ist mir nach einer gewissen Zeit immer der Server eingefroren.

Ich komme immer auf dieselbe Frage zurück: Kann ich die Daten einer TCP Verbindung einfach so in einen Websocket Verbindung schreiben?
Ich meine irgendwo muss ich ja mal buffern, daten aufteilen in Chunks, irgend so was.

Vielleicht hat ja noch jemand eine Idee.
 
Werbung:
Hi, ich muss euch doch noch mal mit meinem Skript belasten. Ich habe jetzt weil’s einfach nicht funktionierte noch mal neu angefangen. Jetzt bin ich soweit das Daten im Browser ankommen:), nur wird der geschlossen stürzt das Skript ab:mad:.

Fehlermeldung:
throw new Error('Stream is not writable');
^
Error: Stream is not writable
at BinaryStream.write (/home/xorg1990/Dokumente/node_modules/binaryjs/lib/stream.js:84:11)
at Socket.<anonymous> (/home/xorg1990/Dokumente/wsserver.js:38:11)
at Socket.EventEmitter.emit (events.js:95:17)
at Socket.<anonymous> (_stream_readable.js:710:14)
at Socket.EventEmitter.emit (events.js:92:17)
at emitReadable_ (_stream_readable.js:382:10)
at emitReadable (_stream_readable.js:378:5)
at readableAddChunk (_stream_readable.js:143:7)
at Socket.Readable.push (_stream_readable.js:113:10)
at TCP.onread (net.js:511:21)

Server:
Code:
var net = require('net');
var BinaryServer = require('binaryjs').BinaryServer;
var socket = net.createServer(function(s){
    console.log('server connected');
    var bs = BinaryServer({port: 3000});
   
    bs.on('connection', function(client){
        console.log('BsClinet connected');
        s.on('close', function(had_error){
            console.log('server disconnected');   
            bs.close();
            s.end();
        });
        s.on('error', function(e){
            console.log('socket error');
            console.log('e');
            bs.close();
            s.end();
        });
        client.on('close', function(){
            console.log('Client disconnected');
            client.close();
        });
       
        client.on('error', function(e){
            console.log('socket error');
            console.log('e');
            client.close();
        });
       
        client.on('stream', function(stream){
            s.on('data', function(data){
            console.log(data.length);
            stream.write(data);
            });
        });
           
       
               
    });
});
       
socket.listen(5000);
console.log('server started at port 3000');


Client:
Code:
<html>
<head>
  <script src="http://cdn.binaryjs.com/0/binary.js"></script>
</head>
<body>
  <script>
  var client = new BinaryClient('ws://192.168.2.104:3000');
    // Received new stream from server!
    var stream;
   
    client.on('open', function(){
    var parts = [];
        stream = client.createStream();
        stream.on('data', function(data){   
                parts.push(data);   
                document.getElementById("receive").innerHTML=(parts.length) + "bytes received";             
        });   
    });
 
  </script>

<div id="receive"> </div>
</body>
</html>

Das Problem ist, dass der event “stream” vom Client ausgelöst wird, daraufhin wird s.on(„data“ ausgelöst, wird der Browser geschlossen läuft s.on(„data“ aber weiter. Jetzt habe ich mir gedacht ich schreibe s.on(„data“ in bs.on('connection', das würde bedeuten sobald ein client connected löse s.on(„data“ aus.

Wie bekomme ich aber nun die Daten von dort nach client.on('stream'?

Hm, ich werde das Gefühl nicht los das mein Vorschlag denselben Fehler produziert:confused:.
 
Zurück
Oben