爲什麼這是不可能發生的(注意,客戶端強制使用相同的本地端口在其連接)的快速/骯髒的例證:
public class Server{
public static void main(String[] args) throws Exception {
new Thread(){
java.net.ServerSocket server = new java.net.ServerSocket(12345);
java.util.ArrayList<java.net.Socket> l = new java.util.ArrayList<java.net.Socket>();
public void run() {
try{
while(true){
java.net.Socket client = server.accept();
System.out.println("Connection Accepted: S: "+client.getLocalPort()+", C: "+client.getPort());
l.add(client);
}
}catch(Exception e){e.printStackTrace();}
}
}.start();
}
和客戶端(的東西有效替代服務器地址):
import java.net.InetAddress;
import java.net.Socket;
public class SocketTest {
public static void main(String[] args) throws Exception {
InetAddress server = InetAddress.getByName("192.168.0.256");
InetAddress localhost = InetAddress.getLocalHost();
Socket s = new Socket(server, 12345, localhost, 54321);
System.out.println("Client created socket");
s.close();
s = null;
System.gc();
System.gc();
Thread.sleep(1000);
s = new Socket(server, 12345, localhost, 54321);
System.out.println("Client created second socket");
s.close();
System.exit(55);
}
}
如果你啓動服務器,然後嘗試運行客戶端的第一個連接會成功,但第二個將失敗,「java.net.BindException:已使用的地址:連接」
「如果設計使用不同的本地端口爲每個新連接的應用程序」 至於這就是自動發生的,沒有必要爲它設計的。避免在構建套接字時完全指定本地端口。 – EJP 2010-03-17 00:42:21
哦,是的,我的意思是,不應該設計一個應用程序來依賴於來自哪個端口的請求。 – KarlP 2010-03-17 08:06:47