2013-02-10 45 views
1

我需要通過字節緩衝區傳輸2個整數和一個字符串。然後通過bytebuffer接收另一個字符串。通過字節緩衝區傳輸字符串

必須是這樣的: 從keyboard.Enter讀取x(int)。從keyboard.Enter中讀取y(int)。從鍵盤讀取字符串。輸入。所有的價值都去了,正在處理,我必須收到字符串。全部通過套接字通道完成。

我做了這樣的事情: SEND

Scanner scanner=new Scanner(System.in); 
int m,n; 
String str,result; 
System.out.println("x="); 
m=scanner.nextInt(); 
System.out.println("y="); 
n=scanner.nextInt(); 
System.out.println("String: "); 
str=scanner.next(); 

ByteBuffer bb=ByteBuffer.allocate(100); 

bb.putInt(0,m).putInt(8,n).put(str.getBytes()); // problem? 

try{ 

    sc.write(bb); 
    bb.clear(); 
    sc.read(bb); 

    CharBuffer cbuf = bb.asCharBuffer(); 
    result=cbuf.toString(); 

    System.out.println("Result : "+result); 

得到:

ByteBuffer bb = ByteBuffer.allocate(100);  
    socketChannel.read(bb); 
    int m=bb.getInt(0); 
    int n=bb.getInt(8); 
    String str=bb.toString().substring(16); 

    App app=new App(); 
    String result=app.longestRepeatingSubstring(str,m,n); 
    bb.clear(); 

    bb.put(result.getBytes()); 

    socketChannel.write(bb); 
    socketChannel.close(); 

但是我收到一個空字符串...

或者如果我直接就把BB。 toString()我收到類似這樣的東西: java.nio.HeapByteBuffer [pos = 237 lim = 258 cap = 798]

回答

0
bb.putInt(0,m).putInt(8,n).put(str.getBytes()); // problem? 

是的問題put(str.getBytes())依賴於先前設置的緩衝區中的位置,但因爲您使用的是偏移putInt函數,所以它不會。

bb.putInt(0,m).putInt(8,n).position(16).put(str.getBytes()).position(0); 

此行不會爲你的客戶工作ByteBuffer.toString()回報緩衝狀態沒有內容,

,而不是

String str=bb.toString().substring(16); 

你想

byte[] b = new byte[length]; 
bb.position(16); 
bb.get(b); 
String str=new String(b);