【问题标题】:java socket sending and receivingjava socket发送和接收
【发布时间】:2013-05-18 10:53:45
【问题描述】:

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

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

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

这很好,但是在客户端进行身份验证后,服务器会等待即将到来的内容并阻塞。

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

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

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

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

我希望我向您提供了有关我正在尝试的内容的足够信息。你会建议我如何实现这种沟通?

谢谢

【问题讨论】:

标签: java sockets tcp duplex


【解决方案1】:

但是当服务器现在有需要传输的信息时我该怎么办。

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

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

这将为您提供一个简单的同步模式和一个简单的异步模式。唯一的缺点是你有两个套接字连接并且你需要协调它们。

【讨论】:

  • 这对少数客户端来说还可以,但对于多客户端来说,你会浪费套接字
  • @tgkprog 浪费套接字的成本是多少? ;)
  • 操作系统的套接字有硬性限制。如果你有几千个 cient 并没有什么区别,但是当有许多客户端从 Internet 连接时,我已经看到 jboss 节点出现套接字错误,并且我们正在连接到 HSM、dbs 和其他资源——所有这些都在一个点是一个套接字。
  • 我只是觉得只要有一个好的协议(握手、元数据、数据)就足够了
  • @tgkprog 我大体上同意。正确的技巧是让同步调用等待响应,而异步事件可以在它们之前或之后发送。即客户端阅读器变得更加复杂。