- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经开始开发一个预先开发的 Java 应用程序,其中处理 java 套接字。该项目的主要概念是在java套接字服务器上从客户端获取数据并对其进行处理。
该项目是使用 Java NIO ServerSocketChannel 开发的。
现在在这种情况下,我每秒可以从客户端获取大约 70-80 条记录。而如果我使用简单的 Java ServerSocket(仅用于测试目的),输出会放大到大约 800 次。
为什么两者差别这么大?如何修改ServerSocketChannel来模仿ServerSocket?
这是我的主要处理部分,
SocketChannel client = (SocketChannel) key.channel();
if (!key.isReadable()) {
key.cancel();
client.close();
continue;
}
int[] k = (int[]) key.attachment();
if (k[2] == 0) {
ByteBuffer lengthBuffer = ByteBuffer.allocate(2);
int bytesRead = -1;
if (!client.socket().isClosed() && key.isValid()) {
bytesRead = client.read(lengthBuffer);
}
if (bytesRead == -1) {
key.cancel();
client.close();
continue;
}
lengthBuffer.flip();
byte[] bytes = new byte[2];
lengthBuffer.get(bytes, 0, 2);
short length = DRMSDecoder.getShort(bytes);
k[0]++;
k[1] = length;
k[2] = 1;
key.attach(k);
lengthBuffer.clear();
}
else {
try {
int length = k[1];
ByteBuffer dataBuffer = ByteBuffer.allocate(length);
dataBuffer.clear();
System.gc();
int bytesRead = -1;
if (!client.socket().isClosed() && key.isValid()) {
bytesRead = client.read(dataBuffer);
}
if (bytesRead == -1) {
key.cancel();
client.close();
continue;
}
dataBuffer.flip();
Hashtable<String, Object> request = decoder.decode(dataBuffer);
short call_type = (Short) request.get("Call Type");
if (request.get("Call Type") != null && (((Short) request.get("Call Type")) == 78 || ((Short) request.get("Call Type")) == 80)) {
} else if (request.get("Call Type") != null && (((Short) request.get("Call Type")) == 79)) {
key.cancel();
client.close();
}
String message = (String) request.get("Buffer");
handleMessage(message);
}
k[0]++;
k[2] = 0;
key.attach(k);
lastMessageProcessed++;
dataBuffer.clear();
} catch (Exception e) {
// System.out.println(e);
}
}
最佳答案
区别在于阻塞 I/O 与非阻塞 I/O。
引用:https://medium.com/coderscorner/tale-of-client-server-and-socket-a6ef54a74763
关于java - ServerSocketChannel 与 ServerSocket Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52362555/
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve th
我有以下代码: Selector socketSelector = SelectorProvider.provider().openSelector(); ServerSocketChannel s
当用户单击“连接”按钮时,我的 SwingWorker 的 doInBackground() 创建(并向 OP_ACCEPT 注册)一个新的 ServerSocketChannel。 当客户端 isA
当 ServerSocketChannel 在非阻塞模式下使用并在选择器中注册时,以下 Channel.close() 调用不会立即关闭套接字,并且它在 LISTENING 状态下的 netstat
对 ServerSocketChannel.open() 的调用从未返回。我们使用的是jdk1.8.0_144。 堆栈跟踪显示它永远停留在 ServerSocketChannelImpl 类初始化中。
选择器阻塞 ServerSocketChannel 的用例是什么时候?通常,选择器如何处理阻塞 channel ? 最佳答案 这是来自 SelectableChannel javadoc : A ch
我正在努力学习 Java。我想实现一个简单的联网 connect 4 游戏以及聊天功能。 我希望我的网络逻辑是非阻塞的,所以经过大量研究后,我发现 SocketChannel 正是我重新调整需求后的样
为什么我们必须创建一个InetSocketAddress对象? 但是对于ServerSocket,我们只需使用int来输入端口号 示例: try( ServerSocketChanne
我已经开始开发一个预先开发的 Java 应用程序,其中处理 java 套接字。该项目的主要概念是在java套接字服务器上从客户端获取数据并对其进行处理。 该项目是使用 Java NIO ServerS
这是一个非常基本的问题,但我在任何地方都找不到明确的答案: 当我 accept()来自 ServerSocketChannel 的连接,我是否保证返回的 SocketChannel 是“connect
我有一个java.nio.channels.ServerSocketChannel,我初始化如下: while(true) { ServerSocketChannel channel = Se
我的 Android 应用程序中有服务器线程,当用户决定关闭它时需要正确处理它。我选择接受()客户端的非阻塞 ServerSocketChannel。 并得到了这个 public class Sock
我有一个 Android 设备,它将运行一个服务器,其他 Android 设备(客户端)将连接到该服务器。我在非阻塞模式下使用 SocketChannel 和 ServerSocketChannel。
HTML5可以和Java Serversocketchannel通信吗?如果可能,任何人都可以告诉我详细信息。 提前致谢。 最佳答案 我假设您谈论的是 WebSockets 而不是其他协议(proto
我在守护线程上有一个计时器,它不断地将数据写入 SocketChannel 。在主类中,我没有此套接字 channel 的对象引用,但我有 ServerSocket 的引用该套接字 channel 连
我有一个应用程序,我需要在其中使用 ServerSocketChannel 和 SocketChannel,但是 SSLContext 给了我 ServerSocketFactory它提供 Serve
我正在用 Java 开发一个小组对话服务器,我目前正在破解网络代码,但似乎我无法在阻塞 I/O 操作上设置正确的超时:我可能被某些 Java 攻击了怪异(或者,简单地说,我误解了 javadoc)。
我不明白 NIO 是如何工作的。这是一个示例代码: // Create the server socket channel ServerSocketChannel server = ServerSoc
我有一个 ServerSocketChannel 和一个 Socket.ServerSocket 绑定(bind)在端口 8888 上。Socket连接到ServerSocket并发送数据。如果我只关
当我将 selector.select() 注册到 SocketChannel 并在单独的线程中关闭 SocketChannel 的对等体时,selector.select() 返回,并且设置了该 c
我是一名优秀的程序员,十分优秀!