Server-Socket liest Input-Stream nicht

Lui.k

Mitglied
Ich versuche einen super einfachen Server zu programmieren, welcher mit Webbrowsern wie zum Beispiel Firefox sprechen kann.

Wenn ich den Server über seine interne IP (192.168.2.XXX) anspreche, funktioniert alles wie erwartet.

Wenn ich dasselbe von extern versuche, funktioniert es nicht mehr so ganz.

Ich verwende einen ServerSocket, warte auf eine Anfrage und erstelle anschließend einen InputStream und einen OutputStream.

[CODE lang="java" title="ServerSocket" highlight="15"] ServerSocket serverSocket = new ServerSocket(Port);

System.out.println("");
Socket clientSocket = serverSocket.accept();
System.out.println("accept");

PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

StringBuffer daten = new StringBuffer();
String tmp = "";

while(true) {

tmp = in.readLine();

if(tmp == null || tmp.length() == 0) {
break;
} else {
daten.append(tmp);
}
}
System.out.println(daten.toString());
[/CODE]

Das Problem ist in Zeile 15. Der Code wird ab hier nicht weiter ausgeführt. Es ist auch nicht so, dass die Schleife nicht verlassen wird. Ich habe auch schon versucht anstelle von "n.readLine()" - "in.read()" zu verwenden. Ich habe auch schon versucht "InputStream in = clientSocket.getInputStream()" anstelle von "BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()))" zu verwenden ... ohne Erfolg.

Wenn ich im Browser die Verbindung unterbreche, kommt die Anfrage des Browsers beim Server an. Aber dann kommt die Rückantwort des Servers nicht mehr beim Browser an. Wenn ich die while-Schleife weglasse, funktioniert es. Mache ich hier etwas grundsätzliches Falsch? Ich muss doch die Anfrage des Clienten lesen, bevor ich ihm antworte.

Ich verwende Ubuntu 20.04.2 LTS und JavaSE-1.8. Vielen Dank im Voraus!!!
 
K

kneitzel

Gast
Das kann doch so gar nicht funktionieren! readLine ist ein blockierender Call bis eben eine Zeile gelesen wurde oder die Verbindung geschlossen wurde.
Und du wiederholst dies immer, d.h. die Schleife blockiert, bis die Verbindung geschlossen wurde.

Du musst Dir erst einmal genau überlegen, was da das Protokoll sein soll. Woran kann der Server erkennen, dass der Client seine Sendung beendet hat? Oder ist es Zeilenorientiert? Dann könntest Du mit mehreren Threads arbeiten und der Empfangen-Thread würde halt regelmäßig blockieren ... (Oder Du machst das alles asynchron. Gerde bei Server Applikationen macht dies Sinn.)
 

Lui.k

Mitglied
@kneitzel

Danke sehr für deine Antwort!

Ja du hast recht. Es ist scheinbar so, das die Methode in.readLine(); den Code blockiert bis die Verbindung geschlossen wird.

Komisch ist, dass dieser Code funktioniert, wenn ich den Server über die Lokale IP (192.168.2.XXX) anspreche.

Solange die Verbindung aktiv ist, wird die Schleife nicht mehrfach ausgeführt. Das passiert erst, wenn ich die Verbindung trenne, dann werden mehre Zeilen gelesen.

Die letzte Zeile der Anfrage ist leer (also 0 Zeichen), daran erkenne ich das die Anfrage zu Ende ist. Aber so weit komme ich nicht, da mir in.readLine(); nichts zurück liefert so lange die Verbindung besteht.

Entschuldige bitte, dass ich so dumm nachfragen muss, aber was würde es nutzen einen neuen Thread zu beginnen. Ich möchte doch zuerst die anfrage des Clienten lesen, bevor ich etwas anderes tue, oder?

Danke sehr für deine Hilfe!!!
 
Zuletzt bearbeitet:
K

kneitzel

