2017-07-23 1 views
0

Ich versuche einen einfachen Java Client mit einem NodeJS Server zu verbinden, aber leider funktioniert das nicht so gut. Ich nahm den Client-Code aus dem Java Doc und änderte nur den Hostnamen und den Port. Jetzt läuft mein Server auf dem selben Computer wie der Client und der Port ist 4555. Wenn ich nicht den gleichen Port auf dem Client habe und der Server dann einen Fehler bekomme, habe ich das überprüft. Auch wenn ich den Hostnamen in irgendeinen willkürlichen (nicht localhost) im Klienten ändere, wird ein Fehler geworfen. Dies deutet darauf hin, dass Fehler auftreten, wenn ich keine Verbindung herstellen kann. Das lustige ist, wenn ich den Port auf 4555 und den Hostnamen auf "localhost" gesetzt habe, bekomme ich keinen dieser Fehler und mein Client funktioniert gut, was mich denken lässt, dass ich eine Verbindung bekomme, aber ich bekomme die nicht Nachricht "Client verbunden" auf meiner Serverseite. Irgendwelche Vorschläge?Sockets - Java Client und NodeJS Server

Der Server-Code:

var app = require('express')(); 
var http = require('http').Server(app); 
var io = require('socket.io')(http); 
var port = 4555; 

app.get('/', function(req, res) 
{ 
    res.sendFile(__dirname + '/index.html'); 
}); 

io.on('connection', function(socket) 
{ 
    //When I connect to to localhost:4555 through the web browser(chrome) 
    //this message is actually shown so the connection works there. 
    console.log('client connected'); 
}); 

http.listen(port, function() 
{ 
    //Message shown on program start 
    console.log("app running"); 
}); 

Der Client-Code:

import java.io.*; 
import java.net.*; 

public class Main 
{ 
    public static void main(String[] args) throws IOException 
    { 
     String hostName = "localhost"; 
     int portNumber = 4555; 

     try (
      Socket echoSocket = new Socket(hostName, portNumber); 
      PrintWriter out = 
       new PrintWriter(echoSocket.getOutputStream(), true); 
      BufferedReader in = 
       new BufferedReader(
        new InputStreamReader(echoSocket.getInputStream())); 
      BufferedReader stdIn = 
       new BufferedReader(
        new InputStreamReader(System.in)) 
     ) { 
      String userInput; 
      while ((userInput = stdIn.readLine()) != null) { 
       out.println(userInput); 
       System.out.println("echo: " + in.readLine()); 
      } 
     } catch (UnknownHostException e) { 
      System.err.println("Don't know about host " + hostName); 
      System.exit(1); 
     } catch (IOException e) { 
      System.err.println("Couldn't get I/O for the connection to " + 
       hostName); 
      System.exit(1); 
     } 
    } 
} 
+0

Warum verwenden Sie die ApacheHTTPClient-Bibliothek nicht, um eine Anfrage von Ihrem Java-Client zu stellen? –

+0

Verwenden Sie eine Portnummer über 8000. – efekctive

+0

Sie haben einen Client und einen Server. Ihr Server muss den Anschluss überwachen, mit dem der Client verbunden ist, und der Client muss eine Verbindung zu dem Anschluss herstellen, den der Server überwacht. Ansonsten habe ich keine Ahnung, welcher Fehler vom Server kommt und welcher vom Client kommt. Der Hostname ist auch nicht willkürlich, er muss zu etwas Sinnvollem aufgelöst werden. –

Antwort

1

Um die "Client verbunden" Nachricht zu erhalten, müssen Sie eine erfolgreiche socket.io Verbindung. socket.io ist ein Messaging-Datenformat, das auf dem webSocket-Protokoll basiert. Um eine Verbindung zu einem socket.io-Server herzustellen, benötigen Sie einen socket.io-Client. Sie können keine Verbindung zu einem socket.io-Server mit einem einfachen TCP-Client herstellen, was Sie scheinbar zu tun versuchen.

Nur um Ihnen eine Vorstellung davon zu geben, was hier wahrscheinlich passiert, erwartet socket.io eine eingehende webSocket-Verbindung (die als HTTP-Verbindung startet, die dann aufgrund einiger spezieller Header auf dem webSocket-Protokoll "aktualisiert" wird) Eingehende HTTP-Verbindung: Die socket.io-Datei fügt ihr eigenes Datenformat über den webSocket-Datenrahmen hinzu.So kann nur ein socket.io-Client mit einem socket.io-Server sprechen.Der socket.io-Server weist die eingehende Verbindung danach zurück stellt eine Verbindung her, weil die Anfangsdaten der Verbindung nicht in das richtige Format passen

Siehe Writing webSocket Servers, um Ihnen eine Vorstellung davon zu geben, was mit der Verbindung zu einem webSocket-Server verbunden ist. Es gibt ein anfängliches Verbindungsanforderungsformat unter Verwendung von HTTP. Dort sind Sicherheits-Header, dann gibt es ein Upgrade auf das WebSocket-Protokoll, dann gibt es ein Datenrahmen-Format mit Verschlüsselung und dann socket.io fügt dann eine Nachricht Datenformat über all dies. Wenn Ihr Client versucht, eine Verbindung mit einem Server herzustellen, der all dies erwartet, sagt der Server nur, dass dies ein Müll ist und die Verbindung abbricht.

Wenn Sie eine reine TCP-Verbindung wünschen, können Sie einen einfachen TCP-Server in Ihrem node.js-Server verwenden und eine Verbindung zu diesem herstellen. Sie möchten eine socket.io-Verbindung, dann können Sie eine socket.io client library for Java bekommen und diese anstelle Ihres einfachen Socket verwenden, um mit Ihrem socket.io-Server zu sprechen.

+0

@leburger - Beantwortet das deine Frage? Wenn dies der Fall ist, können Sie dies der Community anzeigen, indem Sie auf das grüne Häkchen links neben der Antwort klicken. Dadurch erhalten Sie auch einige Reputationspunkte. – jfriend00