2013-05-18 223 views
0

自从我开始思考如何使用Java套接字发送和接收数据。我希望你能帮助我找到一个好办法。java套接字发送和接收

我已经构建了一个服务器/客户机结构,客户机连接到服务器并获取自己的线程来处理请求 - 响应方法。这些信息以XML格式包装。

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

这很好,但是在客户端验证服务器之后等待将会出现并阻止的事情。

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

因此,也许我可以使用某种缓冲区,但我有这种感觉,这不是我应该去的方式。

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

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

我希望我给你足够的关于我所尝试的信息。你会推荐我如何实施这种沟通?

感谢

+0

看看http://code.google。com/p/quickserver /(下载压缩包含所有代码和许多抽样以便开始使用) – tgkprog

回答

0

但服务器现在需要被发送的信息时,我应该做的。

我会使服务器写入同步。这将允许您在一个线程中响应请求,但也可以根据另一个线程的要求发送其他消息。对于客户端,您可以有一个单独的线程进行接收。

一个简单的模型可能会有两个套接字。一个套接字就像现在这样工作,当你“登录”一个唯一的ID时就会发送给客户端。在这一点上,客户端用专用线程打开第二个连接,以侦听异步事件。它传递唯一的ID,以便服务器知道异步消息是用于哪个客户端。

这会给你一个简单的同步模式,就像你现在有一个简单的异步模式。唯一的缺点是你有两个套接字连接,你有协调它们。

+0

这对于少数客户端来说可以,但对于多客户端而言,您将会浪费套接字 – tgkprog

+0

@tgkprog什么是浪费套接字? ;) –

+0

对于OS的套接字存在硬限制。如果你有几千个客户,没有什么区别,但是当有很多客户端从互联网连接时,我已经看到了与jboss节点有关的套接字错误,并且我们连接到HSM,dbs和其他资源 - 所有这些都在一点是套接字。 – tgkprog