Socket Nachricht von TCP-Client an Server schicken

MorrisF

Mitglied
Hallo, liebes Java Forum,
ich habe ein Programm mit GUI geschrieben, auf dem man Zahlen in ein Feld eintragen kann. Dann gibt es einen senden-Button, der die eingegebenen Zahlen an einen TCP-Client senden soll.
Hier der Code, mit dem ich die sendData-Methode der TCPClient-Klasse aufrufe:
Java:
TCPClient tcpclient = new TCPClient();
//                        IP        Port 
tcpclient.sendData("192.168.106.1", 8000, text);

Mein Problem ist nun, dass ich zwar eine Verbindung aufbauen kann, aber der text nicht versendet wird

Hier der Code der sendData-Methode aus der TCPClient-Klasse(das meiste davon hab ich aus dem Netz):
Java:
public boolean sendData(String IP, int port, String text) throws Exception {
        try {
            InputStream txtStream = new ByteArrayInputStream(text.getBytes());
            BufferedReader inFromUser = new BufferedReader(new InputStreamReader(txtStream));
            Socket clientSocket = new Socket(IP, port);   
            System.out.println("Verbindung aufgebaut");
            DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
            BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            text = inFromUser.readLine();
            outToServer.writeBytes(text + 'n');
            clientSocket.close();
            System.out.println("Verbindung getrennt");
            
            return true;
        } catch (Exception e1) {
            e1.printStackTrace();
            return false;
        }
    }

Weiß irgendjemand, wie ich das möglichst einfach hinbekomme?
Ich mein, ich bin ja verbunden, also IP und Port stimmen, nur den Text will er nicht senden... sollte also kein großer Schritt mehr sein. Oder?

Vielen Dank im Voraus, für eure Hilfe!
MFG
Morris F.
 
K

kneitzel

Gast
Also ich würde vermuten, dass dein in den Socket schreiben gecacht wird und durch das sofortige close() wird das nicht mehr geschrieben.

Also ich würde daher ein flush() Aufruf auf dem Stream machen.
Aber socket hat auch shutdownOutput, das stellt auch sicher, dass die Daten, die bisher geschrieben wurden, wirklich gesendet werden ehe dann der Kanal im Handshake geschlossen wird ... das hört sich auch nicht schlecht an.

Und Dein Code sieht stark nach https://systembash.com/a-simple-java-tcp-server-and-tcp-client/ aus. Da ist das kein Problem, denn nach dem Schreiben kommt ein Lesen. Da wartet also der Client auf den Server... und der Server sendet ja erst nach dem Empfangen der Nachricht ....
 

MorrisF

Mitglied
Also ich würde daher ein flush() Aufruf auf dem Stream machen.
Aber socket hat auch shutdownOutput, das stellt auch sicher, dass die Daten, die bisher geschrieben wurden, wirklich gesendet werden ehe dann der Kanal im Handshake geschlossen wird ... das hört sich auch nicht schlecht an.

Hallo kneitzel,
danke für deine Antwort!
leider bin ich noch nicht so bewandert auf dem Gebiet und verstehe nur Bahnhofo_O
Wäre also toll, wenn du mir mal ein Beispielprogramm oder besser noch mein Programm umgeschrieben zeigen könntest, damit ich mir das ein bisschen besser vorstellen kann.
MFG
Morris F.
 
K

kneitzel

Gast
Direkt im Code bedeutet das, was ich gesagt habe:

Java:
public boolean sendData(String IP, int port, String text) throws Exception {
        try {
            InputStream txtStream = new ByteArrayInputStream(text.getBytes());
            BufferedReader inFromUser = new BufferedReader(new InputStreamReader(txtStream));
            Socket clientSocket = new Socket(IP, port);   
            System.out.println("Verbindung aufgebaut");
            DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
            BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            text = inFromUser.readLine();
            outToServer.writeBytes(text + 'n');
            outToServer.flush(); // (1)
            // clientSocket.shutdownOutput(); // (2)
            clientSocket.close();
            System.out.println("Verbindung getrennt");
            
            return true;
        } catch (Exception e1) {
            e1.printStackTrace();
            return false;
        }
    }

