2016-03-21 27 views
1

Basit bir sunucu üzerinde çalışıyorum, nasıl çalıştığını öğrenmek için. Çalışmak için bir java sunucum ve java istemcim var ama aynı java sunucusuna bağlanmak için javascript istemcisi almaya çalışmak beni deli ediyor!Javascript istemcisi java sunucusuna bağlanamıyor

Java sunucusu:

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 istemci: (işleri)

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 istemci:

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

ben almak sunucu ile java istemcisini çalıştırdığınızda:

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

ve çıkışı:

Sending message... 
Hi 

Yani çalışır.

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

Ve javascript sayfadaki çıkışı: Ben javascript istemci çalıştırdığınızda, sunucunun çıkışı Ayrıca

Error: [object Event] 
Disconnected: undefined 

, firefox konsolu Firefox bağlantı kurmak olamaz" diyor ws sunucusunda: // localhost: 9091/". Neyi kaçırıyorum? Teşekkürler!

cevap

1

bir tarayıcıdan bir WebSocket'e bağlantısı sadece düz bir TCP bağlantısı yoktur. Tam webSocket protokolünü desteklemeli veya tarayıcı buna bağlanamayacak veya veri alışverişi yapamayacaktır. Bu, tam WebSocket protokolü aşağıdakileri içerir: HTTP

  1. bir ilk bağlantı
  2. WebSocket protokolüne yükseltme
  3. bir WebSocket bağlantı
  4. WebSocket veri paketi formatı
başlatılması için güvenlik prosedürü

Daha fazla bilgiyi buradan edinebilirsiniz: https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_servers

+0

Teşekkürler! Sayfa bir HTTP yanıtı yazmak ve doğru sec-websocket-kabul anahtarını göndermek için doğru yönü işaret etti ve istemci şimdi sunucuya bağlanıyor :) – Arlo

+0

@Arlo - FYI, zaten bir webSocket sunucusunu uygulayan mevcut sınıflar var Java. Protokolün tamamını yeniden uygulamak yerine bunlardan birini almak isteyebilirsiniz. – jfriend00

İlgili konular