首页 > 解决方案 > 如何有一个套接字列表 Java

问题描述

基本上,我想要一个“监听”线程来创建一个主线程可以访问的套接字向量。我的听法是这样的

ServerSocket listener = new ServerSocket(port);
while (connections.size() < 9) {
    connections.add(listener.accept());
    System.out.println("Connected Person");
}

但我认为因为 java 通过引用传递,它只是在向量上推送一个引用,所以当第二个连接进来时,现在连接 [0] 和连接 [1] 是相同的套接字,对吗?

此外,当该线程终止时,侦听器变量也终止,因此向量中充满了空的套接字引用。我希望能够将套接字复制到向量中,但是每个指南都说我必须将复制函数添加到对象中,但是我不知道当我使用预定义的 ServerSocket 类型时该怎么做。

编辑:这是一个 P2P 系统,每个用户都知道彼此的用户。此外,我的“发送”函数循环通过向量,将每个套接字发送到向量中。然后从向量中的每个套接字读取读取。错误是套接字没有接收/发送

标签: javasocketsreferencecopyserversocket

解决方案


但我认为因为 java 通过引用传递它只是在向量上推送一个引用,所以当第二个连接进来时,现在connections[0]connections[1]是相同的套接字,对吗?

  1. Java 不是按引用传递1。它是按值传递的。请参阅Java 是“按引用传递”还是“按值传递”?.

    在这种情况下,传递(实际返回)的值是对Socket对象的引用。

  2. 每次该accept()方法返回时,它都会返回对不同Socket对象的引用。因此,connections.get(0)connections.get(1)会指代不同的Socket对象。

此外,当该线程终止时,侦听器变量也终止,因此向量中充满了空的套接字引用。

没有。Vectora可以充满“空”(即null)引用的唯一方法Socket是,如果某些东西明确地将它们放在那里。您的代码不会这样做。您的代码将非空引用放入connections. 即使相应的Socket对象关闭,它们也会留在那里。(如果你想摆脱它们,你需要将它们从Vector.

我希望能够将套接字复制到向量中...

这不是如何Vector工作的。AVector保存对对象的引用,而不是对象。

此外,复制Socket对象是不可能的。它们是不可复制的。

我认为你需要回到基础,了解 Java 中对象和引用之间的区别。'因为从 Java 的角度来看,您所说的没有多大意义。

编辑:这是一个 P2P 系统,每个用户都知道彼此的用户。此外,我的“发送”函数循环通过向量,将每个套接字发送到向量中。然后从向量中的每个套接字读取读取。错误是套接字没有接收/发送。

这可能是由很多事情引起的,如果没有看到最小的可重现示例,我认为我们无法为您提供帮助。


1 - 如果您看到一些声称 Java 是通过引用传递的文章,请忽略它。要么作者不了解 Java,要么他们不了解“传递引用”的真正含义。(或者他们争辩说“通过引用”应该意味着与它实际含义不同的东西......这是一个非常糟糕的主意。它是“替代真理”的废话......就像一些微软人认为C是一种面向对象的语言!)


推荐阅读