如何使用 websocket 将客户端正确连接到服务器



这是客户端

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();
                }
            }
        }
    }
}

客户端终结点

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 with WebView)。数据未传递,因为会话为空。也许这条线不正确?

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

如何使其正确?

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

也许它应该是这样的:

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

如果将服务器部署到某个应用程序服务器,则在上下文路径中会出现附加项 - 应用程序名称。例如,ws://localhost:8080/application_name/imc

相关内容

  • 没有找到相关文章

最新更新