Client-Server-Kommunikation

Evileye

Mitglied
Hi,
ich soll einen kleinen Client/Server schreiben, wobei zwischen Client und Server einfach nur eine Verbindung aufgebaut werden soll. Der Server soll dann den Port des Clients in eine Datei schreiben (es soll der DataOutputStream verwendet werden).
Ich habe hierbei jetzt 2 Probleme bzw. Fragen.

Zum einen wird der Server (wahrscheinlich) nicht richtig beendet. Beim ersten Versuch funktioniert es, doch wenn ich den Server dann ein 2. mal starte bekomme ich folgende Exception:

Code:
java.net.BindException: Address already in use: JVM_Bind
	at java.net.PlainSocketImpl.socketBind(Native Method)
	at java.net.PlainSocketImpl.bind(Unknown Source)
	at java.net.ServerSocket.bind(Unknown Source)
	at java.net.ServerSocket.<init>(Unknown Source)
	at java.net.ServerSocket.<init>(Unknown Source)
	at vorklausur.aufg3.Server.main(Server.java:11)

Was ja im Prinzip nur heißt das bereits eine offene Verbindung auf dem Port existiert und der Server eben nicht richtig beendet wurde oder!?
Ich habe schonmal ein bisschen im Internet gesucht und herausgefunden das man das umgehen kann indem man für den Server einen extra Thread aufmacht und diesen nach einer bestimmten Zeit einfach schließt.

Gibt es dafür evtl noch eine andere Lösung? Oder liegt der Fehler vllt doch im Quellcode?

Das zweite Problem das ich habe ist das speichern des Ports. Der Inhalt der Datei sieht meistens in etwa so aus: " ¡". Ich hab auch mal eine Kontrollausgabe des Ports gemacht wobei da meistens ein Port 1000+ rauskommt (z.B. 1185) statt 8080.

Kann mir evtl jemand erklären woran das zum einen liegt das bei der Ausgabe auf der Konsole ein anderer Port rauskommt und warum in der Datei nur irgendwelche Zeichen landen!?

Hier mal noch der Quellcode des Servers:

Java:
import java.io.*;
import java.net.*;

public class Server {
	public static void main(String[] args) {
		Socket client = null;
				
		try {
			ServerSocket server = new ServerSocket(8080);
				
			while(true) {
				client = server.accept();
				int port = client.getPort();
		
				DataOutputStream dos = new DataOutputStream(
						new FileOutputStream("Ports.txt"));
				dos.writeInt(port);
				dos.close();
			}
		} catch(IOException e) {
			e.printStackTrace();
		} finally {
			try { if(client!=null) client.close(); } catch(IOException e) {}
		}
	}
}

Und der Client:

Java:
import java.io.*;
import java.net.*;

public class Client {
	public static void main(String[] args) {
		Socket so = null;
		
		try {
			so = new Socket("127.0.0.1",8080);
			int port = so.getPort();	

		} catch(IOException e) {
			e.printStackTrace();
		} finally {
			try { if(so!=null) so.close(); } catch(IOException e) {}
		}
	}
}
 
G

Gast2

Gast
Was ja im Prinzip nur heißt das bereits eine offene Verbindung auf dem Port existiert und der Server eben nicht richtig beendet wurde oder!?
ja - der Port ist schon belegt

Ich habe schonmal ein bisschen im Internet gesucht und herausgefunden das man das umgehen kann indem man für den Server einen extra Thread aufmacht und diesen nach einer bestimmten Zeit einfach schließt.
so ein Quark ... vergiss die Seite