(1) ist der flush() Aufruf beim Stream. Streams können (teilweise) Daten zwischenpuffern. Und mit flush wird ein solcher Puffer denn geleert. Bildlich sind Streams sozusagen sowas wie Rohre. Die kann man auch aneinander stecken (DataOutputStream kommt auf den OutputStram vom Socket). Und manche haben halt auch eine Art Waschbecken dran. Und da kann dann Wasser gesammelt werden und nur wenn im Waschbecken genug Wasser drin ist, wird der Stöpsel mal kurz gezogen...
Und was ich vermute ist: Du hast halt so ein Rohr mit Waschbecken. Das hast Du erzeugt, Wasser rein getan und danach sofort weggeschmissen (Close Aufruf). Durch das flush() hast Du jetzt ein "Lass das Wasser abfließen, bis das Waschbecken leer ist" mit eingebaut.

(2) Hier wird der Stream auch schon geschlossen für Transfers. Aber erst nachdem alle Anstehenden Daten gesendet wurden. Ich vermute, dass (1) die Lösung sein dürfte und dass (2) nicht notwendig ist. Daher erst einmal auskommentiert.
 

MorrisF

Mitglied
Ich habe noch etwas festgestellt:
ich habe einen sehr seltsamen loop im Output vom Server(siehe Bild)
11873
Woran kann das leigen?
Ich habe es mal durchdebugt und gesehen, dass dieser beginn/ende loop beim clientSocket.close(); entsteht. Is das ein Fehler vom Server oder liegts am Code?
 
Zuletzt bearbeitet:
K

kneitzel

Gast
Dazu kann ich nichts sagen, da ich keine Ahnung habe, was Du da überhaupt machst. Alles, was wir bisher nur sehen, ist eine kleine Funktion sendData.
 

MorrisF

Mitglied
(1) ist der flush() Aufruf beim Stream. Streams können (teilweise) Daten zwischenpuffern. Und mit flush wird ein solcher Puffer denn geleert. Bildlich sind Streams sozusagen sowas wie Rohre. Die kann man auch aneinander stecken (DataOutputStream kommt auf den OutputStram vom Socket). Und manche haben halt auch eine Art Waschbecken dran. Und da kann dann Wasser gesammelt werden und nur wenn im Waschbecken genug Wasser drin ist, wird der Stöpsel mal kurz gezogen...
Und was ich vermute ist: Du hast halt so ein Rohr mit Waschbecken. Das hast Du erzeugt, Wasser rein getan und danach sofort weggeschmissen (Close Aufruf). Durch das flush() hast Du jetzt ein "Lass das Wasser abfließen, bis das Waschbecken leer ist" mit eingebaut.

(2) Hier wird der Stream auch schon geschlossen für Transfers. Aber erst nachdem alle Anstehenden Daten gesendet wurden. Ich vermute, dass (1) die Lösung sein dürfte und dass (2) nicht notwendig ist. Daher erst einmal auskommentiert.

Vielen Dank, für die tolle Erklärung! Hat mir sehr beim Verständnis gehlofen xD
Leider kommt immernoch kein Text beim Server an und er hat diesen komischen beginn/ende loop...
 

MorrisF

Mitglied
Dazu kann ich nichts sagen, da ich keine Ahnung habe, was Du da überhaupt machst. Alles, was wir bisher nur sehen, ist eine kleine Funktion sendData.

Ich habe ein kleines Client-Server Programm. Da mein Java Programm in dem Fall der Client ist, nutze ich nur die Server-funktion.
das Ganze schaut folgendermaßen aus:
11874
in meinem Java-Programm habe ich den selben Port und die selbe IP eingetragen und das verbinden klappt einwandfrei
11875
unten im Log steht ja Connected und Execute.

wenn ich vom Client des Programms eine Nachricht an den Server vom Programm schicke, steht das auch alles da und die Nachricht vom Client erscheint im Log des Servers.

wenn jetzt aber mein Java Programm der Client ist, Connectet er, erhält keine Nachricht, sondern geht dann in diesen beginn/ende loop.

Ich hoffe, das war irgendwie verständlich
 
K

kneitzel

Gast
Sorry, ich habe mich unklar ausgedrückt: Ich meinte damit Wissen über den Code selbst. Was machst Du auf der Server Seite? Was machst Du genau auf der Client Seite? Also mit Code. Nur dann können wir Dich auf Probleme im Code aufmerksam machen.
 

MorrisF

