Récemment, l'article de Qiita est devenu un rapport d'étape. Cette fois, c'est une suite de l'article ici.
Lorsque j'écris et exécute un programme client normalement, j'obtiens l'erreur suivante.
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)
Selon stackoverrun, websocket fournit l'interface client, mais pas l'implémentation. Par conséquent, nous allons introduire tyrus-standalone-client dans Glassfish. Comment implémenter WebSocketContainer dans la classe StandardWebSocketClient
Plus précisément, ajoutez-le aux dépendances de build.gradle.
dependencies {
//J'ai expliqué la dernière fois
compileOnly 'javax:javaee-api:8.0'
//C'est ce que j'ajouterai cette fois
compile group: 'org.glassfish.tyrus.bundles', name: 'tyrus-standalone-client', version: '1.14'
}
Maintenant, écrivons le programme immédiatement cette fois.
import javax.websocket.*;
import java.net.URI;
import java.util.Scanner;
//Avec cette annotation, il est reconnu comme le point final du client
@ClientEndpoint
public class Client {
public Client() {
super();
}
//Traitement lors de l'établissement d'une session
@OnOpen
public void onOpen(Session session) {
System.out.println("[Création de session]");
}
//Traitement lors de la réception d'un message
@OnMessage
public void onMessage(String message) {
System.out.println("[Recevoir]:" + message);
}
//Traitement lors de la réception d'un message
@OnError
public void onError(Throwable th) {
System.err.println(th.getMessage());
}
//Traitement lors de la libération d'une session
@OnClose
public void onClose(Session session) {
System.out.println("[Déconnecter]");
}
static public void main(String[] args) throws Exception {
//Obtenez l'objet conteneur WebSocket pour l'initialisation
WebSocketContainer container = ContainerProvider
.getWebSocketContainer();
//URI du point de terminaison du serveur
URI uri = URI
.create("ws://localhost:8080/<Nom du projet>/<Lien>");
//Établir une session avec le point de terminaison du serveur
//À partir du client en cours d'exécution, recherchez la même classe passée dans l'argument et connectez-vous?
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;
//Envoyer le contenu de str
session.getBasicRemote().sendText(str);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Comme c'est gênant, j'ai écrit main dans la classe Endpoint cette fois, mais je pense qu'il vaut mieux le séparer.
Tout d'abord, démarrez le serveur contenant le client avec tomcatRun etc., puis exécutez main dans une autre fenêtre.
Recommended Posts