我一直在思考这一整天,我真的不认为如果标题是正确的,但在这里,让我解释一下我的情况:我正在一个项目中使用Java编写的服务器,用于在Delphi中创建客户端。连接线很好,多个客户端有自己的线程,I/O工作良好。客户端发送字符串到我用BufferedReader读取的服务器。根据服务器收到的保留字,它会执行一个操作。在客户端发送字符串之前,它会将信息插入SQL Server数据库,以便服务器可以在通过套接字获取订单/命令后进行检查。服务器获取数据库中的信息,处理它,然后发送给...我们称之为“黑暗的一面”。如何获取没有引用变量的套接字对象?
当交易完成,信息发送到黑暗的一面时,服务器会插入信息......咳嗽咳嗽,黑暗的信息到数据库表中,以便客户端可以去接受请求。但是,我需要向客户报告这一点! (“哟,再次检查数据库兄弟,你想要的是:3”)。
连接,插座是在其他类中。不是我想用来回答客户端的那个,所以如果我没有套接字,我没有OutputStream,我需要回应。那个班,处理和发送信息到黑暗的那个班,将会与成百上千的小组成员一起工作。
我的问题是在这里:我不能向客户报告已完成,因为我没有该类中的套接字引用。我实例的客户线程,如:
new Client(socket).start();
对象,而不引用变量,但是,我有一个选项,我可以采取:目前存放在一个HashMap对象的插座和自己的IP的一个新的连接时,像这样的:
sockets.put(newSocket.getInetAddress().getHostAddress(), newSocket);
然后我就可以拿到插座(这样我就可以得到的OutputStream和答案)调用这样一个静态方法:
public static Socket getSocket(String IP) {
Socket RequestedSocket;
RequestedSocket = sockets.get(IP);
return RequestedSocket;
}
但我想,如果你告诉我有是一个更好的方式,比将所有这些套接字存储在列表/散列表中更好。我怎样才能得到这些没有引用变量的对象?或者也许这是一个很好的做法,我只是想超越极限。
P.S .:我尝试将客户端对象存储在数据库中,将它们序列化,但套接字无法序列化。
谢谢。
是什么使人从'Client'类保持一个参考? – A4L 2013-05-02 18:51:19
客户端类(新客户端())中有一个引用,但我没有为客户端类提供所有引用。感谢您回复 – user2245180 2013-05-02 19:00:33
我建议您以某种方式跟踪客户,而不是套接字,然后向Client类中添加一个方法来通知客户端,例如Client#notify(“data is available”)。 ' – A4L 2013-05-02 19:08:35