Mitglied
Ich habe meinen Quellcode ein bisschen angepasst und verschönert aber habe das selbe Problem:
Java:
public boolean sendData(String IP, int port, String text) throws Exception {
        try {
            InputStream txtStream = new ByteArrayInputStream(text.getBytes());
            BufferedReader inFromUser = new BufferedReader(new InputStreamReader(txtStream));
            Socket clientSocket = new Socket(IP, port);   
            System.out.println("Verbindung aufgebaut");
            DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
            text = inFromUser.readLine();
            outToServer.writeBytes(text);
            outToServer.writeUTF(text);
            outToServer.flush();
            clientSocket.shutdownOutput();
            System.out.println("Daten gesendet");
            clientSocket.close();
            System.out.println("Verbindung getrennt");
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
 

MorrisF

Mitglied
Sorry, ich habe mich unklar ausgedrückt: Ich meinte damit Wissen über den Code selbst. Was machst Du auf der Server Seite? Was machst Du genau auf der Client Seite? Also mit Code. Nur dann können wir Dich auf Probleme im Code aufmerksam machen.
ich habe das Client-Server-Programm nicht selbst programmiert, also weiss ich nicht, was da im Hintergrund im Code abgeht...
ich weiss nur, dass ich IP und Port einstelle und auf Open klicke... dann lauscht der Server auf dem angegebenen Port.
mein Client is ja mein Java Programm, da hab ich ja jetzt nochma den aktuellen Code gepostet.

im Grunde will ich nur den String text vom Client an den Server schicken, das is alles.
 
K

kneitzel

Gast
Deine Aussage zu dem Server Part besagt fast nichts. Wenn Du Dich zu einem Server verbinden willst, musst Du mehr wissen als nur den Port. Ist es TCP oder UDP wäre das Erste. Ok, die Meldungen besagen etwas von TCP...
Aber was erwartet der Server an Eingabe? Welches Protokoll spricht er?

Deine Routine verbindet sich und sendet den Text. Das jetzt sogar zwei mal!

Ich habe das einfach einmal auf die Schnelle mit zwei kleinen Klassen geprüft:
a) Server.java:
Java:
package tcptest;

import java.io.*;
import java.net.*;

public class Server {
    public static void main(String argv[]) throws Exception {
        String clientSentence;
        ServerSocket welcomeSocket = new ServerSocket(6789);

        while (true) {
            Socket connectionSocket = welcomeSocket.accept();
            System.out.println("Verbindung eingegangen von " + connectionSocket.getInetAddress().toString());
            BufferedReader inFromClient =
                    new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
            DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());
            clientSentence = inFromClient.readLine();
            System.out.println("Received: " + clientSentence);
        }
    }
}
Wie man erkennen kann: Mein Server erwartet eine ganze Zeile (readLine, d.h. es muss ein Zeilenumbruch am Ende kommen!)
(Sowas ist wichtig, denn wenn ich einen langen Text sende, dann muss ja der Server wissen, wann die Nachricht zuende ist. Ich könnte aber auch ein anderes Protokoll schreiben. Ich könnte in x Bytes erst eine Größe angeben und dann diese Anzahl an Bytes lesen (Also dieses content length das man evtl. kennt).

Und dann der Client. Hab jetzt auch noch einmal getestet: Ich brauchte kein flush und kein shutdownOutput. (Letzteres hätte mich auch etwas gewundert). Deine Funktion braucht auch kein throws Exeption wenn du doch ehh alle fängst ...
Java:
package tcptest;

import java.io.*;
import java.net.Socket;

public class Client {
    public static boolean sendData(String IP, int port, String text) {
        try {
            InputStream txtStream = new ByteArrayInputStream(text.getBytes());
            BufferedReader inFromUser = new BufferedReader(new InputStreamReader(txtStream));
            Socket clientSocket = new Socket(IP, port);
            System.out.println("Verbindung aufgebaut");
            DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
            text = inFromUser.readLine();
            outToServer.writeBytes(text + '\n');
//            outToServer.flush();
//            clientSocket.shutdownOutput();
            System.out.println("Daten gesendet");
            clientSocket.close();
            System.out.println("Verbindung getrennt");
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    public static void main (String[] args) {
        sendData("127.0.0.1", 6789, "test");
    }
}

Was man hier jetzt aber noch erkennt: Ich füge ein Zeilenumbruch ans Ende. Denn ohne den würde readLine ja nicht die Zeile einlesen.
(Und jetzt verstehe ich auch, was das + 'n' in dem code ursprünglich war. Das hatte ich bei Dir gesehen und auch auf der Seite von der Du es wohl auch hattest ... irgend was hat da das \ gefressen :)
 

MorrisF

Mitglied
Danke nochmal für die Hilfe!
ich hab jetzt das ganze über linux mit netcat als TCP-Server geteste und es funst.
Das Client-Server Programm von mir war wohl ein bisschen Panne...

MFG
Morris
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M wichtig!! Bitte!! (Nachricht von Server an Client senden) Netzwerkprogrammierung 2
L Socket Wie kann ich checken ob ein User eine Nachricht per Outputstream an den Server gesendet hat? Netzwerkprogrammierung 1
T Socket jamod WriteMultipleRegistersRequest ist keine ModBus/TCP Nachricht Netzwerkprogrammierung 1
Sogomn IRC-Nachricht Regex Netzwerkprogrammierung 0
H Socket Java | Server sendet Nachricht nur wenn vorher eine JOptionPane-Nachricht ausgegeben wurde. Netzwerkprogrammierung 2
M Nur die erste Nachricht kommt beim Server an Netzwerkprogrammierung 11
I Server schickt eine Nachricht an Broadcast Netzwerkprogrammierung 2
J Nachricht kommt erst nach beendigung der Anwendung an Netzwerkprogrammierung 4
G Nachricht an Server unverändert Netzwerkprogrammierung 2
H Neues NIO problem nachricht an alle clients Netzwerkprogrammierung 3
B Nachricht über Sockets kommt nicht an Netzwerkprogrammierung 8
G Nachricht an mehrere Clients schicken Netzwerkprogrammierung 10
A JavaMail Problem - Nachricht wird nicht versendet ? Netzwerkprogrammierung 9
H SOAP-Nachricht mit Java Netzwerkprogrammierung 8
G Nachricht von server an alle clients senden Netzwerkprogrammierung 6
I Performanteste Kommunikationsmethode zwischen Client u. Server Netzwerkprogrammierung 4
L Socket Automatische Zuweisung von Server und Client Rolle Netzwerkprogrammierung 12
ExceptionOfExpectation Server/Client-Kommunikation Netzwerkprogrammierung 34
M Server-Client-System für Browsergame Netzwerkprogrammierung 5
B Axis2 Webservice mit Client Zertifikat Authentifizierung Netzwerkprogrammierung 3
Yonnig Threads mit Client/Server und GUI (laufend bis button-click) Netzwerkprogrammierung 9
T Jetty mit Client-Zertifikat nur bei spezifischer URL Netzwerkprogrammierung 1
J Einlesen von Servernachrichten von TCP-Client Netzwerkprogrammierung 17
J Client-Server und SOAP Netzwerkprogrammierung 23
L30nS RMI Aufruf einer Client-Methode von einem RMI-Server Netzwerkprogrammierung 3
T String von Client zu Server kommt nicht an Netzwerkprogrammierung 92
D WebSocket Server mit HTML Client und Java Server Netzwerkprogrammierung 5
D Server - Client Informationsaustausch, Möglichkeiten Netzwerkprogrammierung 3
H Socket Chat entwickeln mit Java Server Client Netzwerkprogrammierung 4
X Kann ich einen Client/Server verbindung hinkriegen die mir alle paar Sekunden die aktuellen Daten per Realtime zuschickt ? Netzwerkprogrammierung 9
T Client zu Client Kommunikation Netzwerkprogrammierung 2
D Slf4j - Logging - Client-Server Architektur Netzwerkprogrammierung 3
J client server mit nur einem PC Netzwerkprogrammierung 33
M Socket Verbindung Matlab(Server) Java(Client) Netzwerkprogrammierung 1
R Socket FATAL EXCEPTION MAIN bei Socket based client/server app Netzwerkprogrammierung 2
G Server-Client IO Problem Netzwerkprogrammierung 6
ruutaiokwu ständig "sender address rejected: improper use of smtp" bei smtp-client Netzwerkprogrammierung 4
J HTTP [Java 9] Neuer HTTP Client - Tutorial Netzwerkprogrammierung 3
A Chatserver/-client - Code stoppt bei readUTF() Netzwerkprogrammierung 7
I Socket Das erste Server-Client Programm Netzwerkprogrammierung 16
L Zugriffprobleme Client - Webservice AspenTechnology Netzwerkprogrammierung 0
A Client Client Übertragung Netzwerkprogrammierung 12
M Socket Server antwortet dem Client nicht Netzwerkprogrammierung 6
K Socket Netty Client wirft Fehler! Netzwerkprogrammierung 3
I Client/Server Kommunikation bei einem Spiel Netzwerkprogrammierung 4
E Objekte versenden, Client-Server Netzwerkprogrammierung 25
C Mini Client-Server-Anwendung funktioniert nicht Netzwerkprogrammierung 8
U Client Soap Verbindung wieder schließen Netzwerkprogrammierung 0
U Socket Client mit hash authentifizieren Netzwerkprogrammierung 3
F HTTP HTTP Rest Client mit TLS1.2 und selbst signiertem Zertifikat Netzwerkprogrammierung 2
P Server als Client nutzen Netzwerkprogrammierung 8
D Socket Run Args Client/Server Socket Netzwerkprogrammierung 1
Cromewell Socket Multithreaded Server und Client Netzwerkprogrammierung 1
Y Client/Server/DB communication Netzwerkprogrammierung 3
JavaWolf165 Socket mit .writeUtf etwas vom Client zum Server schicken Netzwerkprogrammierung 13
J Client - Serversocket Netzwerkprogrammierung 1
P RMI Client Server Programm über Internet Netzwerkprogrammierung 2
brainless Client Server Kommunikation verschlüsseln Netzwerkprogrammierung 13
gamebreiti Socket Server / Client Anwendung Manipulation von Objekten durch Server Netzwerkprogrammierung 9
T Socket Server/Client Kommunikation Netzwerkprogrammierung 8
N Fragen zu Sockets Client Netzwerkprogrammierung 3
F Extasys TCp Client extends Funktion Netzwerkprogrammierung 0
F Server Client Anwendung mit UDP Netzwerkprogrammierung 2
O Client zwischen XML und JSON auswählen lassen Netzwerkprogrammierung 2
A RMI Wo treten Exceptions bei RMI Aufrufen auf? Auf Client oder auf Server? Netzwerkprogrammierung 3
A ByteBuffer - Client/Server Netzwerkprogrammierung 9
A Socket Wie ein einfacher Multithreads Service mit Telnet als Client mit Observable/Observer gelöst.... Netzwerkprogrammierung 0
K C# Server - Android Client Netzwerkprogrammierung 0
T Application Client NullPointerExc Netzwerkprogrammierung 7
V TCP Client funktioniert auf Emulator aber nicht auf Smartphone Netzwerkprogrammierung 5
H Machbarkeitsfrage: TCP/IP Client (z.B. Netty) für Java Web Applcation Netzwerkprogrammierung 1
P MIME-TYPE Erklaerung, Kommunikation zwischen Client und Server Netzwerkprogrammierung 3
H HTTP REST Jersey - PUT-Beispiel von Client senden Netzwerkprogrammierung 0
J Sichere Kommunikation bei Server Client Netzwerkprogrammierung 3
T Frage zu Client-Server Applikation Netzwerkprogrammierung 2
H Socket Client/Server Socket Programmieren Netzwerkprogrammierung 1
M Theoretische Frage zu Server - Client Netzwerkprogrammierung 2
P HTTP Server / Client Netzwerkprogrammierung 1
N FTP FTP Client invalid IPv6 address (Apache Commons Net API) Netzwerkprogrammierung 6
F TCP Client, verbindung aufrecht halten Netzwerkprogrammierung 0
X RMI: Woher kennt der Client das Schnittstellen-Interface? Netzwerkprogrammierung 2
E Thematik Client server Netzwerkprogrammierung 2
D UDP Client empfängt nichts Netzwerkprogrammierung 2
D Client/Server per Crossover Lan Kabel Netzwerkprogrammierung 1
S Client Server Connection Netzwerkprogrammierung 4
V erste Client - Server Anwendung, paar Fragen wie Socketverbindung checken usw. Netzwerkprogrammierung 4
S Client Anwendung mit zentraler SQL-Datenbank Netzwerkprogrammierung 3
N Client Identifikation eines Servers Netzwerkprogrammierung 1
S Sichere Server/Client Architektur Netzwerkprogrammierung 1
D Chat Server/mehre Client Netzwerkprogrammierung 9
I Server+Client Netzwerkprogrammierung 3
N Client am Server abmelden Netzwerkprogrammierung 0
F Server/Client Probleme Netzwerkprogrammierung 3
D SSH Client Netzwerkprogrammierung 7
U Socket Instant Messanger (Server Linux, Client Windows) Netzwerkprogrammierung 1
B TCP Client Android Netzwerkprogrammierung 3
Athena Grundsatzfragen zu Client-Server-Architektur / Matchmaking Netzwerkprogrammierung 1
A Problem beim Senden von Client zu Server Netzwerkprogrammierung 10
F Client Server DB Netzwerkprogrammierung 0
A Verständnisfrage Multi-Threaded Client/Server Netzwerkprogrammierung 5

Ähnliche Java Themen

Neue Themen


Oben