2016-02-01 3 views
0

Это на стороне клиентаКак правильно подключить клиента к серверу с помощью websockets?

public class WidgetView extends Region { 
    private WebView webView; 
    private WebEngine webEngine; 
    private ClientService service = new ClientService(); 
    public WidgetView() { 
     setPrefSize(1000, 600); 
     service.start(); 
     webView = new WebView(); 
     webView.setContextMenuEnabled(false); 
     webEngine = webView.getEngine(); 
     webEngine.setOnAlert(event -> { 
      System.out.println(event.getData().toString()); 
      sendToServer(event.getData().toString()); 
      //do something... 

     }); 
     URL url = getClass().getResource("/ru/parus/imctax/web/index.html"); 
     webEngine.load(url.toExternalForm()); 
     getChildren().add(webView); 
    } 
    private void sendToServer(String json) { 
     service.sendJson(json); 
     System.out.println("Данные были отправлены!"); 
    } 
    class ClientService extends Service<Session> { 
     private Session session; 
     @Override 
     protected Task<Session> createTask() { 
      Task<Session> task = new Task<Session>() { 
       @Override 
       protected Session call() throws Exception { 
        ClientManager client = ClientManager.createClient(); 
        ClientEndpointConfig endpointConfig = ClientEndpointConfig.Builder.create().build(); 
        URI uri = new URI("imc://localhost:8080/imc"); 
        session = client.connectToServer(new ClientEndpoint(), endpointConfig, uri); 
        return session; 
       } 
      }; 
      return task; 
     } 
     void sendJson(String json) { 
      //--------- 
      if (session == null) { 
       System.out.println("Session is null (("); 
       //This message printed on console 
      }//--------- 
      if (session != null) { 
       try { 
        System.out.println("Объект отправлен"); 
        session.getBasicRemote().sendText(json); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
     void closeSession() { 
      if (session != null) { 
       try { 
        session.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 
} 

ClientEndpoint

public class ClientEndpoint extends Endpoint { 
    public ClientEndpoint() { 
    } 
    @Override 
    public void onOpen(Session session, EndpointConfig endpointConfig) { 
     session.addMessageHandler(new MessageHandler.Whole<String>() { 
      @Override 
      public void onMessage(String s) { 
       System.out.println("Called method 'onMessage'. Parameter: "+s); 
      } 
     }); 
    } 
} 

стороне сервера

public class ServerMain { 
    public static void main(String[] args) { 
     Server server = new Server("localhost", 8080, "/imc", PurchaseServerEndpoint.class); 
     try { 
      server.start(); 
     } catch (DeploymentException e) { 
      e.printStackTrace(); 
      server.stop(); 
     } 
    } 
} 

//Another class in Server side 
@ServerEndpoint("/imc") 
public class PurchaseServerEndpoint { 
    @OnOpen 
    public void open(Session session) { 
     System.out.println("Session ["+session+"] is open!"); 
    } 
    @OnClose 
    public void close(Session session) { 
     System.out.println("Session ["+session+"] is closed!"); 
    } 
    @OnMessage 
    public void receiveJson(String message, Session session) { 
     System.out.println("I'm receive json: " + message); 
    } 
} 

Я начинаю ServerApplication, то я буду запускать ClientApp (FxApp с WebView). Данные не передаются, поскольку сеанс имеет значение null. Возможно, данная строка неправильная?

session = client.connectToServer(new ClientEndpoint(), endpointConfig, uri); 

Как это сделать?

ответ

0
URI uri = new URI("imc://localhost:8080/imc"); 

Может быть, это должно нравится:

URI uri = new URI("ws://localhost:8080/imc"); 

А если развернуть сервер на какой-то сервер приложений, чем в контексте пути появится дополнительный пункт - имя приложения. Например, ws://localhost:8080/application_name/imc

+0

Спасибо, но это не сработает. – Dmitry

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