簡體   English   中英

Java套接字端口號自行更改

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM