【发布时间】:2013-05-05 02:01:25
【问题描述】:
我整天都在考虑这个问题,我真的不认为标题是否正确,但在这里,让我解释一下我的情况:我正在做一个项目,一个用 Java 制造的服务器,供客户使用德尔福。连接很好,多个客户端都有自己的线程,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;
}
但我希望您告诉我是否有更好的方法来执行此操作,比将所有这些套接字存储在列表/哈希图中更好。如何在没有引用变量的情况下获取这些对象?或者也许这是一个很好的方法,我只是想超越限制。
P.S.:我尝试将 Client 对象存储在数据库中,并对其进行序列化,但套接字无法序列化。
谢谢。
【问题讨论】:
-
是什么阻止你在
Client类中保留引用? -
客户端类中有一个引用,(new Client()),但我没有客户端类的所有引用。感谢您的回答
-
我建议您以某种方式跟踪您的客户端,而不是套接字,然后在
Client类中添加一个方法来通知客户端,例如Client#notify("data is available") -
您说您无法控制客户端代码,但您希望获得有关如何更改流程的建议,以便他们知道他们的工作已完成并获取结果。如果客户端不更改代码,您将如何在服务器中进行更改?
-
我真正想要的是一种方式来告诉他们他们的工作已经完成,通过 Socket,我的意思是,只是消息。使用 hashmap
我可以做到,但我只是想看看人们是否有更好的方法。但是我会关闭连接并将哈希图中的位置设置为 Null,所以垃圾收集器会做其他工作
标签: java sockets serversocket