问题标签 [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 - 无法从通过 SocketChannel 接收的消息中提取正确的信息
我正在发送一个已使用 DataOutput 流转换为字节的字符串
然后通过 SocketChannel 接收它们:
收到的消息始终采用“XXXX XXX”格式,其中 X 是 0-9 之间的任何数字。
然后我尝试将这些消息分成两部分:
问题是,有时当我打印出从字节缓冲区转换的字符串时,它的值会发生变化......通常它是正确的,如“1234 210”,但在其他情况下它可能会删除一个数字并显示“1234 21”。但是,即使它是正确的,我也没有得到匹配?我还发现正在读取的字节数总是在变化......
有谁知道这里的问题是什么?
谢谢你的帮助。
java - java.nio.channels.Selector.select() 返回零
我试图找出为什么选择器不起作用。这是代码:
打印的值为零。这是程序中 SocketChannel.register 的唯一调用,因此,据我了解:
a)应在注册期间创建一个新的 SelectionKey;
b)因此,一个键的“准备操作集”应该在选择期间更新,即这个方法应该返回1。
为什么它不能像我预期的那样工作?究竟是什么意思“谁的就绪操作集被更新”?
java - SelectionKey iterator.remove() 抛出 UnsupportedOperationException 和无限循环
我有一个方法可以打开一个连接,查询一个站点,获取页面数,然后使用 NIO 来同时检索所有页面。第一个查询是使用完成的,URLConnection
并且工作得很好。当我尝试使用 NIO 选择器和通道时,我遇到了 2 个问题:
1)如果我不从迭代器中删除键,则在无限循环中运行打印size()
并发送查询。如果我尝试删除密钥,我会收到 UnsupportedOperationsException。呸!
2) 写入套接字后是否需要从 OP_WRITE 注销通道?如果是这样,我可以打电话channel.register(selector, SelectionKey.OP_READ)
来消除对写作的兴趣吗?
java - SocketChannel.close() 是否也关闭套接字?
我有一个服务器程序需要关闭服务器关闭时剩余的任何连接。我知道我需要打电话SocketChannel.close()
。我的问题是我是否还需要关闭与关联的 SocketSocketChannel
或者是否SocketChannel.close()
自动关闭。
java - Android 在 connect() 中阻塞
我正在编写一个连接到身份验证服务器的 Android 应用程序,以检索另一个运行单独服务器程序的 Android 设备的 IP 地址和端口。发送请求时,认证服务器发送正确的连接信息。问题在于客户端设备尝试连接到 Android 服务器时。客户端获得正确的信息并成功关闭以前的连接,但在尝试创建新连接时挂起。不会引发异常,但 UI 没有响应,并且设备最终会说应用程序没有响应。我有一个充当客户端设备的模拟器和一个充当服务器的实际电话。
这是它卡住的客户端代码部分:
ip 是一个String
包含服务器的 IP 地址。port 是服务器的端口号。我有两个电话来Log.i()
查找程序挂起的位置。第一个调用执行,但第二个没有。此代码段是否有任何原因会导致应用程序冻结?
如果需要,我可以发布更多代码,但我很确定问题出在上面提供的部分。
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
直到连接终止。
我希望过去可能有人遇到过类似的问题,或者可以就我可能忽略的事情提供一些指导。
这是读取数据并引发错误的示例代码。
非常感谢。
java - 使用 ServerSocketChannel 设置阻塞 I/O 操作的超时不能按预期工作
我正在使用 Java 开发一个小组对话服务器,我目前正在破解网络代码,但似乎我无法在阻止 I/O 操作时设置正确的超时:我可能已经被一些 Java 怪异(或,简单地说,我误解了 javadoc)。
因此,这是ConversationServer
类中的相关代码(为简单起见,删除了所有安全检查和日志记录):
预期的行为是最多允许连接客户端,或者在毫秒Settings.MAX_NUMBER_OF_PLAYERS
后终止设置(当前, )。Settings.AWAIT_PLAYER_MS
30000L
会发生什么,如果我连接Settings.MAX_NUMBER_OF_PLAYERS
客户端,一切都很好(因为for
条件退出),但如果我不这样做,SocketTimeoutException
我期望的永远不会被抛出并且服务器永远挂起。
如果我理解正确,server.socket().setSoTimeout((int) Settings.AWAIT_PLAYERS_MS);
应该就足够了,但它并没有给出预期的行为。
那么,任何人都可以在这里发现错误吗?
java - SocketChannel 的 write() 方法不应该抛出异常
我正在编写一个服务器来在客户端之间交换消息。一个有待解决的问题是如何在客户端关闭时释放通道。我所做的是启动一个监控线程,在该线程中监控所有客户端映射,如果在尝试对其进行 write() 时检测到异常,我会尝试 remove() 一个通道。但是,在关闭客户端后,监控线程中的 write() 方法不会抛出异常,因此永远不会释放无用的通道。有人知道为什么吗?
}
java - NIO SocketChannel 的读取超时?
如果在建立连接后的一段时间内没有收到数据,那么设置超时关闭 NIO SocketChannel 的最佳方法是什么?
java - Netty 4 ReadTimeoutHandler 没有抛出 OioEventLoopGroup
我是网络新手。这是预期的行为吗?
更详细一点:
这只是测试用例,所以它可能有点不正确,但管道与我的实际管道足够接近。
基本上,如果我将EventLoopGroup
初始化从更改NioEventLoopGroup
为OioEventLoopGroup
并将引导通道设置从bootstrap.channel(NioSocketChannel.class)
更改为bootstrap.channel(OioSocketChannel.class)
而不触及其他任何东西,则ReadTimeoutHandler
停止抛出ReadTimeoutExceptions
.