Die richtige Socketparameter finden

Lastlord

Mitglied
hallo alle zusammen, (sorry für den Fehler im Titel)
ich schreibe ein Chatprogramm, was soweit auch super funktioniert.
Neuerdings habe ich eine Dateiübertragungsfunktion eingebaut, die mir Probleme bereitet:(.
Die Dateiüberragung soll wegen begrenztem Servertraffic direkt von Client zu Client laufen( ich galube das heist Peer to Peer).
Naja der Server im Internet gibt Auskunft über die Daten des Partners.

Meine lokale IP: 192.168.0.100
Server sagt meine IP ist: 79.201.235.151

Lokale IP von Partner: 192.168.0.101
Server sagt seine IP ist: 79.201.235.151
Sein Serversocket ist auf Port 8999 geöffnet.


Ich benutze folgenden Konstruktor:
Java:
Socket(String host, int port, InetAddress localAddr, int localPort)

Für host würde ich 79.201.235.151 einsetzen
und für localAddr 192.168.0.101
aber kommt die 8999 jetzt zu port oder zu localPort ?

Und wenn ich die 3 Werte eingetragen habe fehlt immer noch einer.
Was kommt dann da rein?

Weiß einer wie das geht?
 
Zuletzt bearbeitet:
Wenn du dich direkt zum anderen Client verbinden willst muss dieser auch auf einem Port horchen und einen ServerSocket laufen haben, ich gehe mal davon aus, dass das dann Port 8999 ist.

In diesem Falle müsstest du Port 8999 als "Port" angeben. Der localPort ist in der Regel irrelevant und kann vernachlässigt werden. Falls du ihn nicht per Hand setzt wird dort ein zufälliger Port benutzt. Ich würde daher auch an deiner Stelle einen anderen Constructor verwenden.

Code:
Socket(InetAddress address, int port)
Sollte eigentlich vollkommen ausreichen. Oder eben
Code:
	Socket(String host, int port)

Ich hoffe ich habe dein Problem jetzt richtig verstanden.

MfG
MrCastle
 
Zuletzt bearbeitet:
Vielen dank für deine Antwort,
so wie du es sagst habe ich es auch gemacht, allerdings bei meinem Serversocket das sich auf einem Server im Internet befindet.

In diesem Fall geht es aber um eine Verbindung von einem Computer zu einem anderen.
Ein Pc ist zB. bei mir zuhause und einer bei meinem Freund. Mein Problem ist jetzt die Adressierung. Mein Server im Internet ist mit beiden Computern verbunden um den beiden Computern jeweils die IP des anderen mitzuteilen. Die IPs holt sich der Server( im Internet ) über die Methode socket.getInetAddress().

Um das ganze zu testen habe ich bei mir @home 2 Computer gestartet und versucht eine Datei zu übertragen. Die Verbindungsdaten stehen in meinem ersten Post.

Leider sagt des Server, das beide die selbe IP haben. Also muss es um die Routerip handeln, denn es sind beide Computer am selben Router angeschlossen.

Daher dachte ich, dass das man dem Socket noch sagen muss, welchen Computer ich hinter dem Router, also im lokalen Netzwerk, ansprechen will.

Vll. kann man ja den Konstruktor Socket(String host, int port) benutzen.

Nur wie soll dann der Parameter host aussehen, wenn 79.201.235.151 nicht funktioniert?
Wie kann ich den Computer im Netzwerk angeben, den ich erreichen will?
 
Zuletzt bearbeitet:
Dein Fall ist etwas spezieller, da sie sich sogar im gleichen LAN befinden, da könnte man theoretisch direkt auf die lokale IP gehen, was aber ja im Normalfall denke ich mal nicht erwünscht ist.
Das heißt also, dass beide nur über die Router IP ansprechbar sind, da reicht es eigentlich aus, wenn du beiden Clients verschiedene Ports gibst auf denen sie horchen (natürlich auch im Router forwarded für den jeweiligen local client, sprich einfach die Eigenheiten des NAT benutzen).
 
Also mit lokaler IP geht alles.
In meinem Fall ist immer nur ein Serversocket offen und trotzdem kann die Verbindung nicht aufgebaut werden. Es muss doch ne Möglichkeit geben, zu bestimmen welchen Rechner man im Netzwerk ansprechen will.(Gibts da nicht vll. ne IP-Syntax für)
Vll. hats doch was mit dem Konstruktor aus dem ersten Post zu tun.

Tut mir Leid MrCastle aber was heist Router forwarden?
 
Im Grunde ist das eben genau was du suchst wenn ich das richtig verstehe, nur kann man das nicht mit Java direkt umsetzen ;) (zumindest wüsste ich nicht wie :D)

