0

几个小时以来,我一直在思考应该如何使用 Java Sockets 来发送和接收数据。我希望你能帮助我找到一个好的方法来做到这一点。

我已经构建了一个服务器/客户端结构,客户端连接到服务器并让他自己的线程处理请求-响应方法。信息被封装在 XML 中。

一开始,服务器开始阻塞套接字读取。首先,我使用 writeInt() 来传输 XML 消息的长度。之后,服务器读取长度字节的数量并解析消息。传输完成后,客户端进入接收状态并等待响应。

这很好,但是在客户端进行身份验证后,服务器会等待将要发生的事情并阻塞。

但是当服务器没有需要传输的信息时该怎么办。我可以尝试破坏读取阻塞并将消息发送给客户端。但是如果客户想到他也有一条消息并且也开始发送会发生什么。在那一刻,没有人会听。

为此,也许我可以使用某种缓冲区,但我觉得这不是我应该走的路。

我已经搜索了一段时间,发现了一些有趣的信息,但我没有很好地理解它们。可悲的是,我的书只是关于这个简单的套接字模型。

也许我应该使用两个线程。一发一收。服务器有一个数据库,其中存储了消息并等待传输。因此,当服务器收到一条消息时,他将该消息存储在数据库中,并且“收到消息”之类的答案也将存储在数据库中。发送者线程会查看是否有新消息并将“收到的消息”发送给客户端。这种方法不会以毫秒为单位发送答案,但我可以想象它会运作良好。

我希望我给了你足够的信息来说明我正在尝试什么。你会建议我如何实施这种沟通?

谢谢

4

1 回答 1

1

But what should I do when the server has now information which needs to be transmitted.

I would make writes from the server synchronized. This will allow you to respond to requests in one thread, but also send other messages as required by another thread. For the client you can have a separate thread doing the receiving.

A simpler model may be to have two sockets. One socket works as you do now and when you "login" a unique id is sent to the client. At this point the client opens a second connection with a dedicated thread for listening to asynchronous events. It passes the unique id so the server know which client the asynchronous messages are for.

This will give a you a simple synchronous pattern as you have now and a simple asynchronous pattern. The only downside is you have two socket connections and you have co-ordinate them.

于 2013-05-18T11:01:21.253 回答