Communication socket avec un navigateur Web utilisant Java et JavaScript ②

Contexte

Articles précédents: https://qiita.com/take4eng/items/d0b009c48ee8c3fe420a

Comme décrit dans l'article précédent ci-dessus, créez un programme serveur en Java et effectuez une communication socket. ⇒ Puisque la communication HTTP est analysée en la poussant, le code est inutilement compliqué.

Java EE possède de nombreuses API liées à la communication par socket et peut être implémenté très facilement. Beaucoup de gens l'ont déjà résumé, mais je vais résumer le contenu mis en œuvre.

Même si une API pratique est préparée, personne ne fait l'analyse en la poussant. Même si je google, ça ne sort pas facilement ...

Contenu pratique

  1. Comment utiliser l'API WebSocket
  2. Créez un programme serveur à l'aide de l'API
  3. Modifiez le code du programme client dans l'article précédent pour créer une application de chat

Comment utiliser l'API WebSocket

Décrit l'API WebSocket de base. Il existe de nombreuses API autres que celles présentées ici, mais vous pouvez Google si nécessaire.

Créer une classe Endpoint

import javax.websocket.server.ServerEndpoint;
 
@ServerEndpoint("/Chemin de contexte")
public class SanpleEndpoint {
}
  1. Importez la classe ServerEndpoint
  2. Ajoutez l'annotation @ServerEndpoint à la classe
  3. Décrivez le chemin de contexte indiquant l'emplacement du fichier

Créer une méthode de traitement

/*
Importez chaque classe
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
*/

//Traitement lors de la connexion à un client
@OnOpen
public void onOpen(Session session) {
}
 
//Que faire lorsqu'un message est reçu du client
@OnMessage
public void onMessage(String message) {
}

//Que faire lorsqu'une erreur se produit
@OnError
public void onError(Throwable error) {
}

//Que faire lorsque la connexion avec le client est perdue
@OnClose
public void onClose(Session session) {
}
  1. Importez les classes requises
  2. Ajoutez chaque annotation correspondant à la méthode
  3. Les arguments peuvent être modifiés ou ajoutés selon les besoins

Créer un programme serveur à l'aide de l'API

Programme serveur


import java.io.IOException;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;

import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;

//Une annotation qui indique qu'il s'agit d'une classe côté serveur d'un socket Web.
//argument(wSck)Représente l'URI utilisé lors de la connexion depuis le client.
@ServerEndpoint(value = "/wSck")
public class SocketFree2 {

	//Créer un fil de session client(Enregistrez chaque session pour chaque client)
	//Ensemble: Collection sans éléments en double
	//CopyOnWriteArrayList:java.util.Une version thread-safe de Set
	private static Set<Session> user = new CopyOnWriteArraySet<>();

	@OnOpen//Lors de la connexion avec un client
    public void onOpen(Session mySession) {
        System.out.println("connect ID:"+mySession.getId());//session.getId():Obtenir l'identifiant de session
        user.add(mySession);//Ajouter une session par client à la liste
    }

    @OnMessage//Lorsque les données sont envoyées par le client
    public void onMessage(String text , Session mySession) {//Les arguments sont le texte envoyé et la session de la source
    	System.out.println(text);
    	//getAsyncRemote(): Obtenez une instance de RemoteEndpoint
    	//sendText(String): Envoyer un texte au client
    	for (Session user : user) {
    		user.getAsyncRemote().sendText(text);
            System.out.println(user.getId()+"Seconde"+mySession.getId()+"J'ai envoyé le deuxième message!");
    	}
    	if(text.equals("bye")) onClose(mySession);//Déconnecter si le texte est "au revoir"
    }

    @OnClose//Lorsque le client se déconnecte
    public void onClose(Session mySession) {
    	System.out.println("disconnect ID:"+mySession.getId());
        user.remove(mySession);//Supprimer la session client déconnectée de la liste
        try {
			mySession.close();//Fermer avec la méthode close
		} catch (IOException e) {
			System.err.println("Une erreur est survenue: " + e);
		}
    }

}

Description du code

  1. Ajouter l'annotation Endpoint @ServerEndpoint à la classe et décrire le chemin du contexte @ServerEndpoint(value = "/wSck")

  2. Créez une liste qui identifie chaque client private static Set<Session> user = new CopyOnWriteArraySet<>();

    1. méthode onOpen: Ajouter une session client à la liste user.add(mySession);

Quatre. méthode onMessage: envoyer le texte reçu au client tel quel ⇒ Envoyer à tous les clients connectés avec pour déclaration user.getAsyncRemote().sendText(text);

