2016-03-21 18 views
1

私は単純なサーバで作業しています。私は動作するようにJavaサーバーとJavaクライアントを持っていますが、同じJavaサーバーに接続するためのjavascriptクライアントを取得しようとすると、私は夢中になります!Javascriptクライアントはjavaサーバに接続できません

Javaサーバ:

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クライアント:(作品)

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クライアント:

<!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> 

私は私が得るサーバとJavaクライアントを実行すると:

Starting 
While 
Accepted 
Message from client: I'm the client 
Sending message... 
Closing socket 
While 
クライアントから

と出力:

Sending message... 
Hi 

ので、動作します。

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

とJavaScriptページの出力は次のとおりです:私はjavascriptのクライアントを実行すると、サーバーの出力がある。また

Error: [object Event] 
Disconnected: undefined 

、FirefoxのコンソールはFirefoxがへの接続を確立することはできません」と言いますserver at ws:// localhost:9091/"と入力します。私は何が欠けていますか?ありがとう!

答えて

1

ブラウザからのwebSocket接続は単なるTCP接続ではありません。完全なwebSocketプロトコルをサポートしている必要があります。そうしないと、ブラウザは接続できず、データを交換できなくなります。このフルのWebSocketプロトコルが含まれています:HTTP経由

  1. 初期接続
  2. のWebSocketプロトコルへのアップグレード
  3. のWebSocket接続
  4. のWebSocketのデータパケットフォーマット
を初期化するためのセキュリティ手順

詳細については、こちらをご覧ください。https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_servers

+0

ありがとうございました!このページはHTTP応答を書いて正しいsec-websocket-acceptキーを送る正しい方向を指していました。クライアントは今サーバに接続します:) – Arlo

+0

@Arlo - FYI、webSocketサーバを実装している既存のクラスがありますJava。自分自身でプロトコル全体を再実装するのではなく、それらのうちの1つを取得することができます。 – jfriend00