这是客户端
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