Einfach ausgedrückt:

Der Router repräsentiert dein LAN nach außen hin, eine Anfrage auf einen Host in deinem LAN führt also (in der Regel) über diesen einen Router. Um spezielle Hosts in deinem LAN von außerhalb anzusprechen kann per NAT (Network Address Translation) ein bestimmter Port auf einen bestimmten Host im LAN weitergeleitet werden.

Beispiel:

Host 1 (192.168.1.10) hört auf Port 8999.
Host 2 (192.168.1.11) hört auf Port 8999.

Innerhalb wunderbar, von außen kannst du aber auf dem Port 8999 nur einen Host ansprechen, da du Port 8999 nur auf einen Host weiterleiten kannst, welcher das dann ist konfiguriert man im Router (z.B. unter den Punkten Port-Forwarding oder Portfreigabe, je nach Anbieter anders, musst mal in deinem Router danach suchen).

-->

Host 1 (192.168.1.10) hört auf Port 8999.
Host 2 (192.168.1.11) hört auf Port 9000.

So wären beide von außen ansprechbar.

79.201.235.151:8999 --> Anfrage geht zu Host 1
79.201.235.151:9000 --> Anfrage geht zu Host 2

---

Falls du jetz nur einen ServerSocket auf hast dann musst du den auch im Router für den entsprechenden Host freigeben, falls du über die Router-IP gehst. Ansonsten blockt er die Anfrage.
 
Zuletzt bearbeitet:
Vielen Dank für deine Hilfe MrCastle,
ich habe irgendewie das Gefühl, dass wir mit Kanonen auf Spatzen schießen.

Deshalb eine Frage: Ist es wirklich so schwer, eine Datei von einem Computer zu einem anderen zu schicken(also Peer to Peer), wenn beide normal über einen Router oder was auch immer ans Internet angeschlossen sind?
 
Zuletzt bearbeitet:
Das ist eigentlich der übliche Weg würde ich mal behaupten. WebServices wären noch eine Alternative, da könntest du die Daten direkt per Methodenaufruf übergeben, ist aber evtl. etwas mehr Aufwand.

Evtl findest du ja auch eine fertige Bibliothek dafür, ich glaube allerdings nicht, dass sich dadurch so viel an Code einsparen lässt.

Um die Port-Geschichte kommst du aber aufgrund der Router nicht drumherum, das ist ja auch bei den etablierten Instantmessengern nicht anders.
 
Vielen Dank für eure Antworten:),
ich habe mir das mit dem P2P leicher bzw. anders vorgestellt.
Das mit der Portumleichtung beim Router ist ne tolle Sache, nur leider kann man die Routerkonfiguration nicht per Programm automatisch ändern.
Ich benutze nun einfach den Server als Mittlsman und naja mit Traffic muss ich ma sehen:(.

Ich dachte P2P wäre ne Bezeichnung von Von HeimPC zu HeimPC aber Wiki hat mir gesagt das das nicht stimmt. P2P ist ne Netzwerkarchitektur.
Um von HPC zu HPC ne Datei zu übertragen ist JXTA overkill.
 

Neue Beiträge

Zurück