Können zwei verschiedene UDP-socket in ein system binden gleichen port?
Ich habe eine Anwendung, die UDP-Verbindung, jetzt wenn ich versuchen zu laufen, die app mehr als einmal seine werfen mir eine Ausnahme
java.net.BindException: Address already in use: Cannot bind
aber in meine andere app, die tcp-Verbindung hat, kann ich zwei offene Instanz von der gleichen app und seine Arbeitsmethoden in Ordnung. warum dieser Fehler nur mit UDP-Verbindung?
Edit:
TCP socket:
Socket clientSocket= new Socket(ipAddress, 8000);
Socket clientSocket1= new Socket(ipAddress, 8000);
Ist, wenn ich die TCP-socket wie oben,mit gleichen port, es ist nicht das werfen einer Fehlermeldung. aber wenn ich das mit UDP-Socket-es warf mich eine Ausnahme, warum?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es hat zu tun mit dem Unterschied zwischen TCP und UDP. Beim erstellen einer TCP-socket erstellen Sie eine synchrone client-Verbindung an den port an eine andere Maschine, und wenn Sie eine Verbindung zu einer Adresse, die Sie tatsächlich bekommen, um einen lokalen port auf den socket als gut. Also in deinem Beispiel-code, der zwei sockets erstellt werden könnte
Beachten Sie, dass Sie, während Sie die remote-Adresse ist die gleiche, die lokale Adresse hat, die verschiedenen Häfen, das ist der Grund, warum das erlaubt ist. So, hier die lokale eine remote-Maschinen können zuverlässig senden die Daten hin und her mit der etablierten Häfen.
Für UDP ist dies nicht der Fall (ich gehe davon aus, dass Sie mit DatagramSocket). Da der UDP-asynchron (im Gegensatz zum synchronen wie TCP), erhalten Sie Daten, die Sie nicht erstellen Sie eine Bindung an einen bestimmten Rechner, so zum Beispiel, wenn Sie waren zu versuchen,
den udp-socket nicht wissen, wo die Daten herkommen, also kann es nicht sein, eine eindeutige Zuordnung, wie TCP, auch im Gegensatz zu TCP der port, den Sie angeben, wird Ihre Maschine-port, und nicht auf einer entfernten Maschine port.
Einen anderen Weg zu denken, wenn Sie erstellen eine UDP-socket-es ist wie das anlegen eines TCP-server-socket. Beim anlegen eines TCP-server-socket wartet auf eine Verbindung, um von einer Maschine, sondern die Maschine ist unbekannt, und beim anlegen eines TCP-server-socket der port, den Sie angeben, wird ein lokaler port:
Wieder wie UDP-dies schafft eine binden Ausnahme, weil der port für den lokalen Computer und die Zuordnungen sind nicht mehr einzigartig. Aber wenn Sie akzeptieren eine Verbindung auf einen server-socket, auf dem der remote-Maschine kommt ins Spiel, um die Buchse einzigartig, genau wie beim erstellen eines Socket an eine remote-Maschine:
Beachten Sie, dass, obwohl die lokale Adresse ist die gleiche, die remote-Adressen für die Steckdosen sind anders, und daher ist die Gesamt-Zuordnung (localip:port<->remoteip:port) ist jetzt einzigartig.
So, in einer Weise, die Sie denken können einen UDP-socket als wie eine Art von TCP-server-Sockets und das ist, warum Sie müssen binden Sie es an einen eindeutigen port.
Sind Sie sicher, dass der TCP-Anwendung, die wirklich eine Bindung mit einem nicht-null-port-Nummer? Es sollte nicht Arbeit für TCP entweder. Der Zweck von port-Nummern zu identifizieren, die laufende Instanz der Anwendung auf der route der Verkehr auf; wenn zwei Anwendungen waren zu jeder binden zwei sockets an dieselbe port-Nummer das routing unmöglich wird, die ist, warum es ein Fehler ist.