从.txt一次获取16个字节

时间:2015-04-17 17:32:48

标签: java string network-programming byte

我有两个文件一个发送,一个接收。我有两者之间的联系。

可以发送文字:

// Prepare a message 
 messageToSend = "text that is sent";
 lengthMessageToSend = messageToSend.length(); 
 sendingBuffer = messageToSend.getBytes();


// Send the message
 myLink.sendFrame(sendingBuffer, lengthMessageToSend);
 System.out.println(lengthMessageToSend);

并收到:

// Display the message
  messageReceived = new String(receivingBuffer, 0, lengthMessageReceived);
  System.out.println("Message received is: [" + messageReceived + "]"); 

// Prepare a message  
  messageToSend = "1";
  lengthMessageToSend = messageToSend.length(); 
  sendingBuffer = messageToSend.getBytes();

 // Send the message
  myLink.sendFrame(sendingBuffer, lengthMessageToSend);

我现在尝试发送的文本来自.txt,但只是在有效负载内一次发送16个字节:

[SEQ | LEN | PAYLOAD | CHECKSUM] - >总标题为19个字节。

这样做的最佳方法是什么?

一次读取16个字节(8个字符)?如果是这样怎么样?

1 个答案:

答案 0 :(得分:1)

每次循环并将i递增16,此i表示messageToSend.getBytes()偏移的开始 - 然后将接下来的16个字节(从i转换为{{ 1}},处理“剩余少于16个字节的情况”进入'数据包'发送它。

同时使用i+16的显式编码或环境设置可能会导致意外的行为更改。

这样的基本实现可能类似于:

getBytes()

必须对代码进行调整以添加序列号,但这不应该很难,因为它总是加1。

读取类似:使用数据包标头并根据长度/帧数据处理剩余的缓冲区(可能包括下一个数据包的开始)。

byte[] data = messageToSend.getBytes("UTF-8"); // Specify encoding!

// "For all data, stepping by 16 bytes at a time.."
for (int i = 0; i < data.length; i += 16) {
   // How many bytes actually remain (or 16 if more than 16 remain)
   var frameSize = Math.min(16, data.length - i);

   // Construct frame data from data in i..i+frameSize and send.
   // If you want to ALWAYS send 16 bytes, update as appropriate.
   byte[] frameData = new byte[frameSize];
   System.arraycopy(data, i, frameData, 0, frameSize);

   sendFrame(frameData, frameSize);
}