问题标签 [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.read() 无限期阻塞
我很难弄清楚这一点。我有以下代码:
使用以下处理程序代码进行读取:
这是唯一调用处理函数的地方。因此,如果我进入该becomeReadable()
函数,则通道处于可读状态,但对read()
块的调用却没有返回。有什么我错过的吗?
java - 写入通道后,Java Selector 在无限循环中返回带有 OP_READ 且没有数据的 SelectionKey
我的代码有问题:我用 Selector 编写了简单的 SocketChannel 客户端,在成功启动它之后从服务器读取消息(服务器发送事件)。但是在写入套接字(参见 main 方法)后,选择器开始在无限循环中返回可读套接字,handleKey 返回已读取的 -1 字节,因此选择器始终返回 OP_READ SelectionKey 而没有读取数据。对不起我的英语不好。
谢谢。
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() 部分:
java - SocketChannel.write() 单线程处理多个客户端
我的应用程序有一个队列,其中包含“传出网络数据包”(带有 aByteBuffer
和 a的 POJO SocketChannel
),由将数据写入SocketChannel
.
我这样做是为了保证每个应该接收数据包的客户端都能轮到它。这意味着SocketChannel.write()
顺序写入多个客户端(一次= 1)。
谁能告诉我这样工作会出什么问题?SocketChannels
是从 a 创建的,ServerSocketChannel
所以它们是阻塞的。
我担心该write()
操作可能会阻止 1 个客户端,使其他客户端等待...
java - 将阻塞的 Socket 对象转换为 SocketChannel 的套接字?
这听起来可能很奇怪。我创建了一个基于每个套接字结构线程的游戏服务器(是的,每个用户只有一个线程;响应由工作线程发送给客户端)。我生成的线程首先对用户进行身份验证并处理登录,之后它只接收数据并将其排队等待处理。认证部分很关键,实现时间很长,再次实现也需要这么长时间,所以我在想,认证完成后,我是否可以将我拥有的阻塞套接字转换为 SocketChannel 的套接字,以便选择器可以以非阻塞方式处理其消息?
java - java nio socketChannel 读取总是返回相同的数据
在客户端,阅读代码:
问题是socketChannel.read()总是返回正数,我检查了返回缓冲区,数据重复了N次,它喜欢低级套接字缓冲区的位置没有向前移动。任何想法?
java - 从非阻塞 SocketChanel 读取信息
我正在尝试读取一个非阻塞套接字,以避免在我的程序中的某个时刻卡住。有谁知道为什么当我尝试阅读时总是返回零?ByteBuffer会有问题吗?此问题发生在长度始终为零的读取方法中。
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 字节(较大的大小对这种现象没有任何影响)。
任何想法可能导致此问题或如何解决此问题?
java - Android中的Java SocketChannel write(ByteBuffer source)在windows中是否不同?
当我在Android中调试包含SocketChannel write的代码时,我得到了IllegalArgumentException,但是在windows中相同的代码没有这个异常,在SocketChannel write中Android和windows之间有区别吗?
更新:(代码是开源项目frostwire-android的一部分(这个文件在github),这部分和vuze 4.5一样,我只是添加一个try{})