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

java - 如何使用 Socketchannel 将参数值发送到服务器?

我正在使用SocketChannel将文件从客户端发送到我的 android 应用程序中的服务器。

它的工作没有任何问题。但我还需要向服务器发送一个文件名。是否可以像 HttpPost 一样为 Socketchannel 设置请求参数?

我尝试搜索许多论坛,但没有运气。如果有人对 SocketChannel 有深入的了解,请与我分享答案。

提前致谢。

0 投票
1 回答
576 浏览

java - Java:如何重用 SocketChannel

我需要通过一个与服务器的连接发出 2 个请求。我使用“SocketChannel”来完成这项任务,但我无法做我需要的事情。

在输出中,我只看到第一个请求的结果。任何异常都不会抛出。

如果我使用Socket,我会看到相同的结果。

如何重用 SocketChannel 连接?

0 投票
2 回答
1345 浏览

java - Java SocketChannel:为什么 wrap-flip-write 不起作用但 wrap-write 起作用?

假设我们有一个 JavaSocketChannel连接到正在等待传入数据的服务器:

我们发送我们的请求如下:

上面的代码返回0,这意味着它不会向通道写入任何字节!

但是,如果我删除该buffer.flip()行,它将正常工作并发送数据:

为什么是这样 ?!

0 投票
1 回答
369 浏览

java - 如果流名足够大,red5 RTMPClient 不会发布流

我有一个 Red5 客户端实现,它发布流,从视频文件加载到我们的 wowza 媒体服务器。问题是,如果流名称很大——大约超过 90 个符号——客户端不会发布它并且会静默失败。客户端预期的所有其他操作都已完成:它连接到服务器并创建一个流。但从不发布流。我没有看到相应的 RTMP 消息,也没有在 wowza 的日志中看到相应的反应。

我尝试调试客户端并跟踪执行,直到它开始写入 SocketChannel。对于执行较短的命名流(可以发布)和具有长名称的流的情况,一切都是相同的,永远不会发送“发布”的 RTMP 命令。

一个问题是:

  1. 这是怎么回事?

  2. 如果我已经向 SocketChannel 写入了一些字节而没有抛出任何异常 - 它是否保证发送了相应的消息?

  3. 如果我已经向 SocketChannel 写入了一些字节而没有抛出任何异常 - 我可以通过我的操作系统(在我的情况下为 MACOS)检查这些字节是否真的写在某个地方?虽然我知道,通过 WireShark,这条数据从未发送过。

更新......这更奇怪 - 在发送“大”数据包之后发送一个较小的数据包并没有帮助。将更大长度的数据包提交到套接字后,将无法发送数据包。

0 投票
2 回答
1372 浏览

java - 如何查找和取消选择器的空闲通道?

假设我们有一个 Java NIO Selector,它在多个SocketChannels读取操作上选择超时:

如果通道空闲了特定时间,我们需要取消并关闭它,这就是我们使用该selector.select(TIMEOUT)方法的原因。

但是,如果我们有一些非常活跃的频道,这将不起作用。那些活动通道永远不会让selectto 超时,而所有其他通道可能是空闲的......

一个天真的解决方案如下(也提到here):

SelectionKey使用该key.attach(object)方法将活动的最后时间附加到每个通道。每次选择成功后,更新所有就绪键的活动时间。然后遍历所有键,找到空闲超过特定阈值的键。

这可能非常低效,因为活动通道会导致select非常频繁地触发并且每次都在整个键集上迭代。

那么有没有更好(更有效)的方法来解决这个问题?

0 投票
2 回答
675 浏览

java - 用 SocketChannel.open().socket() 替换 new Socket() 有什么问题吗?

如果我只是更换会出现什么问题

背景:我有一些使用的遗留代码new Socket(),我希望能够中断socket.connect()呼叫。我不想重写代码来使用 NIO。我了解到这Thread.interrupt()不会中断socket.connect(),但是应该socket.close()在另一个线程上中断连接。奇怪的是,这适用于 Java 7,但不适用于 Java 6。

我不知何故想到 usingsocket = SocketChannel().open().socket()会神奇地让我使用Thread.interrupt()to 打断socket.connect()。它没有,但奇怪的是,它确实在 Java 6 中也产生了socket.close()中断!socket.connect()

请注意,我没有SocketChannel以任何方式直接使用附件——它在我创建时出现,Socket并且再也不会出现。

这有什么问题?

0 投票
1 回答
330 浏览

java - 阻塞 SocketChannel 连接可以返回 false 吗?

当我阅读 SocketChannel 的文档时,似乎很清楚阻塞 SocketChannel connect() 调用只会返回 true 或抛出异常。换句话说,它只能在非阻塞模式下返回 false。这是正确的,还是我错过/误读了什么?

channel.configureBlocking(true) 是否有可能返回并且通道不处于阻塞模式?我希望如果 configureBlocking(true) 无法成功地将通道置于阻塞模式(在方法调用返回之前),则会引发异常。那是对的吗?

最后,有没有什么方法可以让下面的代码连接失败却返回 TRUE?(代码只测试连接是否成功,它不对通道做任何事情,因此立即关闭):

谢谢!

0 投票
0 回答
205 浏览

java - msgpack-java & java.nio.SocketChannel

我很难弄清楚如何使用 msgpack 设置非阻塞 IO(网络套接字)。写入部分是微不足道的,因为 msgpack 可以ByteBuffer相当容易地生成一个,但我不知道如何对 MessagePack 对象进行非阻塞读取。看看MessagePack.read()有三个主要选项...... read(InputStream in)read(byte[] b)read(ByteBuffer b)。所有这些都是阻塞操作。

我尝试使用非阻塞传输的原因是我的服务器可能需要数百个同时的长期连接。

有什么建议么?在我的谷歌搜索中,似乎大多数人只是使用带有阻塞 IO 的 msgpack。我能想到的唯一选择是

0 投票
1 回答
2184 浏览

java - 当 socketChannel.read(BUFFER) 将返回 0

我有一个从下面读取的服务器SocketChannel

下面是客户端写入的客户端SocketChannel

所以我的问题:

  • 当恰好在服务器代码中,该count值将是 0 ( while ((count = socketChannel.read(BUFFER)) > 0))?
  • count如果服务器已经读取了客户端发送的消息的一半,即假设客户端写道: stack overflow,服务器中是否有可能在count读取stack客户端发送的消息的一半后为0(认为消息可以是 1MB 大小)?
0 投票
1 回答
2439 浏览

java - 使用 SocketChannel Android 连接到 websocket

我编写了连接到 websocket 服务器、服务器应用程序和使用Autobahn websocket 库实现的 android 应用程序的 android 应用程序。

我可以成功连接并与服务器交换消息。但一段时间后(20-30 分钟后)android 应用程序停止与服务器通信(它无法向服务器发送消息)。在 logcat 上显示应用程序仍然连接到 websocket,即使它无法向服务器发送消息。

我浏览了 Autobahn 库的源代码,发现它使用java.nio.channels.SocketChannel连接到 websocket。使用 SocketChannels 有什么问题吗?(我在这里发现了类似的问题Android - How to keep connection with server for a long time