Vor kurzem wurde der Qiita-Artikel zu einem Fortschrittsbericht. Diesmal ist es eine Fortsetzung des Artikels hier.
Wenn ich ein Client-Programm normal schreibe und ausführe, wird der folgende Fehler angezeigt.
Exception in thread "main" java.lang.RuntimeException: Could not find an implementation class.
at javax.websocket.ContainerProvider.getWebSocketContainer(ContainerProvider.java:73)
at Main.main(Main.java:46)
Laut stackoverrun bietet websocket die Client-Schnittstelle, nicht jedoch die Implementierung. Daher werden wir Tyrus-Standalone-Client in Glassfish einführen. Implementieren von WebSocketContainer in der StandardWebSocketClient-Klasse
Fügen Sie es insbesondere zu den Abhängigkeiten von build.gradle hinzu.
dependencies {
//Ich habe es letztes Mal erklärt
compileOnly 'javax:javaee-api:8.0'
//Dies werde ich dieses Mal hinzufügen
compile group: 'org.glassfish.tyrus.bundles', name: 'tyrus-standalone-client', version: '1.14'
}
Jetzt schreiben wir das Programm dieses Mal sofort.
import javax.websocket.*;
import java.net.URI;
import java.util.Scanner;
//Mit dieser Anmerkung wird sie als Endpunkt des Clients erkannt
@ClientEndpoint
public class Client {
public Client() {
super();
}
//Verarbeitung beim Einrichten einer Sitzung
@OnOpen
public void onOpen(Session session) {
System.out.println("[Sitzungsaufbau]");
}
//Verarbeitung beim Empfang einer Nachricht
@OnMessage
public void onMessage(String message) {
System.out.println("[Erhalten]:" + message);
}
//Verarbeitung beim Empfang einer Nachricht
@OnError
public void onError(Throwable th) {
System.err.println(th.getMessage());
}
//Verarbeitung beim Freigeben einer Sitzung
@OnClose
public void onClose(Session session) {
System.out.println("[Trennen]");
}
static public void main(String[] args) throws Exception {
//Rufen Sie das WebSocket-Containerobjekt zur Initialisierung ab
WebSocketContainer container = ContainerProvider
.getWebSocketContainer();
//Server-Endpunkt-URI
URI uri = URI
.create("ws://localhost:8080/<Projektname>/<Verknüpfung>");
//Richten Sie eine Sitzung mit dem Serverendpunkt ein
//Suchen Sie auf dem laufenden Client nach derselben Klasse, die im Argument übergeben wurde, und stellen Sie eine Verbindung her.
Session session = container.connectToServer(Client.class, uri);
while (!session.isOpen()) {
Thread.sleep(500);
}
System.out.println("open");
try (Scanner s = new Scanner(System.in)) {
String str;
System.out.println("start loop");
while (true) {
str = s.nextLine();
if(str.equals("exit")) break;
//Senden Sie den Inhalt von str
session.getBasicRemote().sendText(str);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Da es problematisch ist, habe ich dieses Mal main in der Endpoint-Klasse geschrieben, aber ich denke, es ist besser, es zu trennen.
Starten Sie zuerst den Server mit dem Client mit tomcatRun usw. und führen Sie main in einem anderen Fenster aus.
Recommended Posts