Java套接字端口号自行更改

标签 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

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

最佳答案

Java socket port number changes on its own

不,没有。您正在查看两个不同的套接字和两个不同的端口。连接由两个端点组成。客户端socket的localPort是50261,这是出站端口,而服务器端接受的socket的localPort是1234,与正在发送的端口相同听过。

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

Neither threads move on from this point. What's going on here?

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

关于Java套接字端口号自行更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44037017/

相关文章:

Java Spring @Scheduled 任务执行两次

java - 使 Scala 代码可与 Java 库互操作

c++ - 我有一个服务器在套接字上监听,有什么好方法可以通过多个线程来服务 CPU 绑定(bind)请求?

javascript - Heroku 服务器 Web 套接字连接拒绝客户端站点上的错误

java - java 和 nmap 中的套接字

java - 在一个 Servlet 中同时处理

java - Freemarker 中的嵌套表达式

Java映射,少数按键冲突,解决方法

sockets - 将 bytearray 与 socket.recv_into 一起使用

java - 使用java通过socket接收python json