Java 通过ByteBuffer传输字符串
我需要通过bytebuffer传输2个整数和一个字符串。然后通过bytebuffer接收另一个字符串 一定有这样的东西: 从键盘读取x int。输入。从键盘读取y int。输入。从键盘读取字符串。进来所有的值都在某个地方,正在处理中,我必须接收字符串。所有这些都是通过套接字通道完成的 我做过这样的事情: 发送 收到:Java 通过ByteBuffer传输字符串,java,sockets,bytebuffer,Java,Sockets,Bytebuffer,我需要通过bytebuffer传输2个整数和一个字符串。然后通过bytebuffer接收另一个字符串 一定有这样的东西: 从键盘读取x int。输入。从键盘读取y int。输入。从键盘读取字符串。进来所有的值都在某个地方,正在处理中,我必须接收字符串。所有这些都是通过套接字通道完成的 我做过这样的事情: 发送 收到: ByteBuffer bb = ByteBuffer.allocate(100); socketChannel.read(bb); int m=bb.getI
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]
bb.putInt(0,m).putInt(8,n).put(str.getBytes()); // problem?
是问题putstr.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);
byte[] b = new byte[length];
bb.position(16);
bb.get(b);
String str=new String(b);