java - 如何有一个套接字列表 Java
问题描述
基本上,我想要一个“监听”线程来创建一个主线程可以访问的套接字向量。我的听法是这样的
ServerSocket listener = new ServerSocket(port);
while (connections.size() < 9) {
connections.add(listener.accept());
System.out.println("Connected Person");
}
但我认为因为 java 通过引用传递,它只是在向量上推送一个引用,所以当第二个连接进来时,现在连接 [0] 和连接 [1] 是相同的套接字,对吗?
此外,当该线程终止时,侦听器变量也终止,因此向量中充满了空的套接字引用。我希望能够将套接字复制到向量中,但是每个指南都说我必须将复制函数添加到对象中,但是我不知道当我使用预定义的 ServerSocket 类型时该怎么做。
编辑:这是一个 P2P 系统,每个用户都知道彼此的用户。此外,我的“发送”函数循环通过向量,将每个套接字发送到向量中。然后从向量中的每个套接字读取读取。错误是套接字没有接收/发送
解决方案
但我认为因为 java 通过引用传递它只是在向量上推送一个引用,所以当第二个连接进来时,现在
connections[0]
和connections[1]
是相同的套接字,对吗?
Java 不是按引用传递1。它是按值传递的。请参阅Java 是“按引用传递”还是“按值传递”?.
在这种情况下,传递(实际返回)的值是对
Socket
对象的引用。每次该
accept()
方法返回时,它都会返回对不同Socket
对象的引用。因此,connections.get(0)
和connections.get(1)
会指代不同的Socket
对象。
此外,当该线程终止时,侦听器变量也终止,因此向量中充满了空的套接字引用。
没有。Vector
a可以充满“空”(即null
)引用的唯一方法Socket
是,如果某些东西明确地将它们放在那里。您的代码不会这样做。您的代码将非空引用放入connections
. 即使相应的Socket
对象关闭,它们也会留在那里。(如果你想摆脱它们,你需要将它们从Vector
.
我希望能够将套接字复制到向量中...
这不是如何Vector
工作的。AVector
保存对对象的引用,而不是对象。
此外,复制Socket
对象是不可能的。它们是不可复制的。
我认为你需要回到基础,了解 Java 中对象和引用之间的区别。'因为从 Java 的角度来看,您所说的没有多大意义。
编辑:这是一个 P2P 系统,每个用户都知道彼此的用户。此外,我的“发送”函数循环通过向量,将每个套接字发送到向量中。然后从向量中的每个套接字读取读取。错误是套接字没有接收/发送。
这可能是由很多事情引起的,如果没有看到最小的可重现示例,我认为我们无法为您提供帮助。
1 - 如果您看到一些声称 Java 是通过引用传递的文章,请忽略它。要么作者不了解 Java,要么他们不了解“传递引用”的真正含义。(或者他们争辩说“通过引用”应该意味着与它实际含义不同的东西......这是一个非常糟糕的主意。它是“替代真理”的废话......就像一些微软人认为C是一种面向对象的语言!)
推荐阅读
- c++ - 英特尔 C++ 无法在 mac osx 上打开“wchar.h”
- memory - FSB、RAM MHz、MT/s、内存分频器 1:1、Core2Duo
- excel - Powershell 错误:来自 HRESULT 的异常:0x800A03EC
- apache-spark - 如何加速 Spark (Pyspark) 中的缓存?
- c - C初学者问题:数组不打印
- excel - 防止 EventChange Sub 意外运行
- r - 如何根据其他数据框上的多个条件创建列
- kubernetes - Kubernetes Operator CSV 停滞不前
- ruby-on-rails - 如何调试 rails db:structure:dump?
- elasticsearch - 如何使用nest 7在索引映射中定义自定义过滤器