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
这两个线程都没有继续前进。 这是怎么回事?
答案 0 :(得分:3)
Java套接字端口号自行更改
不,它没有。您正在查看两个不同的插槽和两个不同的端口。连接由两个端点组成。客户端套接字的localPort
是50261,它是出站端口,服务器上接受的套接字的localPort
是1234,与正在侦听的端口相同。
查看相应的getRemotePort()
值。您将看到客户端是1234而服务器是50261,或者更确切地说它与客户端的localPort
一致,无论您下次运行它是什么。< / p>
这两个线程都没有继续前进。这里发生了什么?
您需要在ObjectOutputStream
之前构建ObjectInputStream
,原因在Javadoc和许多答案中解释,例如this one。