Ich habe ein Nickerchen gemacht (5 Stunden), also lass uns wieder arbeiten.
Die LAN-Kommunikations-App ist heute vorbei, also ist es schnell (ob es möglich ist oder nicht)
Wir beginnen mit der Reparatur des Empfangsprozesses.
Zuallererst dies. Erstellen Sie einen Bildschirm, um die empfangene Nachricht mit JavaFX anzuzeigen.
Hier ist die, die durch Umleiten des Sendefensters erstellt wurde.
Ich bin hier festgefahren.
In dieser Anwendung habe ich es mit dem Bild erstellt, dass "wenn eine Nachricht empfangen wird, die empfangene Nachricht in einem neuen Fenster angezeigt wird". Es wurde entwickelt, um "einen Abhör-Thread für den Empfang vorzubereiten und den Port zu überwachen".
Zuerst habe ich mich gefragt, ob ich einen Bildschirm mit dem Standby-Thread für den Empfang erstellen und anzeigen soll. Wenn Sie eine Instanz von javafx.stage.Stage erstellen und die show () -Methode aufrufen, erhalten Sie eine IlegalStateException.
↓ So.
RxThread.java
(Empfangsverarbeitung)
Stage stage = new Stage();
stage.show();
↓ Klicken Sie hier für Ergebnisse
Was ist diese Ausnahme? Als ich es nachgeschlagen habe, bin ich auf diese Tatsache gestoßen. Sagt "Wenn Sie versuchen, ein JavaFX-Element von einem anderen als dem JavaFX-Anwendungsthread aus zu betreiben, wird die obige Ausnahme ausgelöst."
Als ich die Problemumgehung untersuchte, stellte sich heraus, dass es eine Klasse namens javaFX.platform gab.
Oracle-JavaFX Documentation Class-Plattform (Japanisch)
Durch die Registrierung eines ausführbaren Threads in der runLater () -Methode dieser Klasse scheint die JavaFX-Anwendung ihn stattdessen auszuführen.
Oh, du kannst nichts Neues machen und zeigen ()! Wie Form. Der Prozess der Anzeige der Bühne basierend auf dem Inhalt, der sofort untersucht wurde Schreiben Sie den Vorgang neu und überprüfen Sie ihn.
↓ Wechseln Sie zu so etwas
RxThread.java
(Empfangsverarbeitung)
Platform.runLater( () -> {
Stage stage = new Stage();
stage.show();
});
↓ Hier ist das Ergebnis (Bühne mit einem neuen weißen Fenster. Größe geändert, aber zunächst ziemlich groß)
… Nun, als Antwort auf diese Tatsache Die Zusammensetzung der Bildschirmzeichnung musste geändert werden. (Seufzer) Es ist zu schmutzig, wenn es jetzt gemacht wird ...
Ich habe es repariert (eine Stunde lang benutzt).
Grob modifiziert, um so etwas zu machen
Indem Sie die obigen Änderungen vornehmen, [Nachrichtenempfang bestätigen] => [Empfangene Nachricht abrufen Phase] => [Zeichenaufgabe an Anwendungsthread anfordern] => [Zeichenphase] Es ist jetzt möglich zu verarbeiten.
Als nächstes möchte ich die empfangene Nachricht auf dieser Bühne anzeigen.
Es war auch hier dicht gepackt. Und mit einer Nullreferenz.
Zeit ... Zeit ... (frustriert)
Die Einstellmethode kann durch das folgende Verfahren realisiert werden.
Wie einfach es aussieht, wenn Sie es schreiben
Das ist einfach. Es ist in Ordnung, wenn Sie einen gewöhnlichen Setter machen. Informationen zum Behandeln des Steuerelements als Objekt finden Sie unter "Erstellen einer Intra-LAN-Kommunikations-App Teil 3" (https://qiita.com/Shiratori/items/35b0c488f6adbb034cd4). "Ein Objekt mit demselben Typ und Namen wie das Steuerelement mit festgelegter ID. Siehe den Punkt "In Klasse deklarieren".
Dies. Ich bin total begeistert davon. Die Punkte sind wie folgt.
Erstellen Sie für diesen Prozess einen Getter, der den Wert von getControl () mit einem Controller zurückgibt, der den tatsächlichen Status von fxmlLoader hat. Erstellen Sie einen Wrapper, der ihn im Stage-Zeichnungsthread empfängt und so zurückgibt, wie er ist ... und endlos ...
Es hat sich gelohnt und war erfolgreich, bis die abgerufene Nachricht angezeigt wurde.
Hier ist eine sehr traurige Nachricht. Nun, gestern war ich irgendwie fassungslos (Entschuldigung) Ich habe nutzlos verarbeitet und auf eine Nachricht gewartet.
Lassen Sie also unnötige Verarbeitungen aus und beheben Sie diese
RxThread.java
while (length >= 0) {
byte[] buffer = new byte[1024];
length = dis.read(buffer);
sBuffer.append(new String(buffer));
}
Das ist der Prozess. Ich frage mich, ob die Puffergröße der Wert der Länge sein könnte.
Bei der Socket-Kommunikation wird -1 zurückgegeben, wenn keine Informationen zu erfassen sind. Wenn Ihnen die Informationen ausgehen, werden sie herauskommen.
Bisher gibt es kein Problem, also lassen Sie dies in Ruhe. Eigentlich sage ich der anderen Partei, welche Datenmenge zuerst übertragen werden soll (um den Verlust während der Übertragung vorzubereiten). Nun, diesmal ist es im LAN. Keine Verschlüsselung.
Nun, ich habe es vorerst komplett implementiert (haz), also lasst uns zwischen den Terminals im LAN kommunizieren.
Das Ergebnis auf dem Entwicklungscomputer (Windows 7) und dem kommerziellen Laptop (Windows 10) sieht vorerst so aus
(Es ist ein sehr schweres Foto, da es mit einer mobilen Kamera aufgenommen wurde. Es ist mehr als 70-mal größer als das entwickelte Hauptgerät (einschließlich Bibliothek).)
Leider wurde ich wütend, als ich versuchte, unter Linux zu booten. Als ich es leicht nachschlug, stellte ich fest, dass es eine Sonne gab. * Systembibliothek, also frage ich mich, ob es etwas mehr Forschung geben muss.
Da es in Java erstellt wurde, möchte ich verschiedene Betriebssysteme unterstützen. Haben Sie Ihr Ziel vorerst erreicht? So weit diesmal. Es ist etwas schwierig zu bedienen, da Sie die IP direkt drücken. Es gibt einen Verbesserungspunkt ... Es ist eine andere Funktion (Wiedereröffnung) Ich mache mir Sorgen, dass / oder etwas in der erworbenen Adresse enthalten ist.
Nachtrag: Es scheint, dass die JavaFX-Bibliothek nicht enthalten war ... das? War 1.8 nicht mehr der Standard ...? Nach der Installation von openjfx wurde es normal gestartet.
Das Kommunikationsergebnis sieht so aus. (Wird in VNC angezeigt.)
Die Operation am letzten Tag endet um 07:41:54. Insgesamt 23:03:51.
Was wird nächste Woche passieren?
Oh, ich habe vergessen es zu erwähnen, aber hier ist GitHub
GitHub - PrivateMessenger https://github.com/Shiratori1218/PrivateMessenger
Recommended Posts