[英]Java socket port number changes on its own
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套接字端口號自行更改
不,不是。 您正在查看兩個不同的套接字和兩個不同的端口。 連接由兩個端點組成。 客戶端套接字的localPort
是50261,這是出站端口,服務器上接受的套接字的localPort
是1234,與正在偵聽的端口相同。
看一下各自的getRemotePort()
值。 您將看到客戶端的是1234,服務器的是50261,或者更確切地說,它與客戶端的localPort
,無論下次運行它是什么。
從這一點來看,沒有線程繼續前進。 這里發生了什么?
您需要在ObjectInputStream
之前構造ObjectOutputStream
,原因在Javadoc和此處的許多答案(例如this)中都有解釋。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.