问题标签 [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 投票
3 回答
186 浏览

java - 无法从通过 SocketChannel 接收的消息中提取正确的信息

我正在发送一个已使用 DataOutput 流转换为字节的字符串

然后通过 SocketChannel 接收它们:

收到的消息始终采用“XXXX XXX”格式,其中 X 是 0-9 之间的任何数字。

然后我尝试将这些消息分成两部分:

问题是,有时当我打印出从字节缓冲区转换的字符串时,它的值会发生变化......通常它是正确的,如“1234 210”,但在其他情况下它可能会删除一个数字并显示“1234 21”。但是,即使它是正确的,我也没有得到匹配?我还发现正在读取的字节数总是在变化......

有谁知道这里的问题是什么?

谢谢你的帮助。

0 投票
1 回答
606 浏览

java - java.nio.channels.Selector.select() 返回零

我试图找出为什么选择器不起作用。这是代码:

打印的值为零。这是程序中 SocketChannel.register 的唯一调用,因此,据我了解:
a)应在注册期间创建一个新的 SelectionKey;
b)因此,一个键的“准备操作集”应该在选择期间更新,即这个方法应该返回1。

为什么它不能像我预期的那样工作?究竟是什么意思“谁的就绪操作集被更新”?

0 投票
2 回答
848 浏览

java - SelectionKey iterator.remove() 抛出 UnsupportedOperationException 和无限循环

我有一个方法可以打开一个连接,查询一个站点,获取页面数,然后使用 NIO 来同时检索所有页面。第一个查询是使用完成的,URLConnection并且工作得很好。当我尝试使用 NIO 选择器和通道时,我遇到了 2 个问题:

1)如果我不从迭代器中删除键,则在无限循环中运行打印size()并发送查询。如果我尝试删除密钥,我会收到 UnsupportedOperationsException。呸!

2) 写入套接字后是否需要从 OP_WRITE 注销通道?如果是这样,我可以打电话channel.register(selector, SelectionKey.OP_READ)来消除对写作的兴趣吗?

0 投票
2 回答
2062 浏览

java - SocketChannel.close() 是否也关闭套接字?

我有一个服务器程序需要关闭服务器关闭时剩余的任何连接。我知道我需要打电话SocketChannel.close()。我的问题是我是否还需要关闭与关联的 SocketSocketChannel或者是否SocketChannel.close()自动关闭。

0 投票
1 回答
288 浏览

java - Android 在 connect() 中阻塞

我正在编写一个连接到身份验证服务器的 Android 应用程序,以检索另一个运行单独服务器程序的 Android 设备的 IP 地址和端口。发送请求时,认证服务器发送正确的连接信息。问题在于客户端设备尝试连接到 Android 服务器时。客户端获得正确的信息并成功关闭以前的连接,但在尝试创建新连接时挂起。不会引发异常,但 UI 没有响应,并且设备最终会说应用程序没有响应。我有一个充当客户端设备的模拟器和一个充当服务器的实际电话。

这是它卡住的客户端代码部分:

ip 是一个String包含服务器的 IP 地址。port 是服务器的端口号。我有两个电话来Log.i()查找程序挂起的位置。第一个调用执行,但第二个没有。此代码段是否有任何原因会导致应用程序冻结?

如果需要,我可以发布更多代码,但我很确定问题出在上面提供的部分。

0 投票
1 回答
268 浏览

java - 套接字通道 - readIntoNativeBuffer() 错误

我已经有一段时间遇到这个问题了。系统的快速解释:

一个简单的应用程序将通过 tcp 连接读取数据。应用程序使用 Socketchannel 对象建立数据通信线路。与硬件的连接已建立,应用程序在抛出错误之前处理了大约 400 - 700 个数据包:

在 sun.nio.ch.SocketDispatcher.read0(Native Method) 在 sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:43) 在 sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:218) 在 sun .nio.ch.IOUtil.read(IOUtil.java:186) 在 sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:359)

我怀疑它与操作系统(Windows 7)缓冲区有关,尽管我尝试了一些解决方法(增加 JVM 堆大小,并为 TCP 设置创建额外的注册表变量),但没有运气。

使用wireshark检查包数据,出现错误时可以看到如下信息

然后是一系列

[TCP 重复 ACK 144#1] 5001 > 49995 [ACK] Seq=123353 Ack=1 Win=200 Len=0

直到连接终止。

我希望过去可能有人遇到过类似的问题,或者可以就我可能忽略的事情提供一些指导。

这是读取数据并引发错误的示例代码。

非常感谢。

0 投票
1 回答
1348 浏览

java - 使用 ServerSocketChannel 设置阻塞 I/O 操作的超时不能按预期工作

我正在使用 Java 开发一个小组对话服务器,我目前正在破解网络代码,但似乎我无法在阻止 I/O 操作时设置正确的超时:我可能已经被一些 Java 怪异(或,简单地说,我误解了 javadoc)。

因此,这是ConversationServer类中的相关代码(为简单起见,删除了所有安全检查和日志记录):

预期的行为是最多允许连接客户端,或者在毫秒Settings.MAX_NUMBER_OF_PLAYERS后终止设置(当前, )。Settings.AWAIT_PLAYER_MS30000L

会发生什么,如果我连接Settings.MAX_NUMBER_OF_PLAYERS客户端,一切都很好(因为for条件退出),但如果我不这样做,SocketTimeoutException我期望的永远不会被抛出并且服务器永远挂起。

如果我理解正确,server.socket().setSoTimeout((int) Settings.AWAIT_PLAYERS_MS);应该就足够了,但它并没有给出预期的行为。

那么,任何人都可以在这里发现错误吗?

0 投票
2 回答
502 浏览

java - SocketChannel 的 write() 方法不应该抛出异常

我正在编写一个服务器来在客户端之间交换消息。一个有待解决的问题是如何在客户端关闭时释放通道。我所做的是启动一个监控线程,在该线程中监控所有客户端映射,如果在尝试对其进行 write() 时检测到异常,我会尝试 remove() 一个通道。但是,在关闭客户端后,监控线程中的 write() 方法不会抛出异常,因此永远不会释放无用的通道。有人知道为什么吗?

}

0 投票
2 回答
13600 浏览

java - NIO SocketChannel 的读取超时?

如果在建立连接后的一段时间内没有收到数据,那么设置超时关闭 NIO SocketChannel 的最佳方法是什么?

0 投票
1 回答
538 浏览

java - Netty 4 ReadTimeoutHandler 没有抛出 OioEventLoopGroup

我是网络新手。这是预期的行为吗?

更详细一点:

这只是测试用例,所以它可能有点不正确,但管道与我的实际管道足够接近。

基本上,如果我将EventLoopGroup初始化从更改NioEventLoopGroupOioEventLoopGroup并将引导通道设置从bootstrap.channel(NioSocketChannel.class)更改为bootstrap.channel(OioSocketChannel.class)而不触及其他任何东西,则ReadTimeoutHandler停止抛出ReadTimeoutExceptions.