Gast
Bezüglich Deiner Aussagen kann ich Dir nicht folgen:
- Das Verhalten sollte immer gleich sein, egal b der Socket über die lokale ip angesprochen wird oder nicht.
- Der Client sollte die Daten eigentlich direkt senden. Ein Webbrowser macht ein fluch, denn die Daten müssen ja zum Server gehen. Der Client wartet dann ja auch auf eine Antwort.

Zum Starten von Threads gäbe es z.B. https://docs.oracle.com/javase/tutorial/essential/concurrency/runthread.html

Aber evtl. wäre es besser, wenn man direkt async arbeiten würde. Da wäre z.B.

Generell kannst Du aber auch einfach schauen, wie das Andere so gemacht haben. Es gibt viele Veröffentlichungen dazu. Ich habe mal einfach nach java simple chat application gesucht und eines der ersten Treffer war dann:

Ich habe mir das nicht im Detail angesehen, aber ich denke, dass dies schon helfen kann.

Wenn Du als client ein Webbrowser nutzen willst, dann wäre aber auch ggf. die Frage, wieso Du keinen Bestehenden Server für sowas nutzt (Sprich: bestehende Web Technology nutzen wie z.B. spring boot, JEE/Jakarta, ....)
 

Lui.k

Mitglied
Bezüglich Deiner Aussagen kann ich Dir nicht folgen:
- Das Verhalten sollte immer gleich sein, egal b der Socket über die lokale ip angesprochen wird oder nicht.
- Der Client sollte die Daten eigentlich direkt senden. Ein Webbrowser macht ein fluch, denn die Daten müssen ja zum Server gehen. Der Client wartet dann ja auch auf eine Antwort.

Zum Starten von Threads gäbe es z.B. https://docs.oracle.com/javase/tutorial/essential/concurrency/runthread.html

Aber evtl. wäre es besser, wenn man direkt async arbeiten würde. Da wäre z.B.

Generell kannst Du aber auch einfach schauen, wie das Andere so gemacht haben. Es gibt viele Veröffentlichungen dazu. Ich habe mal einfach nach java simple chat application gesucht und eines der ersten Treffer war dann:

Ich habe mir das nicht im Detail angesehen, aber ich denke, dass dies schon helfen kann.

Wenn Du als client ein Webbrowser nutzen willst, dann wäre aber auch ggf. die Frage, wieso Du keinen Bestehenden Server für sowas nutzt (Sprich: bestehende Web Technology nutzen wie z.B. spring boot, JEE/Jakarta, ....)
Ich stimme Dir 100% zu. Es sollte keinen Unterschied machen ob der Socket über die lokale IP angesprochen wird oder nicht ... aber trotzdem ist es so.

Danke sehr für die Links und Deine Hilfe!

Ich schreibe, sobald / falls ich eine Lösung finde.
 
G

Gelöschtes Mitglied 65838

