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

java - SocketChannel.read() 无限期阻塞

我很难弄清楚这一点。我有以下代码:

使用以下处理程序代码进行读取:

这是唯一调用处理函数的地方。因此,如果我进入该becomeReadable()函数,则通道处于可读状态,但对read()块的调用却没有返回。有什么我错过的吗?

0 投票
2 回答
5341 浏览

java - 写入通道后,Java Selector 在无限循环中返回带有 OP_READ 且没有数据的 SelectionKey

我的代码有问题:我用 Selector 编写了简单的 SocketChannel 客户端,在成功启动它之后从服务器读取消息(服务器发送事件)。但是在写入套接字(参见 main 方法)后,选择器开始在无限循环中返回可读套接字,handleKey 返回已读取的 -1 字节,因此选择器始终返回 OP_READ SelectionKey 而没有读取数据。对不起我的英语不好。

谢谢。

0 投票
2 回答
4105 浏览

java - 当消息很大时,socketchannel.write() 变得非常慢

在我使用 java nio 的程序中,socketchannel.write() 在尝试连续写入 10 KB 消息时变得非常慢。写一个完整的 10 KB 消息的测量时间在 160 毫秒到 200 毫秒之间。但是写一个完整的 5 KB 消息的时间只需要 0.8 毫秒。

在选择器中,我只有Selection.OP_READ,不处理Selection.OP_WRITE。当接收到一个大的完整消息时,它会被写入另一个接收器 4 次。

有没有会计同样的问题?有一篇关于 socketchannel.write() 慢的帖子。我的问题是如何在 OP_READ 和 OP_WRITE 之间交替更改?

如果我添加一个 inerval,例如 150 毫秒,则响应时间会减少。有什么方法可以找到缓冲区何时已满,这样我就可以让程序等待。我的操作系统是windows xp。

谢谢。

我通过检查写入字节数来遵循 EPJ 的建议。但是响应时间仍然很长。我在这里发布了我的部分代码,并想检查我的代码是否有问题。

// 这是使用 nio 的 writeData() 部分:

0 投票
2 回答
673 浏览

java - SocketChannel.write() 单线程处理多个客户端

我的应用程序有一个队列,其中包含“传出网络数据包”(带有 aByteBuffer和 a的 POJO SocketChannel),由将数据写入SocketChannel.

我这样做是为了保证每个应该接收数据包的客户端都能轮到它。这意味着SocketChannel.write()顺序写入多个客户端(一次= 1)。

谁能告诉我这样工作会出什么问题?SocketChannels是从 a 创建的,ServerSocketChannel所以它们是阻塞的。

我担心该write()操作可能会阻止 1 个客户端,使其他客户端等待...

0 投票
1 回答
1092 浏览

java - 将阻塞的 Socket 对象转换为 SocketChannel 的套接字?

这听起来可能很奇怪。我创建了一个基于每个套接字结构线程的游戏服务器(是的,每个用户只有一个线程;响应由工作线程发送给客户端)。我生成的线程首先对用户进行身份验证并处理登录,之后它只接收数据并将其排队等待处理。认证部分很关键,实现时间很长,再次实现也需要这么长时间,所以我在想,认证完成后,我是否可以将我拥有的阻塞套接字转换为 SocketChannel 的套接字,以便选择器可以以非阻塞方式处理其消息?

0 投票
2 回答
1569 浏览

java - java nio socketChannel 读取总是返回相同的数据

在客户端,阅读代码:

问题是socketChannel.read()总是返回正数,我检查了返回缓冲区,数据重复了N次,它喜欢低级套接字缓冲区的位置没有向前移动。任何想法?

0 投票
3 回答
17357 浏览

java - Java.nio 通道和 TLS

如何使用 TLS保护 JavaSocketChannelServerSocketChannel什至是 a ?DatagramChannel

我知道有一些框架(#1 #2)宣传能够,但我想知道是否有可能单独使用纯 Java 标准库来实现这一点。

0 投票
2 回答
505 浏览

java - 从非阻塞 SocketChanel 读取信息

我正在尝试读取一个非阻塞套接字,以避免在我的程序中的某个时刻卡住。有谁知道为什么当我尝试阅读时总是返回零?ByteBuffer会有问题吗?此问题发生在长度始终为零的读取方法中。

0 投票
1 回答
346 浏览

java - 对于大型 ByteBuffers,单独的 SocketChannel 的并发读取()速度很慢

我编写了一个用于远程存储的 Java 服务器(一个 iSCSI 目标)。客户端可以通过发送携带数据有效负载的数据包序列来写入数据。这些数据包由一个固定长度的报头(48 个字节)和一个可变长度的数据段组成。数据段的长度在标头中指定,可以认为是固定的(8KiB)。

接收数据包是一个两部分的过程。首先将标头读取到大小为 48 字节的 ByteBuffer 中。之后立即通过 ByteBuffer.allocate(...) 创建第二个 ByteBuffer。第二个缓冲区的大小与标头中指定的数据段长度相匹配。然后使用 SocketChannel.read(ByteBuffer) 方法将数据段读入第二个 ByteBuffer。在简单的情况下,此过程按预期工作 - 更大的数据段和更长的序列会提高 IO 速度。“简单情况”是指有一个线程使用阻塞的 SocketChannel 来接收(和处理)数据包。但是,如果添加第二个具有自己的 TCP 连接和关联的 SocketChannel 的线程,则 SockerChannel.read(ByteBuffer) 执行时间会上升到 2.5 毫秒以上,而客户端服务器在两个连接上都发送 32KiB 写命令(即 4 个连续的数据包)。这增加了 8 到 10 倍。

我想强调的是,在这个阶段,除了同一个网络接口卡之外,两个线程不共享任何资源。每个 SocketChannel 的读取缓冲区大小为 43690 字节(较大的大小对这种现象没有任何影响)。

任何想法可能导致此问题或如何解决此问题?

0 投票
1 回答
580 浏览

java - Android中的Java SocketChannel write(ByteBuffer source)在windows中是否不同?

当我在Android中调试包含SocketChannel write的代码时,我得到了IllegalArgumentException,但是在windows中相同的代码没有这个异常,在SocketChannel write中Android和windows之间有区别吗?

更新:(代码是开源项目frostwire-android的一部分(这个文件在github),这部分和vuze 4.5一样,我只是添加一个try{})