2016-03-21 5 views
1

Ich arbeite an einem einfachen Server, nur um zu lernen, wie es funktioniert. Ich habe einen Java-Server und einen Java-Client, um zu arbeiten, aber der Versuch, einen Javascript-Client zu bekommen, um mich mit demselben Java-Server zu verbinden, macht mich verrückt!Javascript-Client kann keine Verbindung zu Java-Server

Java Server:

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.ServerSocket; 
import java.net.Socket; 

public class DateServer { 

    public static void main(String[] args) throws IOException { 
     ServerSocket listener = new ServerSocket(9091); 
     System.out.println("Starting"); 
     try { 
      while (true) { 
       System.out.println("While"); 
       Socket socket = listener.accept(); 
       System.out.println("Accepted"); 
       BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
       String msg = input.readLine(); 
       System.out.println("Message from client: " + msg); 
       try { 
        PrintWriter out = 
         new PrintWriter(socket.getOutputStream(), true); 

        System.out.println("Sending message..."); 
        out.println("Hi"); 
       } finally { 
        System.out.println("Closing socket"); 
        socket.close(); 
       } 
      } 
     } 
     finally { 
      listener.close(); 
     } 
    } 
} 

Java-Client: (das funktioniert)

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.Socket; 
import java.net.UnknownHostException; 

import javax.swing.JOptionPane; 

public class DateClient { 

    public static void main(String[] args) throws IOException { 
     Socket s = new Socket("localhost", 9091); 

     try { 
      PrintWriter out = 
       new PrintWriter(s.getOutputStream(), true); 

      System.out.println("Sending message..."); 
      out.println("I'm the client"); 
     } finally { 
      //System.out.println("Closing socket"); 
      //s.close(); 
     } 

     BufferedReader input = new BufferedReader(new InputStreamReader(s.getInputStream())); 
     String msg = input.readLine(); 
     System.out.println(msg); 
     JOptionPane.showMessageDialog(null, msg); 
     s.close(); 
     System.exit(0); 
    } 
} 

JavaScript-Client:

<!DOCTYPE html> 

<html> 
<head> 
     <title>Echo Test</title> 
     <meta charset="UTF-8"> 
     <meta name="viewport" content="width=device-width"> 
    </head> 
<body> 
<div id="messages"></div> 
<script type="text/javascript"> 

var connection = new WebSocket('ws://localhost:9091/'); 
var messages = document.getElementById("messages"); 

// When the connection is open, send some data to the server 
connection.onopen = function (e) { 
    writeResponse('sent'); 
    connection.send('Ping'); 
} 

// Log errors 
connection.onerror = function (error) { 
    writeResponse('Error: ' + error); 
} 

connection.onclose = function(e){ 
    writeResponse("Disconnected: " + e.data); 
} 

// Log messages from the server 
connection.onmessage = function (e) { 
    writeResponse('Server: ' + e.data); 
} 

function writeResponse(text){ 
       messages.innerHTML += "<br/>" + text; 
      } 

</script> 
</body> 
</html> 

Wenn ich den Java-Client mit dem Server laufen, erhalte ich:

Starting 
While 
Accepted 
Message from client: I'm the client 
Sending message... 
Closing socket 
While 

und von dem Client:

Sending message... 
Hi 

So, das funktioniert. Wenn ich den JavaScript-Client ausführen, Ausgabe des Servers ist:

Starting 
While 
Accepted 
Message from client: GET/HTTP/1.1 
Sending message... 
Closing socket 
While 

Und die Ausgabe auf der JavaScript-Seite lautet:

Error: [object Event] 
Disconnected: undefined 

Auch firefox Konsole sagt „Firefox keine Verbindung zu dem herstellen kann Server unter ws: // localhost: 9091/". Was vermisse ich? Vielen Dank!

Antwort

1

Eine WebSocket-Verbindung von einem Browser ist nicht nur eine reine TCP-Verbindung. Es MUSS das vollständige webSocket-Protokoll unterstützen oder der Browser kann keine Verbindung herstellen oder Daten austauschen. Das vollständige WebSocket-Protokoll enthält:

  1. Eine erste Verbindung über HTTP
  2. Ein Upgrade auf das WebSocket-Protokoll
  3. Das Sicherheitsverfahren für eine WebSocket-Verbindung zu initialisieren
  4. Das WebSocket-Datenpaketformat

Sie können mehr darüber hier lesen: https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_servers

+0

Danke! Die Seite zeigte mir die richtige Richtung, um eine HTTP-Antwort zu schreiben und den richtigen sec-websocket-accept-Schlüssel zu senden. Der Client verbindet sich nun mit dem Server :) – Arlo

+0

@Arlo - Zuvor gab es bereits Klassen, die einen webSocket-Server implementieren Java. Vielleicht möchten Sie sich nur eines davon aussuchen, anstatt das gesamte Protokoll selbst neu zu implementieren. – jfriend00