问题标签 [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.

0 投票
1 回答
1334 浏览

java - 使用 NIO 时如何确保 SocketChannel 真正连接?

我正在开发Android上的NIO客户端程序,基本上它运行良好,但是当网络不可用(WIFI被禁用等)时,我不知道如何区分套接字“真正”连接,SocketChannel.finishConnect () 即使没有可用的网络也总是返回 true。如果我尝试写入未连接的 SocketChannel,则会发生 Broken pipe 异常。

所以我想知道如何确保 SocketChannel 真的连接了?

0 投票
1 回答
3465 浏览

java - SocketChannel write( ) returns with no error but no data was actually sent

I am using SocketChannel to communicate with remote server. I send data using socketChannel.write() with no errors and exceptions, however, the server log indicates no data was received; client tcp traffic monitor also shows that the string message in the ByteBuffer was not sent.

Could anyone give me a hint why this is the case? Thank you!

0 投票
1 回答
604 浏览

java - Java 的 SocketChannel.read(ByteBuffer)

似乎无法在 java 文档中找到答案:

SocketChannel.read(ByteBuffer) 是否追加或覆盖当前的 ByteBuffer?

0 投票
3 回答
631 浏览

java - 使用未定义的字节数在 SocketChannel 上通过 TCP 读取流

我正在尝试读取 SocketChannel 上的流而不定义字节数。

我想到的替代解决方案是将预定义大小的不同 ByteBuffer 存储到一个列表中,这将允许我之后分配一个接收大小的新 ByteBuffer 并将结果放入其中。

问题是我处于阻塞模式并且找不到有效条件来离开我在读取方法上创建的循环检查代码:

关于如何解决这个问题的任何想法?

0 投票
1 回答
2254 浏览

java - 带有 NIO 通道的简单客户端-服务器程序

已解决如果有人有兴趣,我可以用正确的数据编辑这篇文章。只需发表评论。


作为我的任务,我必须使用非阻塞通道和选择器创建一个简单的服务器和一个客户端。基本上它应该回显客户端编写的消息或添加两个数字(也由客户端提供)。

我的问题是我在消息即将被服务器回显的地方出现错误。我已经检查了 msg 是否进入 writeResponse 方法,并且确实如此。所以这就是问题开始的地方。

谢谢大家 !

我得到的错误:

服务器:

我的客户:

0 投票
0 回答
601 浏览

java - 在 try 之外使用 try-with-resources 的资源

SocketChannel用来在服务器和客户端之间发送消息。一旦客户端连接到服务器,服务器就会在 try-with-resources 尝试中打开InputStreamsandOutputStream来接收来自客户端的消息并将消息发送客户端,如下所示:

我想out在尝试之外访问。try 包含一个 while 循环,该循环重复检查消息是否已到达in,它工作正常。

我尝试global_out通过执行以下操作设置全局变量,例如:

然后我尝试写入这个 OutputStream,如下所示:

我只调用sendMessage(Object)when should_ceckistrue并测试 if global_outis null,它不是。然而,sendMessage(Object)永远不会回来。如果global_out 不是 ,它一定是被设置的,那么为什么在终止null之前不能使用资源呢?try-with-resources

有什么办法可以解决这个问题吗?

0 投票
2 回答
13679 浏览

java - HttpPost:InputDispatcher:“通道已不可恢复地损坏,将被处置!” 在 Nexus 7 上

在 Nexus 7 (4.3) 上,而不是在我的旧设备 LG Optimus 3d (Android 2.2) 上,当我执行 HttpPost 时,我得到了这个

E/InputDispatcher﹕通道'4273f7b0 ... MainActivity (server)' ~ 通道已不可恢复地损坏,将被处理!

人们提到了可能的内存泄漏。看 **。但是,当我尝试 HttpPost 时,这个问题会在启动时立即发生。它仍然可能是内存泄漏吗?

这是我做 HttpPost 的方式:

这是我的 HttpPostAsync 任务:

有任何想法吗?

我阅读了一个 SO answer* 它可能与 ArrayList 初始化有关,所以我也尝试在 ArrayList 中像这样使用 1 进行初始化,但问题仍然存在:

*:不完全相关/帮助的答案: 应用程序已停止运行 Android

** 内存泄漏相关?http://android-developers.blogspot.com/2011/03/memory-analysis-for-android.html

0 投票
1 回答
149 浏览

java - 区分从 CLIENT 和其他发送的消息

我正在使用SocketChannelSelector编写服务器。服务器的工作是允许客户端连接,从客户端读取消息并将消息写入客户端。

我在区分从客户端发送的消息和触发读取指令的其他数据时遇到了一些困难。

前任。当客户端连接时,我注意到执行了读取指令,而客户端没有发送任何数据。这很重要,因为服务器从客户端读取消息后,必须将该消息添加到消息队列中。这些消息将由外部应用程序从队列中删除和处理。问题是,每次读取触发时,这些 UFM(未识别消息)在尝试解码它们时都会破坏外部应用程序。

很抱歉,如果这个问题已经得到解答,我找不到完整的答案。

这是我的接受方法,如果我没记错的话,它会告诉选择器在数据可供读取时通知我们。

这是等待事件的选择器方法。

这是读取函数,调用 ifkey.isReadable()

读取者应该读取消息,并将消息传递给工作线程,在那里消息被解码并发生其他好事。

每次连接新客户端后都会调用 read 方法。计数通常很小,在 4 到 10 之间,当我使用 解码时 new String(data[], "UTF-8"),结果是日语之类的..

count我通过在每次调用 read 时简单地打印来测试这一点。

这个问题可以通过简单地检查每条传入消息的大小并忽略那些很小的消息来解决。但是,如果发生碎片化,这似乎会适得其反。

编辑:客户端示例代码:

注意:我没有对等方的源代码,但是这个非常简单的示例产生了完全相同的结果。在 MessageDialog 甚至提示向服务器发送消息之前,服务器已收到一条消息,该消息要么是日语,要么是一系列问号 (?? ???)。

0 投票
1 回答
200 浏览

java - AsynchronousServerSocketChannel finally 块从未执行

我创建了 AsynchronousServerSocketChannel 并且一切都很好,直到我想要关闭服务器套接字套接字。我使用特殊消息在客户端上创建 AsynchronousSocketChannel ,该消息调用函数来关闭服务器和所有套接字通道,服务器已关闭但最终块永远不会执行,为什么?

校验码:

所以函数 closeServerSocket 被调用,我将 false 设置为变量 isOpen ,它一直在循环,但是当我将 false 设置为 isOpen var 时,while 仍在循环并且最终永远不会执行?

0 投票
0 回答
56 浏览

java - 为什么我不能使用非阻塞 I/O 套接字通道读取完整的传入数据

我正在尝试使用 SocketChannel 来测试 FTP,但这并不是我真正的期望。我知道我需要设置一个选择器算法,选择 OP_CONNECT、OP_READ 键来执行连接和读取功能,一切正常,但为什么没有完全读取传入的数据?另一方面,如果我正在调试程序,它可以被正确读取,因为我做的很慢。我认为这是同步问题,所以我尝试只提交 1 个密钥(甚至尝试逐步对方法进行硬编码,但问题仍然存在。

有没有人遇到过这个问题?如何确保可以读取完整的传入数据而不是仅读取部分数据,有时没有数据(=。=“)