# wie finde ich die ip adresse vom client heraus?



## Search (18. Okt 2004)

hallo,

habe nun schon eine weile das internet nach einer lösung abgesucht bin jedoch nicht wirklich fündig geworden. wie kann ich die ip adresse von einem client herausfinden? der client connected über sockets auf den server. mit einem serverSocket.accept() wird er vom serve angenommen. wie finde ich jedoch nun die ip adresse des clients heraus. bei allem was ich bisher probiert habe, bekam ich nur die ip adresse des servers heraus. hoffe mir kann jemand helfen. hier noch einen code ausschnitt:


```
if (userConnection == null) userConnection = new Hashtable (20, 10);
			
ServerSocket serverSocket = new ServerSocket(8051);
Socket socket = null;
			
System.out.println("Server waiting for client on port " + serverSocket.getLocalPort());
			
boolean flag = true;

while(flag) 
{
        socket = serverSocket.accept();	
							 
	String IP = socket.getLocalSocketAddress().toString();
	int Port = socket.getPort();
	System.out.println("New connection accepted" + IP);
```

danke und gruss


----------



## Guest (18. Okt 2004)

Schon versucht?
	
	
	
	





```
socket.getRemoteSocketAddress()
```


----------



## Search (19. Okt 2004)

danke für die antwort... hab ich jedoch auch schon probiert... geht auch nicht... frage mich langsam ob das überhaupt geht... dachte ich hätte sowas schon gsehen... finde es jedoch nicht mehr... sonst jemand noch nen vorschlag?

danke und gruss


----------



## Bleiglanz (19. Okt 2004)

warum schaust du nicht in die API?


> java.net.Socket
> 
> getInetAddress
> 
> ...


----------



## Search (19. Okt 2004)

