利用死循環和判斷是否 讀到0個字節,便能判斷是否讀取完成,但它存在如下問題,如果輸入是中文的話,可能沒有讀取完中文的全部3個字節,導致亂碼。如果數據足夠隨機,這樣的情況肯定會出現的
@Test public void readStr() { SocketChannel client = (SocketChannel) selectionKey.channel(); client.configureBlocking(false); ByteBuffer byteBuffer = ByteBuffer.allocate(10); StringBuilder sb=new StringBuilder(); while (true) { byteBuffer.clear(); int read = client.read(byteBuffer); if (read <= 0) { System.out.println(client + "=" + sb); break; } byteBuffer.flip(); String message = new String(byteBuffer.array(), CharsetUtil.UTF_8); sb.append(message); } }
解決如上問題,個人覺得有兩個方案
方案1:
得到要讀取數據的長度,然后指定byteBuffer 的容量,這樣則可以一次性讀取完所有數據
方案2:
定制協議,按協議好的長度讀取定長數據,然后解析,這樣能保證數據不亂
