gpt4 book ai didi

java - ServerSocketChannel 与 ServerSocket Java

转载 作者:行者123 更新时间:2023-11-30 06:00:23 24 4
gpt4 key购买 nike

我已经开始开发一个预先开发的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com