hab ich ja... alles schon probiert... bekomme jedoch immer meine ip... also das ganz sieht folgendermassen aus... den server (also das servlet) lasse ich auf meine maschine laufen... mein kollege connected dann über meine ip auf den server (also http://meinIP/seite.jsp)... im socket = serverSocket.accept() sollte doch nun nicht meine ip stehen, oder? oder verstehe ich da etwas komplett falsch? wenn ja, wie bekomme ich die ip dann heraus von einem client?

danke und gruss


----------



## moik (19. Okt 2004)

kann es sein dass du .jsp, servlets und server durcheinanderbringst?

deswegen habe ich deine architektur nicht wirklich verstanden. dass du immer die ip-adresse deines rechners bekommst, riecht doch schwer danach, das dein lokaler rechner als client auftritt (über webserver).


----------



## Bleiglanz (19. Okt 2004)

wenn dein Kollege eine jsp auf einem auf deinem Rechner laufenden Server aufruft und diese jsp dann im Code einen Socket zu einem ebenfalls auf deinem Rechner laufendem ServerSocket aufbaut, dann ist natürlich dein lokaler Rechner der Remote-Endpunkt!

Oder hast du ein Applet im Einsatz?

du kannst ja in der JSP anfangen: schau mal in die API vom request


> getRemoteAddr
> 
> public String getRemoteAddr()
> 
> ...


----------



## Search (19. Okt 2004)

hmm... ja bei mir starte ich den server (tomcat) und das servlet (über den browser)... es läuft in dem sinn beides lokal bei mir... das servlet öffnet einen serverServer socket auf welchen ich vom client her connecte. hab gedacht, dass wenn ichs wie folgt mache die client informationen im socket stehen:


```
socket = null;
while(true) {
    socket = serverSocket.accept()

usw.
```

aber dem ist wohl nicht so. muss ich dann wohl anders lösen. 

danke für eure antworte, muss das nochmals genauer anschauen. 

gruss


----------



## Search (19. Okt 2004)

noch was... macht es denn einen unterschied ob ich von einem applet oder einem jsp auf den server connecte?

gruss


----------



## Bleiglanz (19. Okt 2004)

ja, weil beim

applet ist der "client" ja der entfernte Rechner, auf dem ein Browser läuft und in dessen VM der Socket aufgebaut wird

und beim

jsp=servlet-engine=tomcat/jetty ist der Rechner, auf dem die VM läuft, in der die Servlet-Engine läuft, der "client"

im zweiten fall kannst du also nicht so ohne weiteres feststellen, woher der "remote" Socket kommt (ausser über den HTTP Request)


----------



## Search (19. Okt 2004)

vielen dank für deine antworten. luechtet irgendwie ein was du gesagt hast  habs jetzt über den request gelöst. das funkioniert nun auch. habe nun jedoch noch ne frage. um auf beide seiten kommunzieren zu können (server-client, client-server) muss ich danach vom server auf den client connecten. gibt es irgendwie die möglichkeit diese sockets zu speichern? habs mit nem hashtable versucht. key username, value socket, wenn ich das socket dann jedoch auslese ist es geschlossen. warum das? und besteht dann die möglichkeit einen reconnect zu machen? hab da in der api nix zu gefunden.

danke und gruss


----------



## Bleiglanz (19. Okt 2004)

Nein, der Socket ist total transient, er lebt nur, wenn tatsächlich eine TCP Verbindung realisiert ist und auf beiden Hosts die entsprechende Software läuft.

So wie du das sizzierst, gehts sicher nicht: auf dem Client gibts ja keinen ServerSocket, der auf eingehende Verbindungen wartet. Den musst du dir selbst schreiben und den Reconnect dann manuell durchführen

Bei deiner JSP/Servlet Lösung unmöglich, weil ein HTTP Request sehr kurz ist und es keinen Sinn hat auf etwas zu "lauschen", wenn der Sepp seinen Browser längst zugemacht hat...


----------



## Search (19. Okt 2004)

ok... dann muss ich wohl auf dem client ein applet machen welches einen listener öffnet auf welchen der server nachher connecten kann. wenn ich nun also mit einem applet auf den server connecte bleibt dann der socket offen? oder muss ich bei jedem zugriff den socket wieder öffnen? und kann ich einem applet parameter mitgeben für die connection?

gruss


----------



## Bleiglanz (20. Okt 2004)

nein bleibt offen (Applet läuft ja als Thread), Parameter sind natürlich eine gute Idee 

timeout Probleme beachten

BrowserFensterSchliessenProblem beachten

Security beachten (evtl. signiertes Applet nötig)


----------



## Search (25. Okt 2004)

ok das ganze läuft nun mal so einigermassen... hab nun ein signiertes applet "gebaut" welches eine connection auf den server macht... über die ip des client connected der server auf den client... dieses socket wird in einer hashmap gespeichert..das problem ist nun jedoch das beim herauslesen das socket geschlossen ist... muss ich da nun jedes mal einen reconnect machen? wenn ja, wie? und wenn nein, was mache ich falsch oder wie gehts anders?

danke und gruss


----------



## Bleiglanz (25. Okt 2004)

wozu die hashmap?

wo liegt die: am applet oder am server?

versuchst du doch nicht etwa, die hashmap übers kabel zu schicken?

warum nicht als member-Variable in der applet-classe (wenn du sie in der init-Methode erzeugst)?


----------



## Search (25. Okt 2004)

da ich ja mehrere clients habe welche auf den server connecten muss ich die ja irgendwie speichern... mache dies in einer hashmap welche auf dem server liegt... 
also die hashmap wird wie folgt erzeugt:


```
Hashtable userConnection = null;
	
	/** @modelguid {CEA53053-5F31-463A-A763-681D58882310} */
	public void init() throws ServletException
	{
		super.init(); 
	
		try 
		{
			// initialize Hastable if it is not yet initialized
			if (userConnection == null) userConnection = new Hashtable (20, 10);
			
			ServerSocket serverSocket = new ServerSocket(8051);
			Socket socket = null;
```

müsste so doch eigentlich gehen.. 


danke für deine hilfe, gruss


ps: hab zu dem thema auch noch einen neuen thread aufgemacht...


----------

