2013-02-10 44 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);