如何在没有引用变量的情况下获取套接字对象?

时间:2013-05-02 18:44:02

标签: java sockets serversocket

我一直在考虑这一天,我真的不认为如果标题是正确的,但在这里它,让我解释一下我的情况:我正在研究一个项目,一个用Java制作的服务器,用于客户端德尔福。连接很好,多个客户端有自己的线程,i / o工作正常。客户端将字符串发送到我使用BufferedReader读取的服务器。根据服务器接收的保留字,它会执行操作。在客户端发送字符串之前,它会将信息插入到SQL Server数据库中,以便服务器可以在通过套接字获取订单/命令后检查它。服务器获取数据库中的信息,处理它,并将其发送给...让我们称之为“黑暗面”。

在交易完成并且信息被发送到黑暗面的那一刻,服务器将信息...咳嗽咳嗽,黑暗信息插入到数据库表中,以便客户端可以去接受它所请求的内容。但是,我需要向客户报告! (“哟,再次检查数据库兄弟,你想要的是:3”)。

连接,插座是在其他类中制作的。不是我想用来回答客户端的那个,所以如果我没有套接字,我就没有OutputStream,我需要回过头来讨论。那个类,处理和发送信息到黑暗的一方,将在群组中处理数百个交易。

我的问题在这里:我无法向客户端报告已完成,因为我没有该类中的套接字引用。我实例化客户端线程如:

new Client(socket).start(); 

没有引用变量的对象,但是,我有一个可以选择的选项:在建立新连接的时刻将套接字及其ip存储在HashMap对象中,如下所示:

sockets.put(newSocket.getInetAddress().getHostAddress(), newSocket);

然后我可以得到套接字(所以我可以得到OutputStream并回答)调用这样的静态方法:

 public static Socket getSocket(String IP) {

        Socket RequestedSocket;
        RequestedSocket = sockets.get(IP);

        return RequestedSocket;
    }

但我希望你告诉我是否有更好的方法,比将所有这些套接字存储在list / hashmap中更好。如何在没有参考变量的情况下获取这些对象?或者也许这是一个很好的方法,我只是试图超越极限。

P.S。:我试图将Client对象存储在数据库中,对它们进行序列化,但是套接字无法序列化。

感谢。

3 个答案:

答案 0 :(得分:0)

这是一个设计问题。您需要在某处跟踪它们,一个解决方案可能是简单地创建一个包含哈希映射的单例类[SocketMapManager],以便您可以从其他类静态访问它。 http://www.javaworld.com/javaworld/jw-04-2003/jw-0425-designpatterns.html

答案 1 :(得分:0)

任何告诉您保留对套接字/连接/流的引用的解决方案都是错误的 - >因为这意味着你的连接将在服务器运行时被阻止。

你有两个选择 1.让客户也充当服务器。当他们连接时,他们给服务器他们的IP,端口和一些秘密字符串作为握手的一部分。这意味着您可以控制客户端代码以实现此目的。

  1. 服务器具有协议,可以接受新作业或检查旧作业的状态。客户端定期汇集服务器。

  2. 客户端连接到数据库或其他应用程序(Web服务或普通套接字,如原始应用程序),连接到数据库以获取作业的状态。含义服务器为客户提供工作ID。

  3. 套接字打开然后一个OS资源打开。可以阅读Network Programming: to maintain sockets or not?

    一切都取决于 1.一次/ 5分钟内连接多少客户端。 2.一个客户的请求需要多少秒/分钟来处理

    如果5分钟内的客户端数量最多(在接下来的3年内)每次300个,持续时间为5分钟,并且每个请求最多需要50秒才能处理,那么具有最多50,000个套接字的专用服务器就足够了。否则,您需要异步或更多服务器(以及DNS / Web服务器/端口转发或其他负载平衡方法)

答案 2 :(得分:0)

我在尝试理解操作的流程时遇到了一些问题,以及你在处置方面究竟有什么。这个序列是否正确?
1.客户端写入数据库(delphi)
2.客户端写入服务器(delphi)
3.服务器写入数据库(java)
4.服务器写入客户端(java)
5.客户端读取数据库(delphi)
问题是通过4?

更重要的是:你是说Client课程中没有套接字,而且你也没有Client的列表?
您是否可以使用反射从Client搜索/获取套接字引用? 如果你说你没有套接字,你怎么可以在HashMap中添加该套接字呢?
最后但同样重要的是:为什么需要存储套接字?也许每个客户打开一个用于多个请求的连接?

如果所有答案都可以传达给一个ip:port ...

,那就太美了