我整天都在考虑这个问题,我真的不认为标题是否正确,但在这里,让我解释一下我的情况:我正在做一个项目,一个用 Java 制作的服务器,用于用 Delphi 制作的客户端。连接很好,多个客户端都有自己的线程,I/O 工作良好。客户端将字符串发送到我使用 BufferedReader 读取的服务器。根据服务器接收到的保留字,它会做出一个动作。在客户端发送字符串之前,它会将信息插入到 SQL Server 数据库中,以便服务器可以在通过套接字获取命令/命令后进行检查。服务器获取数据库中的信息,对其进行处理,然后将其发送到……我们称之为“黑暗面”。
在交易完成并将信息发送到黑暗方的那一刻,服务器将信息插入......咳咳,黑暗信息到数据库表中,以便客户端可以去获取它请求的内容。但是,我需要向客户报告!(“哟,再次检查数据库兄弟,你想要的是:3”)。
连接,插座是在其他类。不是我想用来回答客户端的那个,所以如果我没有套接字,我就没有输出流,我需要回复。那个类,一个处理和发送信息到黑暗面的类,将与数百个事务一起工作。
我的问题在这里:我无法向已完成的客户端报告,因为我没有该类中的套接字引用。我实例化客户端线程,例如:
new Client(socket).start();
没有引用变量的对象,但是,我可以选择:在建立新连接时将套接字及其 ip 存储在 HashMap 对象中,如下所示:
sockets.put(newSocket.getInetAddress().getHostAddress(), newSocket);
然后我可以得到套接字(这样我就可以得到输出流和答案)调用这样的静态方法:
public static Socket getSocket(String IP) {
Socket RequestedSocket;
RequestedSocket = sockets.get(IP);
return RequestedSocket;
}
但我想让你告诉我是否有更好的方法来做到这一点,比将所有这些套接字存储在列表/哈希图中更好。如何在没有引用变量的情况下获取这些对象?或者也许这是一个很好的方法,我只是想超越限制。
PS:我试图将Client对象存储在数据库中,对其进行序列化,但是套接字无法序列化。
谢谢。