3

我整天都在考虑这个问题,我真的不认为标题是否正确,但在这里,让我解释一下我的情况:我正在做一个项目,一个用 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对象存储在数据库中,对其进行序列化,但是套接字无法序列化。

谢谢。

4

3 回答 3

0

我在试图了解操作流程是什么以及您到底有什么处置时遇到了一些问题。这个顺序正确吗?
1. 客户端写入数据库 (delphi)
2. 客户端写入服务器 (delphi)
3. 服务器写入数据库 (java)
4. 服务器写入客户端 (java)
5. 客户端读取数据库 (delphi)
问题是通过 4 ?

更重要的是:您是说Client班级中没有套接字,并且您也没有列表Client
您是否能够使用反射来搜索/获取套接字引用Client
如果你说你没有socket,你怎么能在HashMap中添加那个socket呢?
最后但同样重要的是:为什么需要存储套接字?也许每个客户端都会打开一个用于多个请求的连接?

如果所有答案都可以传送到一个 ip:port 上,那就太好了……

于 2013-05-04T18:01:25.523 回答
0

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

于 2013-05-02T18:48:44.147 回答
0

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

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

  1. 服务器有一个协议来接受新工作或检查旧工作的状态。客户端定期池化服务器。

  2. 客户端连接到连接到数据库的数据库或其他应用程序(Web 服务或普通套接字,如原始应用程序)以获取作业状态。意思是服务器给客户端一个工作ID。

打开一个套接字,然后打开一个操作系统资源。可以阅读网络编程:维护套接字吗?

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

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

于 2013-05-02T20:26:27.987 回答