客户端
try {
Socket sock = new Socket("localhost", Integer.parseInt(args[0]));
System.out.println(sock.getLocalAddress());
System.out.println(sock.getLocalPort());
ObjectInputStream ois = new ObjectInputStream(sock.getInputStream());
ObjectOutputStream oos = new ObjectOutputStream(sock.getOutputStream());
oos.writeInt(55);
ois.readInt();
} catch (Exception e) {e.printStackTrace();}
服务器
try {
ServerSocket ss = new ServerSocket(1234);
Socket sock = ss.accept();
System.out.println(sock.getLocalAddress());
System.out.println(sock.getLocalPort());
ObjectInputStream ois = new ObjectInputStream(sock.getInputStream());
ObjectOutputStream oos = new ObjectOutputStream(sock.getOutputStream());
System.out.println(ois.readInt());
oos.close();
} catch (Exception e) {e.printStackTrace();}
我按顺序运行服务器,然后运行客户端。 我将 1234 作为命令行参数传递给客户端。换句话说,我这样执行线程
java server
java client 1234
这样做会将这些内容打印到控制台
// server
/127.0.0.1
1224
// client
/127.0.0.1
50261
两个线程都不会从此时开始继续前进。 这是怎么回事?
最佳答案
Java socket port number changes on its own
不,没有。您正在查看两个不同的套接字和两个不同的端口。连接由两个端点组成。客户端socket的localPort
是50261,这是出站端口,而服务器端接受的socket的localPort
是1234,与正在发送的端口相同听过。
查看相应的 getRemotePort()
值。您将看到客户端的端口是 1234,服务器的端口是 50261,或者更确切地说,它与客户端的 localPort
一致,无论您下次运行它是什么。
Neither threads move on from this point. What's going on here?
您需要在 ObjectInputStream
之前构造 ObjectOutputStream
,原因在 Javadoc 和此处的许多答案中都有解释,例如 this one 。
关于Java套接字端口号自行更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44037017/