2017-01-04 10 views
5

Я пытаюсь сделать связь между сервером в Java и JavaScript клиент, но я получаю эту ошибку на стороне клиента:сервер Java JavaScript клиент WebSockets

связи WebSocket к «WS://127.0.0.1:4444/»не удались: Соединение закрыто до получения ответа квитирования

Это может быть, остается на открывающемся состояние, так как функция connection.onopen никогда не вызываются. console.log('Connected!') не вызывается.

Может кто-то дайте мне знать, что происходит здесь не так?

Сервер

import java.io.IOException; 
import java.net.ServerSocket; 

public class Server { 

    public static void main(String[] args) throws IOException { 

     try (ServerSocket serverSocket = new ServerSocket(4444)) { 
      GameProtocol gp = new GameProtocol(); 

      ServerThread player= new ServerThread(serverSocket.accept(), gp); 
      player.start(); 

     } catch (IOException e) { 
      System.out.println("Could not listen on port: 4444"); 
      System.exit(-1); 
     } 

    } 

} 

ServerThread

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

public class ServerThread extends Thread{ 

    private Socket socket = null; 
    private GameProtocol gp; 

    public ServerThread(Socket socket, GameProtocol gp) { 
     super("ServerThread"); 
     this.socket = socket; 
     this.gp = gp; 
    } 

    public void run() { 

     try (
       PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 
       BufferedReader in = new BufferedReader(
         new InputStreamReader(
           socket.getInputStream())); 
       ) { 
      String inputLine, outputLine; 

      while ((inputLine = in.readLine()) != null) { 
       outputLine = gp.processInput(inputLine); 
       System.out.println(outputLine); 
      } 
      socket.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

GameProtocol

public class GameProtocol { 

    public String processInput(String theInput) { 

     String theOutput = null; 

     theOutput = theInput; 

     return theOutput; 
    } 
} 

Клиент

var connection = new WebSocket('ws://127.0.0.1:4444'); 

    connection.onopen = function() { 
    console.log('Connected!'); 
    connection.send('Ping'); // Send the message 'Ping' to the server 
    }; 

    // Log errors 
    connection.onerror = function (error) { 
    console.log('WebSocket Error ' + error); 
    }; 

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

Я попробовал и он работал просто отлично ... ВАЗе t браузер, который вы используете для своего теста? Кроме того, есть ли какой-либо брандмауэр, который мог бы блокировать/блокировать ответ? – Igor

+0

Я использую Chrome 55. Не знаю. Кроме того, если я распечатываю ответ на стороне сервера, я получил сообщение, которое я поставил выше. – agfac

+0

Все кажется нормально ... Может, попробуй еще один порт? Как и 12000 или выше, я слышал, что некоторые системы не любят низкие номера портов ... Я просто размышляю, потому что я понятия не имею, что может быть разница между нашими настройками ... – Igor

ответ

4

Начнем с того, как ваш код выглядит идентично Java- и JavaScript один. Обе работы за то, что они являются дизайн, но факты, что вы пытаетесь подключиться клиент WebSocket на сервер сокета.

Как я знаю, что это две разные вещи, касающиеся этого answer.

Из моего опыта, я никогда не пробовал свой путь. Тем не менее, если у меня есть сетевое приложение, которые используют сокет, чем это было бы сокет чистый клиент/сервер, и если был веб-приложение, чем я хотел бы использовать WebSocket с обеих сторон, а также.

До сих пор так хорошо :)

Чтобы сделать свой день с меньшей болью, как это answer говорит, я хотел бы предложить вам использовать любой доступный WebSocket на стороне сервера и ваша проблема решена.

Я использую обычно WebSocket for Java, и вот пример реализации, который я протестировал с вашим кодом клиента, и он работает как на стороне клиента, так и на стороне сервера.

import org.java_websocket.WebSocket; 
import org.java_websocket.handshake.ClientHandshake; 
import org.java_websocket.server.WebSocketServer; 

import java.net.InetSocketAddress; 
import java.util.HashSet; 
import java.util.Set; 

public class WebsocketServer extends WebSocketServer { 

    private static int TCP_PORT = 4444; 

    private Set<WebSocket> conns; 

    public WebsocketServer() { 
     super(new InetSocketAddress(TCP_PORT)); 
     conns = new HashSet<>(); 
    } 

    @Override 
    public void onOpen(WebSocket conn, ClientHandshake handshake) { 
     conns.add(conn); 
     System.out.println("New connection from " + conn.getRemoteSocketAddress().getAddress().getHostAddress()); 
    } 

    @Override 
    public void onClose(WebSocket conn, int code, String reason, boolean remote) { 
     conns.remove(conn); 
     System.out.println("Closed connection to " + conn.getRemoteSocketAddress().getAddress().getHostAddress()); 
    } 

    @Override 
    public void onMessage(WebSocket conn, String message) { 
     System.out.println("Message from client: " + message); 
     for (WebSocket sock : conns) { 
      sock.send(message); 
     } 
    } 

    @Override 
    public void onError(WebSocket conn, Exception ex) { 
     //ex.printStackTrace(); 
     if (conn != null) { 
      conns.remove(conn); 
      // do some thing if required 
     } 
     System.out.println("ERROR from " + conn.getRemoteSocketAddress().getAddress().getHostAddress()); 
    } 

} 

На ваш основной метод просто:

new WebsocketServer().start(); 

Вам может понадобиться манипулировать код, чтобы установить его с этой реализации, но это должно быть частью работы.

Вот тест выход 2 тестов:

New connection from 127.0.0.1 
Message from client: Ping 
Closed connection to 127.0.0.1 
New connection from 127.0.0.1 
Message from client: Ping 

здесь конфигурации Maven WebSocket, в противном случае загрузите файл JAR/сек вручную и импортировать его в IDE/среде разработки:

<!-- https://mvnrepository.com/artifact/org.java-websocket/Java-WebSocket --> 
<dependency> 
    <groupId>org.java-websocket</groupId> 
    <artifactId>Java-WebSocket</artifactId> 
    <version>1.3.0</version> 
</dependency> 

WebSocket подробнее: http://java-websocket.org

+1

Это работает! Большое спасибо! – agfac

+0

Нет проблем, вы также можете получить мой голос –

 Смежные вопросы

  • Нет связанных вопросов^_^