Hier, j'ai créé une fonction de réception Socket à l'aide d'une bibliothèque Java. (Pour l'instant, je cherche juste à voir si la prise sur le port spécifié a reçu les données)
Je souhaite terminer la fonction d'envoi / réception aujourd'hui.
Le traitement requis pour lier le gestionnaire d'événements est effectué dans les étapes suivantes.
Cela semble illimité. Il semble que n'importe quelle classe puisse être définie, donc pour le moment Définissons la fenêtre de l'expéditeur sur la classe cible de MainStage.java créée dans Faisons une application de communication dans LAN Partie 2.
Pour être honnête, cette implémentation semble subtile. Le processus d'affichage de l'écran et le processus de définition du fonctionnement de l'écran doivent être séparés.
Contrairement à Form, JavaFX enregistre les informations de mise en page / de contrôle de l'écran sous forme de XML, de sorte qu'il ne peut pas être lié aux opérations en l'état. La solution est simple, il suffit d'écrire une classe qui associe l'action à FXML. Voilà pourquoi.
Il semble qu'il y ait deux façons de le faire, alors décrivez-les.
C'est super facile.
C'est également facile.
Plus précisément, cela ressemble à ceci
MainStage.fxml
<GridPane minHeight="-Infinity" minWidth="-Infinity" prefHeight="200.0" prefWidth="400.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="kugui.owd.privateMessenger.stage.MainStage">
Après avoir lié les classes, liez les différents événements de contrôle et les méthodes de classe de contrôleur. Cela semble avoir les restrictions suivantes sur la méthode.
Cette fois, j'ai préparé une telle méthode.
MainStage.java
@FXML
private void btnSend_Click(ActionEvent event) {
System.out.println( "btnSend is clicked!");
return;
}
Ceci décrit également deux méthodes de réglage.
C'est aussi simple.
Démarrez SceneBuilder et ouvrez le fichier FXML que vous souhaitez associer.
Sélectionnez le contrôleur auquel vous souhaitez associer l'événement (cette fois, bouton [Envoyer])
Cliquez sur l'onglet [Code] de l'accordéon Inspector sur le côté droit de l'écran.
Entrez la méthode que vous souhaitez associer dans la zone de texte de l'événement associé (cette fois l'événement OnAction, qui correspond à l'événement Click) (Si vous appuyez sur le bouton [▼], les méthodes candidates seront affichées.)
C'est aussi mince p (ry
Plus précisément, cela ressemble à ceci
MainStage.fxml
<Button mnemonicParsing="false" onAction="#btnSend_Click" text="Send" GridPane.halignment="CENTER" GridPane.rowIndex="2" GridPane.valignment="CENTER" />
Si vous pouvez le faire jusqu'à présent, vérifiez si vous pouvez le lier.
Après cela, si vous prenez le contenu du message et les informations de la destination et envoyez la prise, la fonction d'envoi est OK. Récupérons donc le contenu de la zone de texte GUI créée par JavaFX.
La procédure est la suivante
L'identifiant doit être défini pour assurer la cohérence entre les sources FXML et java.
Il existe deux façons de définir l'identifiant.
Shin (ry)
Presque identique à la partie gestionnaire d'événements ci-dessus, la photo est donc omise.
Plus précisément, cela ressemble à ceci
MainStage.fxml
<TextArea fx:id="txaMessage" prefHeight="200.0" prefWidth="200.0" promptText="Input send message..." GridPane.rowIndex="1" />
Je viens de le déclarer dans la classe, mais en particulier, il ressemble à ceci.
MainStage.java
Importation ajoutée: import javafx.scene.control.*;
public class MainStage extends Application {
@FXML private TextArea txaMessage;
@FXML private TextField txfSendTo;
(Omis)
Utilisez println pour afficher les résultats d'acquisition de TextField: txfSendTo (javafx.control.TextField) pour saisir l'adresse IP de destination et TextArea: txaMessage (javafx.control.TextArea) pour saisir le message.
Modifiez le gestionnaire d'événements lorsque vous appuyez sur le bouton comme ceci
MainStage.java
@FXML
private void btnSend_Click(ActionEvent event) {
System.out.println( "btnSend is clicked!");
System.out.println( String.format("SendTo : %s ", txfSendTo.getText() ));
System.out.println( String.format("Message : %s ", txaMessage.getText() ));
return;
}
Le résultat ci-dessous.
Les informations de l'interface graphique sont maintenant OK.
Allons-y ensuite.
Faisons-le de la même manière que l'article précédent. Cette fois, le port d'envoi n'est pas spécifié. Je ne suis pas particulier à ce sujet.
Alors créons rapidement une nouvelle classe d'envoi.
Le flux de traitement ressemble à ceci
1.Faites une prise 2. Établissez une connexion TCP avec la destination (dans clientSocket.connect ()) 3. Envoyez un message au port d'envoi via DataOutputStream (cette fois, la chaîne "TestMessage") 4. Fermez le socket.
Définissez targetIP à définir avec la méthode setTargetIP.
TxThread.java
package kugui.owd.privateMessenger;
import java.io.*;
import java.net.*;
public class TxThread extends Thread {
private String targetIP;
public void run() {
int port = 80;
int timeout = 10000;
Socket clientSocket = new Socket();
try {
clientSocket.connect(new InetSocketAddress(targetIP, port), timeout);
DataOutputStream dos = new DataOutputStream(clientSocket.getOutputStream());
dos.writeUTF("TestMessage");
dos.close();
}catch(IOException ie) {
ie.printStackTrace();
}
try {
clientSocket.close();
}catch(IOException ie) {
ie.printStackTrace();
}
return;
}
public void setTargetIP(String pIP) {
targetIP = pIP;
return;
}
}
Il peut être déplacé, mais il peut s'agir d'un détournement de RxThread.java créé dans l'article précédent.
Voyons si les données sont réellement retardées vers l'adresse IP spécifiée. Dans l'état précédent, je voyais uniquement "Avez-vous accédé au port spécifié?" J'ai ajouté un petit traitement de réception.
Les fonctions suivantes ont été ajoutées.
RxThread.java
package kugui.owd.privateMessenger;
import java.io.*;
import java.net.*;
public class RxThread extends Thread {
public void run() {
int port = 80; //Pour test.
int timeout = 1000;
ServerSocket sSocket;
try {
sSocket = new ServerSocket(port);
sSocket.setSoTimeout(timeout);
System.out.println(String.format("start listening port %d", port));
while (true) {
try {
int length = 0;
DataInputStream dis = new DataInputStream(sSocket.accept().getInputStream());
System.out.println(String.format("IP %d port %d : socket accept", sSocket.getInetAddress().toString() ,port));
while(true) {
byte[] buffer = new byte[1024];
length = dis.read(buffer);
if( length > 0 ) {
System.out.print(new String(buffer));
}else {
break;
}
}
dis.close();
} catch (SocketTimeoutException se) {
if (interrupted() == true) {
break;
} else {
/* no operation */
}
}
}
} catch (IOException ioE) {
ioE.printStackTrace();
}
System.out.println("finished");
return;
}
}
Si vous vous connectez à localhost à partir du navigateur dans cet état, cela ressemblera à ceci.
J'ai pu confirmer que le contenu de la requête HTTP était correctement affiché.
Ensuite, entrez localhost dans le champ de texte SendTo et appuyez sur le bouton d'envoi pour obtenir ce résultat.
Il semble que le message a été reçu.
__ Cependant, il y a un problème en ce que le message est parfois interrompu. __ ~~ Eh bien, si vous ne pouvez pas extraire des informations de la prise de réception dans la situation actuelle, vous pouvez terminer la lecture sans poser de questions. ~~
Donc, après une courte pause, le reste du travail
Je le ferai. Brisons-le une fois. Le temps de travail était cette fois-ci de 05:20:20.
Recommended Posts