바이트 수를 정의하지 않고 SocketChannel에서 스트림을 읽으려고합니다.바이트 수가 정의되지 않은 SocketChannel에서 TCP를 통한 스트림 읽기
내가 생각한 대체 솔루션은 미리 정의 된 크기의 다른 ByteBuffers를 목록에 저장하여 나중에 수신 된 크기의 새 ByteBuffer를 할당하고 결과를 내부에 넣을 수있게하는 것입니다.
문제
차단 모드에 내가 있다는 것입니다 및 코드 확인 내가 읽기 방법에 따라 만들어진 루프를 떠나 유효한 상태를 찾을 수 없습니다 :public static final Charset charsetUTF8 = Charset.forName("UTF-8");
public static final int BUFFER_SIZE = 1024;
public static String getUnbounded(String st, SocketAddress address) throws IOException {
SocketChannel sc = SocketChannel.open(address);
sc.write(charsetUTF8.encode(st));
List<ByteBuffer> listBuffers = new ArrayList<>();
ByteBuffer buff = ByteBuffer.allocate(BUFFER_SIZE);
while(sc.read(buff) > -1){
if(buff.remaining() == 0){
listBuffers.add(buff);
buff.clear();
}
}
listBuffers.add(buff);
ByteBuffer finalBuffer = ByteBuffer.allocate(BUFFER_SIZE * listBuffers.size());
for(ByteBuffer tempBuff: listBuffers){
finalBuffer.put(tempBuff);
tempBuff.clear();
}
finalBuffer.flip();
return charsetUTF8.decode(finalBuffer).toString();
}
이 문제를 해결하는 방법에 대한 어떤 생각을?
왜 ByteBuffer를 사용해야 할 필요가 있다고 생각하십니까? – kdgregory
어떤 제안이 있습니까? Read 메서드를 더한 것만으로 ByteBuffer가 걸립니다. – Hosni
왜 채널을 사용합니까? IO를 차단하고 데이터를 힙 할당 버퍼에 저장하려고합니다. 당신은 정말로 당신이 단순한'SocketInputStream'을 통해 * 아무것도 얻고 있다고 생각합니까? – kdgregory