java - 聊天客户端 - 同时使用套接字和服务器套接字

标签 java multithreading sockets serversocket

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

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

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

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

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

有没有办法可以在单线程中实现此目的? (我还没有真正深入研究线程)

如果这有点宽泛,我很抱歉。

非常感谢!!

最佳答案

ServerSocket 阻塞,仅此而已。

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

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

此外,您似乎对网络和套接字不太熟悉,因此使用某些层而不是原始套接字可能会更有好处。

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

关于java - 聊天客户端 - 同时使用套接字和服务器套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17162110/

相关文章:

C++ 线程没有像我预期的那样工作?

c - 合并 2 个快速排序的数组结果全为 0

Java:如何从套接字 readline() 生成事件?

java - 屏幕解锁后相机卡住

java - 将库添加到 java.library.path

java - 本地线程变量或新线程 - Java

c - 如何获取 select() 监视的文件描述符准备就绪的时间戳?

java - 使用 Java 将文本从一个文件复制到另一个文件

java - AsynchronousByteChannel 的线程含义

sockets - TCP 套接字和已连接的 UDP 套接字之间的区别