Gibt es dafür evtl noch eine andere Lösung? Oder liegt der Fehler vllt doch im Quellcode?
wie wäre es wenn Du Deinen Server einfach mal beendest bevor Du Ihn erneut startest
Java:
while(true) {

solltest Du den Server wirklich beenden, dann ist entweder Dein Java kaputt oder Dein Betriebssystem ... beides räumt nach dir eigentlich immer auf

Das zweite Problem das ich habe ist das speichern des Ports. Der Inhalt der Datei sieht meistens in etwa so aus: " ¡". Ich hab auch mal eine Kontrollausgabe des Ports gemacht wobei da meistens ein Port 1000+ rauskommt (z.B. 1185) statt 8080.

Kann mir evtl jemand erklären woran das zum einen liegt das bei der Ausgabe auf der Konsole ein anderer Port rauskommt und warum in der Datei nur irgendwelche Zeichen landen!?
ja - Du musst lernen Binär-zahlen zu lesen ... oder Du konvertierst die vorher in entsprechende Zeichen die unser kleines menschliches Gehirn besser verarbeiten kann

Java:
				dos.writeln(port.toString());

hand, mogel
 

Evileye

Mitglied
Vielen dank für deine Antwort, ich hab das jetzt so gelöst das ich beim Prüfen ob der Client noch sendet eine boolean Variable auf false setze die dann auch die Schleife beendet.

Und zu dem anderen...ich hätte mir ja nur die Funktionsbeschreibung nochmal genauer durchlesen müssen. Beides "Fehler" auf die ich auch selbst hätte kommen können, ich schiebs einfach mal auf den Prüfungsstreß obwohl die noch nicht angefangen haben. ;)

Aber eine kleine Frage hab ich noch, wieso wird nicht der Port 8080 in die Datei geschrieben?
Liegt das daran das Client und Server auf dem selben Rechner laufen?
 

Kr0e

Gesperrter Benutzer
Hi Evileye,

nur so aus Neugier... Hast du zufälligerweise Linux ?

Hatte das selbe Problem mal unter Linux... Windows schließt ansich alles ordentlich, bzw die VM...
Ist ein häufiges Problem unter manchen Linux Dist. in Verbindung mit Java.

Gruß,
Chris

PS: Vlt. hilft sowas wie ServerSocket.setReuseAddress(true) ...
 
T

tuxedo

Gast
Hi Evileye,

nur so aus Neugier... Hast du zufälligerweise Linux ?

Hatte das selbe Problem mal unter Linux... Windows schließt ansich alles ordentlich, bzw die VM...
Ist ein häufiges Problem unter manchen Linux Dist. in Verbindung mit Java.

Das ist kein "Linuxproblem". Auch Linux schließ0t alles ordentlich und gibt's wieder frei. Nur eben mit anderen Einstellungen wie Windows.

Wenn du unter Linux nen Socket sauber schließt, ist der i.d.R. auch gleich wieder frei. Schießt du den Socketserver ab oder schließt irgendwo irgendwas nicht sauber, so bleibt der Socket je nach OS-Einstellung 2-5min hängen bevor er vom OS geschlossen wird.

Man kann aber in Java eine SocketOption für die Wiederbenutzung einschalten (Socket Options in Java). Dann gibts keine großen Probleme.

- Alex
 

Kr0e

Gesperrter Benutzer
Hmm, nunja ansich ist das dann schon ein Linuxproblem oder nicht ?! :D
Denn das Problem tritt unter Windows ansich nicht auf.
Woran das genau liegt ist ja egal.. Fakt ist, dass Linux in dem Punkt Probleme macht.


Gruß Chris

PS: Wieso hab ich das Gefühl, dass du Linux benutzt Tuxedo ? :p
Ich wollte Linux nicht schlecht macht...
 
T

tuxedo

Gast
Fakt ist, dass Linux in dem Punkt Probleme macht.

Naja, ich seh das so: Linux wird überwiegend für Serversysteme eingesetzt. Und da laufen i.d.R. jede Menge Anwendungen die Sockets auf und zu machen.

Wenn du nun mit Java und Sockets, die du wiederverwenden willst, in Kombination mit Linux ein Problem hast: Woran liegt das dann? An Linux? Find ich unwahrscheinlich. Denn so viele andere scheinen damit keine Probleme zu haben. An Windows? Vermutlich nur dann, wenn man dies als Referenz-System heranzieht ;-)

