سلام، شما لطف داری :)
گفتم که بیشترشو از اون pdf کمک گرفتم...
فقط یه نکته مهمی رو حواست باشه وقتی در حالت معمولی از socket چیزی میخونیم تا زمانی که دیتا کامل به دستمون نرسیده متد ()read عددی بزرگتر از 0 بهمون برمیگردونه و فقط موقعی 0 برمیگردونه که اطلاعات کامل بهمون برسه
اما وقتی داریم از non-blocking io استفاده میکنیم قضیه فرق میکنه، چون کار read و write میتونن به طور همزمان انجام بشن ممکنه متد ()read عدد 0 بهمون برگردونه در حالی که هنوز اطلاعات کامل به دستمون نرسیده، برای داده های کم حجم کم اتفاق میفته که قبل از اتمام 0 برگردونه ولی اگر دیتا از سایز بافر بیشتر باشه این احتمال هست، روشی های مختلفی برای جلوگیری از این مشکل هست مثلا اینکه از قبل سایز رو به طرف مقابل بفرستیم تا بدونه تا کجا باید read کنه یا اینکه انتهای فایل رو مشخص کنیم (بیشتر زمانی که String میفرستیم کاربرد داره) مثلا من خودم اینکارو میکنم، یعنی وقتی چیزی میفرستم آخرش \n\r
اضافه میکنم :
private static final String EOF = "\n\r";
private String read(SelectionKey key) {
SocketChannel channel = (SocketChannel) key.channel();
StringBuilder sb = new StringBuilder();
ByteBuffer readBuffer = ByteBuffer.allocate(DEFAULT_BUFFER_SIZE);
CharsetDecoder decoder = StandardCharsets.UTF_8.newDecoder();
CharBuffer charBuffer;
int read;
try {
do {
read = channel.read(readBuffer);
if (read == -1) {
resetKey(key);
return null;
}
readBuffer.flip();
charBuffer = decoder.decode(readBuffer);
sb.append(charBuffer.array());
readBuffer.clear();
} while (sb.lastIndexOf(EOF) == -1);
} catch (IOException e) {
resetKey(key);
return null;
}
sb.delete(sb.lastIndexOf(EOF), sb.length());
return String.valueOf(sb);
}