Gast
[CODE lang="java" title="Client"]package application;
public class Client
{
public static void main(String[] args) throws Exception
{
Socket socket = new Socket("127.0.0.1", 4000);
BufferedWriter writerChannel = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
BufferedReader readerChannel = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line;

writerChannel.write(new Date().toString() + "\n\r");
writerChannel.flush();

while ((line = readerChannel.readLine()) != null)
{
System.out.println(line);
}
}
}[/CODE]
[CODE lang="java" title="Server"]package application;
while (true)
{
Socket socket = listener.accept();
BufferedReader readerChannel = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedWriter writerChannel = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

writerChannel.write(new Date().toString() + "\n\r");
writerChannel.flush();

while ((line = readerChannel.readLine()) != null)
{
System.out.println(line);
}

}[/CODE]
das ist ein ganz ganz simpler server und client ausschnitt wo man bei der verbindung beim client und beim server sieht wann sich jemand verbunden hat um die "verklemmung" zu umgehen
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Socket Server -> lesen von / schreiben zu php-script Netzwerkprogrammierung 6
H Socket Kann ein Socket server 2 dimensionale Arrays empfangen und versenden? Netzwerkprogrammierung 3
Z Kann nicht Daten vom Server lesen Socket Netzwerkprogrammierung 10
R Socket FATAL EXCEPTION MAIN bei Socket based client/server app Netzwerkprogrammierung 2
D Socket Run Args Client/Server Socket Netzwerkprogrammierung 1
D Socket server auf Smartphone Netzwerkprogrammierung 9
H Socket Client/Server Socket Programmieren Netzwerkprogrammierung 1
A Socket Socket Server netcat Netzwerkprogrammierung 1
Shams Anfängerfrage zu Server-Socket-Kommunikation Netzwerkprogrammierung 2
M Socket String Arrays über Socket an Server schicken Netzwerkprogrammierung 2
precoc Server Socket Start / Stop Netzwerkprogrammierung 5
J Socket Dateien über Socket auf Server speichern Netzwerkprogrammierung 3
G Bild über Socket schicken - Client/Server Netzwerkprogrammierung 10
M SSl Socket Server und openssl key Netzwerkprogrammierung 3
A Socket Server: Message an verschiedene Clients senden Netzwerkprogrammierung 4
F Socket Verbindungen über mehrere Server Netzwerkprogrammierung 4
Y client server socket via internet Netzwerkprogrammierung 8
A Socket Server-Socket wiederholt starten Netzwerkprogrammierung 3
E Socket HTTP-Server Netzwerkprogrammierung 6
Y server client socket verbindung übers internet aufbauen Netzwerkprogrammierung 8
S SSL Socket zu IRC Server aufbauen? Netzwerkprogrammierung 10
N Socket File über Socket vom Server an Client versenden Netzwerkprogrammierung 15
H Socket Socket verbindung mit einem TeamSpeak2 Server Netzwerkprogrammierung 5
P über Socket Kommando an Win2000-Server absetzen Netzwerkprogrammierung 12
N Über Socket an Linux-Server Kommandos absetzen? Netzwerkprogrammierung 4
B Server socket springt nicht gleich an Netzwerkprogrammierung 3
C Verbindung zum Server prüfen mit einem vorhandenem Socket Netzwerkprogrammierung 4
M TCP Socket und Server int senden und empfangen Netzwerkprogrammierung 6
W Socket Client-Server Verbindung. Wie Strings senden? Netzwerkprogrammierung 6
A http request per socket an apache server Netzwerkprogrammierung 5
M Vom Server per Socket Empfangen, aber wieviel Bytes? Netzwerkprogrammierung 11
D Server Socket läuft nicht -> java.net.SocketException: Netzwerkprogrammierung 4
D Habe 2 Probleme: Input eingabe und Multi Socket Server Netzwerkprogrammierung 2
F http Post auf einen Grafana Server Netzwerkprogrammierung 3
E Server mit GUI Netzwerkprogrammierung 4
E FTP FTPS Server gibt Fehlernachricht "522 SSL/TLS required on the data channel" zurück Netzwerkprogrammierung 1
I Performanteste Kommunikationsmethode zwischen Client u. Server Netzwerkprogrammierung 4
L Socket Automatische Zuweisung von Server und Client Rolle Netzwerkprogrammierung 12
Eigenen Rechner als Server? Netzwerkprogrammierung 16
FrankenDerStein HTTP Https Server Bibliothek für Linux und Android gesucht. Netzwerkprogrammierung 7
ExceptionOfExpectation Server/Client-Kommunikation Netzwerkprogrammierung 34
M Server-Client-System für Browsergame Netzwerkprogrammierung 5
J Datei Download vom Server Netzwerkprogrammierung 8
izoards Mehrere TCP Verbindungen auf einen Server [alles Local] Netzwerkprogrammierung 2
Yonnig Threads mit Client/Server und GUI (laufend bis button-click) Netzwerkprogrammierung 9
J Client-Server und SOAP Netzwerkprogrammierung 23
K Threads/Server/telnet Fehler Netzwerkprogrammierung 2
J Multithreaded-Server Netzwerkprogrammierung 21
JaXnPriVate Java HTTPS Server (Secure Sockets) Netzwerkprogrammierung 15
L30nS RMI RMI-Server kann Dialog nicht volkommen anzeigen Netzwerkprogrammierung 2
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
S Von Java auf passwortgeschützten Server zugreifen + Umgang mit Ports Netzwerkprogrammierung 28
S Probleme bei Java-Installation auf Server (Linux/Shell/Terminal) Netzwerkprogrammierung 6
S Java: Anbindung an einen realen Server? (+ Portfreigabe) Netzwerkprogrammierung 8
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
S HTTP Post?!? - Java Server Netzwerkprogrammierung 7
F Verbindung zu einem LDAP Server über Java Netzwerkprogrammierung 4
D Slf4j - Logging - Client-Server Architektur Netzwerkprogrammierung 3
F NodeJs-Server auf Firebase hosten ? Netzwerkprogrammierung 3
J client server mit nur einem PC Netzwerkprogrammierung 33
M Socket Nachricht von TCP-Client an Server schicken Netzwerkprogrammierung 12
M Socket Verbindung Matlab(Server) Java(Client) Netzwerkprogrammierung 1
H HTTP Glassfish (v5) Application Server - Bibliothek zur Verfügung stellen Netzwerkprogrammierung 4
B HttpClient - Server (Jetty) - getInputStream - EOF Netzwerkprogrammierung 3
P TCP-Server Netzwerkprogrammierung 1
F Server für Java Applikationen Netzwerkprogrammierung 16
H Einfacher Server funktioniert nicht Netzwerkprogrammierung 1
G Server-Client IO Problem Netzwerkprogrammierung 6
T Mikrofonaudio über Java Server an Webbrowser streamen Netzwerkprogrammierung 13
I Socket Das erste Server-Client Programm Netzwerkprogrammierung 16
T HTTPS-Requests an Server: POST-Parameter kommen nicht an Netzwerkprogrammierung 5
L Socket Wie kann ich checken ob ein User eine Nachricht per Outputstream an den Server gesendet hat? Netzwerkprogrammierung 1
T Jetty Server LOGGING Netzwerkprogrammierung 1
L Strings an Server senden und in MYSQL speichern? Netzwerkprogrammierung 3
Aruetiise Socket Java Programm auf Server Netzwerkprogrammierung 3
T server empfängt nur 1 Buchstaben vom String Netzwerkprogrammierung 1
S Spiel mit Server programmieren Netzwerkprogrammierung 2
N Post u Head Request an Server Netzwerkprogrammierung 4
J Socket Ein Chat Server Tutorial Netzwerkprogrammierung 8
M Socket Server antwortet dem Client nicht Netzwerkprogrammierung 6
J Socket Tutorial zu Multiplayer Server schreiben? Netzwerkprogrammierung 5
S Java Chat Server Netzwerkprogrammierung 8
E Kurze Textnachrichten über einen Server von meinem Handy auf den Computer laden. Netzwerkprogrammierung 9
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
D Socket Message an einen Server senden? Netzwerkprogrammierung 8
J FTP FTP Zugriff über Proxy Server Netzwerkprogrammierung 1
KaffeeFan Programmierung mit Cloud-Server Netzwerkprogrammierung 0
L Socket Problem mit Server Netzwerkprogrammierung 1
cezary Socket Paralleler Server ? Netzwerkprogrammierung 1
I Socket Leicht zu DDosender Server Netzwerkprogrammierung 4
agent47 HTTPs Server Netzwerkprogrammierung 5
J Chat Server starten über GUI problem Netzwerkprogrammierung 4
J Prüfen, ob remote UDT Server erreichbar ist Netzwerkprogrammierung 0
P Server als Client nutzen Netzwerkprogrammierung 8

Ähnliche Java Themen

Neue Themen


Oben