问题标签 [socketchannel]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Java 蔚来。SocketChannel.read 方法总是返回 0。为什么?
我尝试了解 java NIO 的工作原理。特别是 SocketChannel 的工作原理。
我在下面写了代码:
- 我尝试连接到谷歌服务器。
- 向服务器发送请求;
- 从服务器读取答案。
但是,方法 socketChannel.read(buf) 始终返回 0 并无限执行。
我哪里做错了??
size - Java NIO ByteBuffer:在读取完整消息之前先读取消息大小
我正在制作一个接收消息的java NIO服务器,每条消息在消息的头部都有它的大小,这就是为什么我首先读入一个默认大小(44)的缓冲区,然后从这个缓冲区中获取完整的大小,然后创建一个新缓冲区,该缓冲区应该获取消息(正文)的其余部分,然后使用 System.arrayCopy() 制作包含完整消息的数组。此操作运行良好,问题是第二个缓冲区(消息体)具有大小但不包含正确的数据。如果你有什么问题,请这是我的代码:
我有一个简单的客户端,它发送创建一个字节消息,在头部确定它的大小,然后发送它。
谢谢
java - Java nio 在选择器上读取 SocketChannel
我有一个小型服务器应用程序,它接收来自多个客户端的连接。客户端将连接,发送消息并断开连接,没有返回响应。
我正在使用 ServerSocketChannel 来监听连接。我使用选择器收到新连接的通知,发生这种情况时,我使用选择器注册 SocketChannelSelectionKey.OP_READ
我不确定的部分是我何时收到通知数据可供阅读。我的 SocketChannels 处于非阻塞模式。我调用channel.read(buffer)
SocketChannel 以从 javadoc 读取字节缓冲区,我应该重复调用它,直到我得到一个表示流结束的 -1。但是,我不确定在再次调用 read 之前是否应该等待选择器再次通知我。那是:
- 选择器通知我数据可用。
- 我叫读
- 然后我应该再次调用 read 直到返回 -1 还是让选择器通知我然后再次调用 read
非常感谢
java - Java 蔚来。为什么翻转()方法会破坏我的程序?
Java 代码如下:
实际结果:
写入:1017 读取:0 读取:1024 读取:44
第一次,方法read()
读取 0 个字节。这并不酷。
我修改了我的代码:
实际结果:
写入:1017 读取:1024 读取:44
它已经看起来更好了。谢谢你flip()
!
接下来,我放入缓冲区 String "Request",该 String 的长度为7,但方法write()
返回1017。
什么信息方法写入通道?
我不确定,该方法写了字符串"Request"。
好的,我再次修改了我的代码:
实际结果:
写:7
和代码崩溃了......
凭什么?我的错误在哪里?
谢谢。
java - Java NIO:从不包含任何数据的 Channel 读取数据。我该如何处理这种情况?
Java 代码如下:
这段代码很简单。
但是我没有向 Channel 写入任何数据,因此它不包含任何要读取的数据。
在这种情况下,方法channel.read()
执行时间过长并且不返回任何数据。
我该如何处理这种情况?
谢谢。
java - 如何正确关闭 Java NIO 中的 SocketChannel?
我有一个带有主循环的简单非阻塞服务器:
在读/写部分,我检查是否有要读/写的东西,如果没有 - 然后我尝试关闭频道:
关闭方法:
但是在处理此代码期间,我在主循环中遇到异常(它被捕获但我认为有问题)我得到了这个堆栈跟踪:
因此,当进入写入部分时,它在主循环上失败,关闭通道并在“可写”部分返回主循环,并因此类异常而失败。有什么建议么?
java - Java nio 服务器客户端异步
我使用 java nio 和选择器自己制作了一个服务器。如果需要,我可以直接从客户那里接收数据并回答。
但是现在我想要一个可以处理数据的线程,并且它会随时向每个客户端发送数据。
那么我该怎么做呢?另外如何将所有通道保存在内存中以将数据写入每个客户端?
如果您需要,我可以使用 java nio 发布我的部分代码。
java - 任何使用 SocketChannel 客户端代码的 java 库?
我已经查看了许多开源 java 网络库(jdbc 驱动程序、apache commons net 等),但我还没有找到一个库,它可以将 SocketChannel 用于简单用例(mysql 的 jdbc 连接器的 V3 使用 socketchannel)但较新的版本使用 jn.Socket)。
我只对客户端代码库感兴趣。(连接,而不是听的库)。
仅供参考,我正在为 java 套接字(仅限客户端)实现一个抽象层,我需要一些用例来使 SocketChannel 工作有价值。到目前为止,我所看到的任何(客户端)库似乎都从 SocketChannels 转向基于 Java 1.0 Socket 的实现,可能是因为它们都对使用 SSL 感兴趣(不确定)。
所以,真正的问题是,我应该费心支持 SocketChannel & co 吗?(对于客户端库,因为平台不支持传入连接......但是。)
同样,我也对 DatagramChannel 感兴趣。(同样的问题,我应该费心支持这门课吗?)
有什么想法我应该在哪里寻找吗?
java - 在客户端已经打开时处理给定 ServerSocketChannel 重新启动的连接
当用户单击“连接”按钮时,我的 SwingWorkerdoInBackground()
会创建(并注册OP_ACCEPT
)一个新的。ServerSocketChannel
当一个客户isAcceptable()
时,SwingWorker
注册SocketChannel
与OP_READ
。
当用户单击“断开连接”按钮时,SwingWorker
closes()ServerSocketChannel
和selector()
. 但是,客户端仍然是打开的。
问题:如果用户再次单击“连接”,在我看来,上述过程会重复,只是客户端仍处于OP_READ
模式并且没有被ServerSocketChannel
.
有没有办法克服这个问题?重新启动是否ServerSocketChannel
需要客户端也重新启动?
java - 如何从 TCP 套接字获取数据到 ByteBuffer
我需要将来自套接字的传入数据获取到 ByteBuffer 中,但我不知道该怎么做。我是这个领域的新手,因此不确定最好的开始方式。我发现了以下内容,但这不是我想要的,因为它可以获取数据,但我需要将我的所有数据都放在字节缓冲区中以用于其他目的。