问题标签 [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 回答
2944 浏览

android - Android - 如何长时间保持与服务器的连接

我使用 SocketChannel 为 Android 编写了一个聊天应用程序。它与服务器成功连接,所有功能都正常工作。但是在我登录后很长一段时间(大约 2-3 小时),我尝试再次发送聊天消息,但它失败了。在日志文件中,SocketChannel,选择器仍然打开并连接到服务器,消息已经写入成功。有什么问题?我错过了什么?

在此先感谢您的帮助。

0 投票
1 回答
8370 浏览

java - 仅通过一个 SocketChannel 发送多条消息

阅读本教程后:http : //rox-xmlrpc.sourceforge.net/niotut/(这是关于编写非阻塞服务器和客户端,我阅读了 NIO 部分,跳过了 SSL 部分),现在我正在尝试重写我自己的客户端,但我在尝试编辑客户端代码时遇到问题。

首先,我想让你看看教程的客户端代码,它包含两个文件:

  • RspHandler.java:http://rox-xmlrpc.sourceforge.net/niotut/src/RspHandler.java _

  • NIOClient.java:http://rox-xmlrpc.sourceforge.net/niotut/src/NioClient.java _

但是我在函数中编辑了 NIOClient.javamain来解释我的问题如下:

我编辑的客户端只是做了一件简单的事情,就是向服务器发送一条消息,然后从服务器接收一条回显的消息。当然,上面的代码运行良好。它发送 2 条消息,然后正确接收它们。

但我不想要的东西在上面的客户端是:send函数调用这段代码:

这意味着每个区分的消息都将对应于每个区分的新 SocketChannel,但是现在我只想使用一个 SocketChannel 来发送许多消息,所以我像下面的代码一样更改客户端:

但是在运行上面的客户端之后,我只看到第一条消息被发送和接收回来,经过调试,我知道第二条消息没有发送,但我不知道为什么以及如何解决这个问题。

有人知道答案吗?

感谢您阅读我很长的问题。

0 投票
1 回答
1499 浏览

android - Android:在 Wifi 网络上查找对等点

我试图弄清楚如何搜索登录到在特定端口上托管应用程序的 wifi 网络的其他设备。

如何在不知道它们的地址甚至它们托管的端口的情况下检测这些其他设备的存在?

一旦发现,我应该能够联系设备并使用 SocketChannels 与它建立客户端-服务器连接。

注意:此应用程序适用于 ICS 之前的 Android 设备。所以没有Wifi-Direct。

0 投票
2 回答
8149 浏览

java - 非阻塞客户端和非阻塞服务器如何仅通过一个 SocketChannel 进行通信

我正在尝试编写具有要求的非阻塞客户端和非阻塞服务器:

  • 服务器只是监听客户端并将收到的内容发回给他们
  • 客户端可以随时向服务器发送消息,并且可以多次发送,但只能通过一个 SocketChannel

我阅读了本教程:http ://rox-xmlrpc.sourceforge.net/niotut/index.html ,它实现了服务器,如下所示:

  1. 初始化选择器
  2. 等待来自客户端的可接受的 SelectionKey
  3. 然后等待一个可读的SelectionKey,并从中读取数据(socketChannel.read返回时-1,关闭socketChannel)
  4. 之后通过可写的 SelectionKey 发送回客户端

我还看了一下本教程:https ://forums.oracle.com/forums/thread.jspa?threadID=1145909&tstart=2040 ,但这对我来说太难理解了

所以我根据ROX的教程重写了自己的代码。这是我的代码http://www.mediafire.com?o30yvtp5kqpya8b(它几乎是基于 ROX 教程的代码)。因为这里很难贴出所有代码,所以我把我的项目上传到mediafire让你下载,请下载它,你可以将它导入到Eclipse中,方便查看代码。

您可以运行:MyServer.javain package server,然后MyClent.javain package client_test(不关心 package client

运行服务器和客户端后,您将看到服务器只能收到来自客户端的第一条消息,但应该收到 2 条消息。我知道我的工具有问题,但我不知道为什么以及如何修复它。

任何有关修复我的代码或关于我的要求的解决方案的建议将不胜感激,谢谢大家。

好的,我将在这里发布代码的相关部分:

我的客户:

我的客户端.java

MyResponseHandler.java

MyServer.java

如果您想查看更多代码,可以下载 zip 文件。并且在运行服务器和客户端时,调试的结果是:

服务器

客户

0 投票
1 回答
342 浏览

java - 如何判断java中是否建立了连接?

我试图在android中的两个模拟器之间建立一个套接字通道。我写了以下代码:

注意我没有在(ip,端口)中启动另一个模拟器,这意味着连接总是会失败。当我开始调试上面的代码时,我发现

然后它跳转到 catch 块:

catch 块中的所有其他行都不执行,返回时客户端不为空。那么如何判断连接是否成功建立呢?

0 投票
3 回答
5537 浏览

private - PubNub 最佳实践:如何管理私人房间?

我正在学习 pubnub,我阅读了他们的文档,但我只是找不到如何管理多房间聊天框。

默认情况下,任何人都可以收听频道。订阅它并在上面发布很容易。

我想要的是有一个主要的公共房间(到目前为止一切都很好),但任何人也应该能够与其他人私下交谈,而不会有被其他用户阅读的风险。

这些动态房间将被标记,用户应该能够从一个到另一个。

另一个要求是与某人私下交谈不会将您踢出您订阅的其他房间(您仍然可以在聊天时收到新消息已发布到另一个房间的通知)

实现这一目标的最佳实践是什么?

  • 我会使用不同的频道(动态创建)吗?
  • 我会使用一个频道并根据他们的状态、伪房间 ID 或主角过滤消息吗?
  • 我会使用多路复用(仅一个套接字)吗?

我需要知道实现这一目标的最佳方法,因为文档只描述了一个房间的基本场景,互联网上对此一无所知。

谢谢你。

PS:我知道 PubNub 一次不推荐超过 2 个频道(尽管我很难找到对此的解释)。

PPS:我正在使用带有 socket.io 的 punbub

0 投票
1 回答
384 浏览

java - ConcurrentHashMap 在调用 put 方法时未插入非空键值对

我正在使用 ConcurrentHashMap 来缓存我在 SocketChannel 上处理的任务。StreamTask 是一个 Runnable,用于在客户端服务器通信期间超过往返阈值时重新调度自身,因此如果时间过去,它将自己从缓存中删除。此外,StreamWriteTask 线程会将其放在缓存中,而 StreaReadTask 将尝试将其删除。

问题是当我调用“processingCache.put()”时,它并不总是添加到地图中。

0 投票
1 回答
6467 浏览

java - 从未选择多个 OP 代码的 Java SocketChannel register()

我用 Java 构建了一个基于 Selector 的系统,它可以接受多个客户端。它在 OP_ACCEPT 下注册了一个 ServerSocketChannel,它接受()传入的连接并再次向选择器注册生成的 SocketChannel。这是那一点:

如果我为 OP_READ 注册新的 SocketChannel,则可以正常工作。isReadable() 检查成功,读取数据。这是那一点:

但是,如果我为 OP_READ|OP_WRITE 注册 SocketChannel,则什么也不会发生。据我所知,选择器永远不会找到可读()或可写()的通道。唯一的变化是注册频道以获得 WRITE 权限。

知道为什么会这样吗?

编辑 - 为了完成,这里有一些客户端代码:

(客户端为 OP_READ|OP_WRITE 注册服务器)

0 投票
1 回答
8971 浏览

java - java.nio.channels.IllegalBlockingModeException,同时通过通道从客户端读取内容

我对 NIO 非常陌生,我正在构建一个聊天应用程序,我在所有客户端中都建立了连接,但是在从客户端读取内容时我得到了java.nio.channels.IllegalBlockingModeException。请帮助我这里是发生异常的代码。发生异常while (rbc.read(b) != -1)PrintRequest class

我的服务器代码:

客户端:

0 投票
2 回答
2308 浏览

java - Java SocketChannel 读取未知长度的消息

从套接字读取 1024 字节的数据。在这种情况下,所有消息都被合并,最后一条消息没有完全到达。如何在消息分隔符“|”之前将数据读入缓冲区 ? 我想单独接收每条消息。