Java套接字端口号自行更改

时间:2017-05-18 01:06:03

标签: java sockets

客户端

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

这两个线程都没有继续前进。 这是怎么回事?

1 个答案:

答案 0 :(得分:3)

  

Java套接字端口号自行更改

不,它没有。您正在查看两个不同的插槽和两个不同的端口。连接由两个端点组成。客户端套接字的localPort是50261,它是出站端口,服务器上接受的套接字的localPort是1234,与正在侦听的端口相同。

查看相应的getRemotePort()值。您将看到客户端是1234而服务器是50261,或者更确切地说它与客户端的localPort一致,无论您下次运行它是什么。< / p>

  

这两个线程都没有继续前进。这里发生了什么?

您需要在ObjectOutputStream 之前构建ObjectInputStream ,原因在Javadoc和许多答案中解释,例如this one