- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我找到了一个 related question ,但它并不是特别有用,因为它没有提供完整的示例。
问题:如何使用AsynchronousSocketChannel用于使用固定大小的缓冲区读取未知长度的数据
第一次尝试(读取一次):
final int bufferSize = 1024;
final SocketAddress address = /*ip:port*/;
final ThreadFactory threadFactory = Executors.defaultThreadFactory();
final ExecutorService executor = Executors.newCachedThreadPool(threadFactory);
final AsynchronousChannelGroup asyncChannelGroup = AsynchronousChannelGroup.withCachedThreadPool(executor, 5);
final AsynchronousSocketChannel client = AsynchronousSocketChannel.open(asyncChannelGroup);
client.connect(address).get(5, TimeUnit.SECONDS);//block until the connection is established
//write the request
Integer bytesWritten = client.write(StandardCharsets.US_ASCII.encode("a custom request in a binary format")).get();
//read the response
final ByteBuffer readTo = ByteBuffer.allocate(bufferSize);
final StringBuilder responseBuilder = new StringBuilder();
client.read(readTo, readTo, new CompletionHandler<Integer, ByteBuffer>() {
public void completed(Integer bytesRead, ByteBuffer buffer) {
buffer.flip();
responseBuilder.append(StandardCharsets.US_ASCII.decode(buffer).toString());
try {
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public void failed(Throwable exc, ByteBuffer attachment) {
try {
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
);
asyncChannelGroup.awaitTermination(5, TimeUnit.SECONDS);
asyncChannelGroup.shutdown();
System.out.println(responseBuilder.toString());
我需要做哪些更改才能干净地实现在bytesRead != -1
(即到达流末尾)时连续读入缓冲区?
最佳答案
这是我最终所做的简化版本(使用 Guava 的 ListenableFuture ):
class SomeUtilClass {
public interface Processor<T> {
boolean process(Integer byteCount, ByteBuffer buffer);
T result();
}
public static <T> ListenableFuture<T> read(
final AsynchronousSocketChannel delegate,
final Processor<T> processor,
ByteBuffer buffer
) {
final SettableFuture<T> resultFuture = SettableFuture.create();
delegate.read(buffer, buffer, new Handler<T, Integer, ByteBuffer>(resultFuture) {
public void completed(Integer bytesRead, ByteBuffer buffer) {
buffer.flip();
if(processor.process(bytesRead, buffer)) {
buffer.clear();
delegate.read(buffer, buffer, this);
} else {
resultFuture.set(processor.result());
}
}
});
return resultFuture;
}
}
进一步改进包括使用 Commons Pool的 ByteBuffer
关于java - 如何在循环或递归中使用 AsynchronousSocketChannel#read?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13314650/
我正在使用java AsynchronousSocketChannel来 self 的项目中的 nio2。我也在 ubuntu 14.04 上使用 oracle jdk 1.7.0_80。 我的项目是
如何在无法导入的 anroid 中使用 AsynchronousSocketChannel import java.nio.channels.AsynchronousSocketChannel; im
我正在制作一个程序,需要将加密数据从一台电脑发送到另一台电脑。我不想每次都明确地加密/解密数据,然后使用 AsynchronousSocketChannel 发送数据,而是想知道是否可以以某种方式扩展
我的服务器使用 AsynchronousServerSocketChannel,它使用 CompletionHandler 监听客户端连接。当客户端连接被接受时,AsynchronousSocketC
我正在 Kotlin 中试验一个简单的 HTTP1.1 服务器,以便尝试重现一个更复杂的问题,即在关闭 AsynchronousSocketChannel 时内容似乎被切断 net::ERR_CONT
尊重, 我尝试使用新的Java NIO2在客户端和服务器端创建异步SocketChannel并进行通信,但问题是我发送到服务器上套接字的所有消息,套接字都将其读取为一条消息。这是代码: 我创建用于写入
要执行反序列化,我需要一个ObjectInputStream。但我们只是使用AsynchronousSocketChannel,它无法转换为ObjectInputStream。我能做什么? 最佳答案
我找到了一个 related question ,但它并不是特别有用,因为它没有提供完整的示例。 问题:如何使用AsynchronousSocketChannel用于使用固定大小的缓冲区读取未知长度的
我正在试验 NIO2 并遇到了问题。 这是我使用的代码: ByteBuffer buffer = ByteBuffer.allocate(DEFAULT_BUFFER_SIZE); chann
我正在尝试使用 CompletionHandler 而不是 Futures 在 vert.x worker verticle 中的 AsynchronousSocketChannel 上实现单个请求/
我正在开发一个TCP服务器,我很好奇是否可以同步AsynchronousSocketChannel的读取和写入方法。我将 channel 包装到另一个类中,因为我的 channel 需要一些附加功能。
我一直在使用 AsychronousSockets,但在运行大负载时遇到了接收 ReadPendingException 的问题。 一些背景:我希望客户端异步向服务器发送消息,然后监听响应。 响应可以
当 Telnet 客户端断开连接时,AsynchronousSocketChannel 会触发其 CompletionHandler 的 completed(Integer result, ByteB
这个问题已经有答案了: What does a "Cannot find symbol" or "Cannot resolve symbol" error mean? (18 个回答) 已关闭 4 年
我正在使用 java 7 的 nio2 AsynchronousSocketChannel 来使用 CompletionHandlers 执行读取和写入操作。首先我想知道写操作是否能保证完全写出Byt
我正在使用 java 7 的 nio2 AsynchronousSocketChannel 来使用 CompletionHandlers 执行读取和写入操作。首先我想知道写操作是否能保证完全写出Byt
INTERNET 上所有在 NIO2 上可用的源/示例都没有 TLS/SSL 支持, java.nio.channels.AsynchronousSocketChanneljava.nio.chann
我是一名优秀的程序员,十分优秀!