【问题标题】:Chat client - Socket and server socket concurrently聊天客户端 - 同时使用套接字和服务器套接字
【发布时间】:2013-06-18 06:40:43
【问题描述】:

因此,对于一个项目,我正在使用 Netbeans IDE 中的 Java 制作一个点对点的两人聊天客户端。

我的问题不完全是代码,而是更多关于结构和如何实现的问题。

我想要做的是让客户端打开并让ServerSocket 监听任何尝试使用Socket 从另一个客户端建立的连接(这个另一个客户端也应该有一个ServerSocket) 所以这个想法是,一旦客户端打开,两个客户端都有能力接受连接,并有能力尝试建立连接。

无论如何,问题是ServerSocket.Accept(); 阻塞(正确的术语?)程序一旦被调用,直到超时结束。我想要的是ServerSocket 只是在后台侦听任何传入连接并在出现这种情况时连接它们,而不会完全禁用程序的功能(即用户能够自己启动连接)? 为此,我是否需要为ServerSocket 创建一个单独的线程,一旦建立连接就会被终止?

另外,一旦建立连接,我如何让程序定期检查Socket 的输入流以查看是否有来自其他客户端的任何传入消息?

有没有办法在一个线程中实现这一点? (我还没有真正深入研究线程)

对不起,如果这有点宽泛。

非常感谢!!

【问题讨论】:

  • 不要害怕使用多个线程。只要你用 Swing 或 AWT 做某事,你就会有多个线程。所以不要从线程“逃跑” - 尝试“驯服”它们......
  • 你能指出我解释线程的地方吗?我认为这是在这里做我想做的事情的最佳方式。
  • 我1997年用来学习的教程已经不在网上了。我将不得不再次搜索网络。 Angelika Langer 和 Lars Vogel 的页面是搜索 Java 相关信息和教程的良好开端。

标签: java multithreading sockets serversocket


【解决方案1】:

ServerSocket 块就是这样。

但是,如果您只想在两个连接方之间进行点对点通信,仅此而已,那么这种行为不是问题。您只需要两个程序:服务器和客户端。服务器阻塞,直到它从客户端获得连接,客户端阻塞,直到它获得连接。

如果你想在单线程中实现 Java IO,你应该使用 Java Nio。网上有很多这方面的教程。例如http://tutorials.jenkov.com/java-nio/server-socket-channel.html

此外,您似乎对网络和套接字不是很熟悉,因此使用某些层而不是原始套接字可能会有所帮助。

也许您应该考虑使用 JeroMQ (https://github.com/zeromq/jeromq) 来实现程序之间的通信。

【讨论】:

  • 另外,JeroMQ 是什么,我似乎找不到任何解释它的地方。
  • 在编程层中是抽象,它隐藏了低级实现细节并可能提供更多功能。在这种情况下,如果您只想进行点对点聊天,那么使用一些高级库而不是使用原始套接字可能更容易。
  • JeroMQ 是 ZeroMQ (zguide.zeromq.org/page:all) 的纯 java 实现。 ZeroMQ 的目的是提供比原始套接字更高级别的通信抽象。
  • 嗯,好吧,那么来自 NIO 的 SocketChannels?或类似的东西?你指的是那个吗?或者还有其他我可以使用的吗?
  • 是的。如果您想学习使用 Java 进行有效的低级通信,那么 SocketChannels 和 co 是不错的选择。
猜你喜欢
  • 1970-01-01
  • 2020-10-10
  • 1970-01-01
  • 2016-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-10
相关资源
最近更新 更多