Cinq. méthode onClose: supprimer le client déconnecté 5-1. Supprimer de la liste des utilisateurs: ʻuser.remove (mySession); 5-2. Supprimer la session et déconnecter:mySession.close ();`

Résultat d'exécution

Modifiez l'adresse du programme client et exécutez-le avec un navigateur Web.

image.png Une application de chat qui affiche le contenu envoyé est terminée. Il prend également en charge l'accès à partir de plusieurs navigateurs.

Impressions

La communication par socket était très facile à faire en utilisant l'API. Par rapport à celui décrit dans l'article précédent, la quantité de code écrit est d'environ 1/4. C'est incroyable. Super facile.

En outre, il semble que le codage, le décodage, le traitement et la gestion des données json puissent être effectués facilement. Je ne l'ai pas utilisé cette fois, mais il sera nécessaire pour un développement à grande échelle. Voir la page de référence pour plus de détails.

Page de référence

Recommended Posts

Communication socket avec un navigateur Web utilisant Java et JavaScript ②
Communication socket avec un navigateur Web utilisant Java et JavaScript ①
Créez une énumération haute performance avec des champs et des méthodes comme Java avec JavaScript
Essayons WebSocket avec Java et javascript!
Java et JavaScript
Représentez graphiquement les informations du capteur de Raspberry Pi en Java et vérifiez-les avec un navigateur Web
Préparer un environnement de scraping avec Docker et Java
Comment convertir A en A et A en A en utilisant le produit logique et la somme en Java
Créez une application JAVA WEB et essayez OMC APM
[Java] Développement avec plusieurs fichiers en utilisant package et import
[Java] Communication JSON avec jackson
Je veux faire une liste avec kotlin et java!
Je veux créer une fonction avec kotlin et java!
Utilisation de Mapper avec Java (Spring)
PriorityQueue, où j'avais des problèmes avec la méthode Dyxtra en utilisant la liste de contiguïté (java)
Créer un environnement de développement d'équipe Java et JavaScript (construction d'environnement gradle)
Un exemple CRUD simple utilisant Java Servlet / JSP et MySQL
Faire un diamant en utilisant Java
AWS Elastic Beanstalk # 1 avec Java à partir de zéro - Création d'un environnement d'application Web Java à l'aide de l'interface de ligne de commande EB-
Faisons une application de communication en LAN Partie 1 Nouvelle création de projet à l'aide de Maven et du point d'entrée Java
Créez un serveur Web simple avec la bibliothèque standard Java com.sun.net.httpserver
Comparaison du développement d'applications WEB avec Rails et Java Servlet + JSP
Déployer automatiquement des applications Web développées en Java à l’aide de Jenkins [Préparation]
Note n ° 2 "Création d'un historique de recherche avec ArrayList et HashSet" [Java]
Construire un projet Java avec Gradle
Utiliser java avec MSYS et Cygwin
Traçage distribué avec OpenCensus et Java
Installez Java et Tomcat avec Ansible
Télécharger des fichiers à l'aide de Java HttpURLConnection
Utilisez JDBC avec Java et Scala.
Essayez d'utiliser Redis avec Java (jar)
Créer une application Web avec Javalin
J'ai essayé la communication UDP avec Java
Créer un projet Java à l'aide d'Eclipse
Sortie PDF et TIFF avec Java 8
Utilisation de Java avec AWS Lambda-Eclipse Préparation
Développement HTML5 par Java avec TeaVM
Essayez la communication bidirectionnelle avec gRPC Java
Utilisation du service proxy avec l'exploration Java
Crypter avec Java et décrypter avec C #
Communication de processus utilisant AMQP avec RabbitMQ
Comment faire fonctionner IGV en utilisant la communication par socket, et l'histoire de la création d'un Ruby Gem en utilisant cette méthode
Créez un environnement de développement d'applications Web qui utilise Java, MySQL et Redis avec Docker CE pour Windows
Une collection de phrases qui impressionne le "sentiment différent" de Java et de JavaScript
Création d'un projet (et d'un référentiel GitHub) à l'aide de Java et Gradle avec IntelliJ IDEA
Les débutants créent des applications Web avec Java et MySQL (ajout à tout moment)
[Java] Créez un fichier jar compressé et non compressé avec la commande jar
Création d'un environnement de développement pour les applications Web Java avec Docker pour Mac Part1
Un débutant Java a essayé de créer une application Web simple à l'aide de Spring Boot
Déployer automatiquement des applications Web développées en Java à l'aide de Jenkins [Spring Boot App Edition]
Je souhaite créer un SNS Web sombre avec Jakarta EE 8 avec Java 11
J'ai écrit une fonction Lambda en Java et l'ai déployée avec SAM
<java> Fractionner l'adresse avant et après l'adresse avec une expression régulière
Créer un environnement de développement d'applications Web Java avec Docker pour Mac Part2
Comment créer une application avec un mécanisme de plug-in [C # et Java]
[Java] J'ai installé JDBC et essayé de me connecter avec servlet + MySQL. (Il existe une version utilisant DAO / Bean)
[Java] Créer et appliquer un masque des diapositives
Créez rapidement un environnement Web à l'aide de Docker
Essayez d'utiliser le framework Java Nablarch [Application Web]