为什么这是不可能发生的(注意,客户端强制使用相同的本地端口在其连接)的快速/肮脏的例证:
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