J'ai fait une sieste (5 heures), alors reprenons le travail.
L'application de communication LAN est terminée aujourd'hui, donc c'est rapide (que cela puisse être fait ou non)
Nous commencerons par réparer le processus de réception.
Tout d'abord, ceci. Créez un écran pour afficher le message reçu à l'aide de JavaFX.
Voici celle réalisée en détournant la fenêtre d'envoi.
Je suis resté coincé ici.
Dans cette application, je l'ai créée avec l'image que "lorsqu'un message est reçu, le message reçu est affiché dans une nouvelle fenêtre" Il est conçu pour "préparer un thread d'écoute pour la réception et surveiller le port".
Au début, je me demandais si je devais créer un écran avec le fil de veille pour la réception et l'afficher. Si vous créez une instance de javafx.stage.Stage et appelez la méthode show (), vous obtiendrez une IlegalStateException.
↓ comme ça
RxThread.java
(Traitement de la réception)
Stage stage = new Stage();
stage.show();
↓ Cliquez ici pour les résultats
Quelle est cette exception? Quand j'ai cherché, je suis tombé sur ce fait. Dit "Si vous essayez de faire fonctionner un élément JavaFX à partir d'un autre thread d'application JavaFX, l'exception ci-dessus sera levée."
Ainsi, lorsque j'ai étudié la solution de contournement, il s'est avéré qu'il y avait une classe appelée javaFX.platform.
Plateforme de cours de documentation Oracle-JavaFX (Japonais)
En enregistrant un thread exécutable dans la méthode runLater () de cette classe, l'application JavaFX semble l'exécuter à la place.
Oh, vous ne pouvez pas faire de nouveau et show ()! Comme formulaire. Le processus d'affichage de la scène en fonction du contenu qui a été étudié immédiatement Réécrivez et vérifiez le fonctionnement.
↓ Changer pour quelque chose comme ça
RxThread.java
(Traitement de la réception)
Platform.runLater( () -> {
Stage stage = new Stage();
stage.show();
});
↓ Voici le résultat (Scène avec une nouvelle fenêtre blanche. Redimensionnée mais assez grande au début)
… Eh bien, en réponse à ce fait Il était nécessaire de changer la composition du dessin d'écran. (Soupir) C'est trop sale si c'est fait maintenant ...
Je l'ai réparé (en l'utilisant pendant une heure).
À peu près modifié pour faire quelque chose comme ça
En apportant les modifications ci-dessus, [Confirmer la réception du message] => [Étape de réception du message] => [Demander une tâche de dessin au fil d'application] => [Étape de dessin] Il est désormais possible de traiter.
Ensuite, je voudrais afficher le message reçu sur cette étape.
C'était aussi bien emballé ici. Et avec une référence nulle.
Temps ... Temps ... (frustré)
La méthode de réglage peut être réalisée par la procédure suivante.
Comme c'est facile une fois que vous l'écrivez
C'est facile. Ce n'est pas grave si vous créez un setter ordinaire. Pour traiter le contrôle comme un objet, voir "Créons une application de communication intra-LAN Partie 3" (https://qiita.com/Shiratori/items/35b0c488f6adbb034cd4) "Un objet avec le même type et le même nom que le contrôle avec l'ID défini. Voir l'élément «Déclarer en classe».
cette. Je suis complètement accro à ça. Les points sont les suivants.
Donc, pour ce processus, créez un getter qui renvoie la valeur de getControl () avec un contrôleur qui a l'état réel de fxmlLoader. Créez un wrapper qui le reçoit dans le fil de dessin de la scène et le renvoie tel quel ... et à l'infini ...
Cela en valait la peine et cela a réussi jusqu'à ce que le message récupéré soit affiché.
Voici une très triste nouvelle. Eh bien, hier j'étais un peu abasourdi (excuse) J'ai mis un traitement inutile et j'ai attendu un message.
Donc, omettez les traitements inutiles et corrigez-le comme ceci
RxThread.java
while (length >= 0) {
byte[] buffer = new byte[1024];
length = dis.read(buffer);
sBuffer.append(new String(buffer));
}
Voilà le processus. Je me demande si la taille du tampon pourrait être la valeur de la longueur.
Dans le cas d'une communication par socket, -1 sera renvoyé lorsqu'il n'y a pas d'informations à acquérir. Si vous manquez d'informations à prendre, elles sortiront.
Il n'y a pas de problème pour l'instant, alors laissez cela tranquille. En fait, je dis à l'autre partie la quantité de données à transmettre en premier (pour se préparer à la perte lors de la transmission). Eh bien, cette fois, c'est dans le LAN. Pas de cryptage.
Eh bien, je l'ai mis en œuvre partout pour le moment (haz), alors communiquons entre les terminaux du LAN.
Pour le moment, le résultat sur la machine de développement (Windows 7) et l'ordinateur portable commercial (Windows 10) ressemble à ceci
(C'est une photo très lourde car elle a été prise avec un appareil photo mobile. Elle est plus de 70 fois plus grande que l'unité principale développée (bibliothèque incluse))
Alors, hélas, je me suis mis en colère quand j'ai essayé de démarrer sous Linux. Quand je l'ai regardé légèrement, j'ai trouvé qu'il y avait un soleil. * Bibliothèque système, donc je me demande s'il faut faire un peu plus de recherche.
Comme il a été construit en Java, je souhaite prendre en charge différents systèmes d'exploitation. Avez-vous atteint votre objectif pour le moment? Jusqu'ici cette fois. C'est un peu difficile à utiliser car vous touchez directement l'IP. Il y a un point d'amélioration ... C'est une fonction différente (réouverture) Je crains que / ou quelque chose soit inclus dans l'adresse acquise.
Postscript: Il semble que la bibliothèque JavaFX n'était pas incluse ... ça? Le 1.8 n'était-il plus la norme ...? Après avoir installé openjfx, il a démarré normalement.
Le résultat de la communication ressemble à ceci. (Affiché dans VNC.)
L'opération du dernier jour se termine à 07:41:54. Globalement 23:03:51.
Que va-t-il se passer la semaine prochaine?
Oh, j'ai oublié de le mentionner, mais voici GitHub
GitHub - PrivateMessenger https://github.com/Shiratori1218/PrivateMessenger
Recommended Posts