【问题标题】:Java socket port number changes on its ownJava 套接字端口号自行更改
【发布时间】:2017-05-18 11:29:01
【问题描述】:

客户

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 sockets


    【解决方案1】:

    Java 套接字端口号自行更改

    不,它没有。您正在查看两个不同的套接字和两个不同的端口。一个连接由两个端点组成。客户端socket的localPort为50261,即出端口,服务端接受socket的localPort为1234,与被监听的端口相同。

    查看各自的getRemotePort() 值。你会看到客户端是1234,服务器是50261,或者说和客户端的localPort一致,不管你下次运行它是什么。

    从这一点开始,两个线程都不会继续前进。这是怎么回事?

    您需要在ObjectInputStream 之前构造ObjectOutputStream 之前,原因在Javadoc 和这里的许多答案中都有解释,例如this one

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-25
      • 2011-06-14
      • 2021-08-31
      • 1970-01-01
      • 2016-06-20
      • 2012-10-19
      • 2012-06-25
      • 2013-10-02
      相关资源
      最近更新 更多