Alles in allem kann man wohl sagen dass es am Programm liegt. "Falsch" macht Linux im verleich zu Windows nix. Nur eben anders. Das "wieso" hab ich noch nicht rausbekommen *nochmal googeln geh*

- Alex
 
G

Gast2

Gast
Hmm, nunja ansich ist das dann schon ein Linuxproblem oder nicht ?! :D
nein ist es nicht ... es ist auch kein Unix Problem, kein Windows Problem ... hat nix mit Apple am Hut ... wenn das Betriebssystem nach Dir aufräumen muss, dann darf es das machen wann es das will ... wenn Du die Resource (in dem Fall Socket-Port) sofort wieder benutzen willst, dann musst Du es selber Aufräumen ... also nicht einfach Programm abschießen

hand, mogel
 
T

tuxedo

Gast
Wenn ich mich nicht irre, dann läuft man in die gleiche Situation wenn man das Programm sauber beendet und sofort wieder startet. Wenn ich richtig gelesen habe setzt Linux den Socket in den "wait_state" und lässt ihn da, obwohl er nicht mehr gebunden ist, für 2min.

Bei Windows hängt er AFAIK nur dann im wait_state wenn man nicht aufräumt.

wait_state hat aber an sich nix mit aufgeräumt oder unaufgeräumt zu tun. Linux und Windows verhalten sich da einfach anders. Wieso konnte ich noch nicht in Erfahrung bringen.

- Alex
 

Kr0e

Gesperrter Benutzer
Ganz genau Tuxedo ;) Genau dieses Verhalten konnte ich ebenfalls bemerken!
Und Mogel, dass ist dann doch ein Linux/Unix Problem ...
 

FArt

Top Contributor
Ja, das Problem hatte ich auch schon ...*G*

