Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过ByteBuffer传输字符串_Java_Sockets_Bytebuffer - Fatal编程技术网

Java 通过ByteBuffer传输字符串

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传输2个整数和一个字符串。然后通过bytebuffer接收另一个字符串

一定有这样的东西: 从键盘读取x int。输入。从键盘读取y int。输入。从键盘读取字符串。进来所有的值都在某个地方,正在处理中,我必须接收字符串。所有这些都是通过套接字通道完成的

我做过这样的事情: 发送

收到:

   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);