RFC793 sagt nichts darüber aus, wie lange ein Status gehalten werden soll bzw. muss. Je konservativer ein BS sich verhält, desto länger gilt der Status TIME-WAIT... das ist somit unabhängig von Windows oder Linux.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
ExceptionOfExpectation Server/Client-Kommunikation Netzwerkprogrammierung 34
I Client/Server Kommunikation bei einem Spiel Netzwerkprogrammierung 4
brainless Client Server Kommunikation verschlüsseln Netzwerkprogrammierung 13
T Socket Server/Client Kommunikation Netzwerkprogrammierung 8
P MIME-TYPE Erklaerung, Kommunikation zwischen Client und Server Netzwerkprogrammierung 3
J Sichere Kommunikation bei Server Client Netzwerkprogrammierung 3
M allgemeine Frage über Server-Client-Kommunikation Netzwerkprogrammierung 5
L Ratschlag zur Umsetzung einer client-server-Kommunikation Netzwerkprogrammierung 6
R Server zu Client Kommunikation Netzwerkprogrammierung 11
V Socket UDP Server/Client Kommunikation sehr langsam Netzwerkprogrammierung 2
F Socket Server/Client Kommunikation Netzwerkprogrammierung 4
X Problem mit Server-Client-Kommunikation Netzwerkprogrammierung 14
D Server-Client (Web) Kommunikation Netzwerkprogrammierung 9
C HTTP Studienarbeit Kommunikation via HTTP mit POST zwischen Server und Client Netzwerkprogrammierung 7
G Problem mit Client-Server Kommunikation Netzwerkprogrammierung 4
G unvollständige Daten: Http Client-Server-Kommunikation Netzwerkprogrammierung 2
J client/server kommunikation Netzwerkprogrammierung 3
M Client-Kommunikation ohne Server Netzwerkprogrammierung 7
S Kommunikation Fortran <-> Java auf Client-Server-Archi Netzwerkprogrammierung 2
G JINI über RMI // Client-Server Kommunikation Netzwerkprogrammierung 4
I Performanteste Kommunikationsmethode zwischen Client u. Server Netzwerkprogrammierung 4
L Socket Automatische Zuweisung von Server und Client Rolle Netzwerkprogrammierung 12
M Server-Client-System für Browsergame Netzwerkprogrammierung 5
Yonnig Threads mit Client/Server und GUI (laufend bis button-click) Netzwerkprogrammierung 9
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
D Slf4j - Logging - Client-Server Architektur 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
R Socket FATAL EXCEPTION MAIN bei Socket based client/server app Netzwerkprogrammierung 2
G Server-Client IO Problem Netzwerkprogrammierung 6
I Socket Das erste Server-Client Programm Netzwerkprogrammierung 16
M Socket Server antwortet dem Client nicht Netzwerkprogrammierung 6
E Objekte versenden, Client-Server Netzwerkprogrammierung 25
C Mini Client-Server-Anwendung funktioniert nicht Netzwerkprogrammierung 8
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
P RMI Client Server Programm über Internet Netzwerkprogrammierung 2
gamebreiti Socket Server / Client Anwendung Manipulation von Objekten durch Server Netzwerkprogrammierung 9
F Server Client Anwendung mit UDP Netzwerkprogrammierung 2
A RMI Wo treten Exceptions bei RMI Aufrufen auf? Auf Client oder auf Server? Netzwerkprogrammierung 3
A ByteBuffer - Client/Server Netzwerkprogrammierung 9
K C# Server - Android Client Netzwerkprogrammierung 0
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
E Thematik Client server 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 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
U Socket Instant Messanger (Server Linux, Client Windows) Netzwerkprogrammierung 1
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
F Tipps zum Thema Server/Client vie SOAP Netzwerkprogrammierung 0
F Socket Java - Server/Client simple Netzwerkprogrammierung 1
R Zeitliche Syncronisation Server - Client Netzwerkprogrammierung 0
S Server-Client: Image senden Netzwerkprogrammierung 2
C Multithreading Client / Server erklärt Netzwerkprogrammierung 11
P server - client verbindung (anfänger) Netzwerkprogrammierung 8
J Client Server - Serialisierung Netzwerkprogrammierung 8
Luk10 Server / Client: Clients speichern! Netzwerkprogrammierung 6
K Client => Server Netzwerkprogrammierung 2
A ? Home-Network, Server/Client-Einrichtung Netzwerkprogrammierung 4
S Socket Server: ConnectionError vom Client erkennen Netzwerkprogrammierung 31
A Java Server - IOS Client Applikation Netzwerkprogrammierung 20
M RMI RMI Probleme zwischen Client und Server Netzwerkprogrammierung 5
J Erster Server-Client läuft auf lokalem Rechner problemlos. Zwei Rechner über das Internet nicht Netzwerkprogrammierung 8
N Client-Server-Datenbank Netzwerkprogrammierung 13
Kjubert Synchronisieren von Objekten über Client/Server - bester Weg? Netzwerkprogrammierung 7
B Client/Server Connection Problem Netzwerkprogrammierung 2
S Server Client Daten hin und herschicken Netzwerkprogrammierung 2
D TCP Verbindung (Java Client und Visual Basic Server) Netzwerkprogrammierung 12
S Socket Applet Client bekommt keine GLOBALE Verbindung zum Server Netzwerkprogrammierung 25
T Server und Client verbinden nicht Netzwerkprogrammierung 6
D Server Client Verbindung - Unexpected End of File - Invalid HTTP Response Netzwerkprogrammierung 4
das-mo Client/Server sendet nicht Netzwerkprogrammierung 7
Z Socket Server/Client vernünftiger Verbindungsabbruch Netzwerkprogrammierung 4
G Bild über Socket schicken - Client/Server Netzwerkprogrammierung 10
F TCP Server/Client Netzwerkprogrammierung 14
M Problem Client - Server Sockets: .ready() wird nie true! Netzwerkprogrammierung 6
Ollek Socket Sucher passende Server/Client Lösung für meine Anwendung Netzwerkprogrammierung 2
N eine klasse mit server & client Netzwerkprogrammierung 5
D RMI Gui auf client updaten basierend auf den Property Änderung des Models auf dem Server ohne polling Netzwerkprogrammierung 12

Ähnliche Java Themen

Neue Themen


Oben