Java 如何从RRQ数据包中获取文件名?
我在TFTP服务器上工作。根据图像,我的数据包的最大长度是516字节(2+2+512) 我试图从客户机数据包中获取原始长度(在本例中,在RRQ数据包中发送13个字节),而不是从保存客户机数据包的服务器数据包长度(516字节) 我需要它来提取文件名,但字符串内容是“filename+nullBytes”,这些空字节来自服务器datagrampacket 这是我卡住的代码:Java 如何从RRQ数据包中获取文件名?,java,sockets,server,datagram,tftp,Java,Sockets,Server,Datagram,Tftp,我在TFTP服务器上工作。根据图像,我的数据包的最大长度是516字节(2+2+512) 我试图从客户机数据包中获取原始长度(在本例中,在RRQ数据包中发送13个字节),而不是从保存客户机数据包的服务器数据包长度(516字节) 我需要它来提取文件名,但字符串内容是“filename+nullBytes”,这些空字节来自服务器datagrampacket 这是我卡住的代码: public static short RRQ = 1; enter code here public
public static short RRQ = 1;
enter code here
public void dataMetod() throws IOException{
byte[] packet = new byte[516];
//socket with listening port 5000
DatagramSocket datagramSocket = new DatagramSocket(5000);
//while receive packets
while (true) {
DatagramPacket datagramPacket = new DatagramPacket(packet,packet.length);
datagramSocket.receive(datagramPacket);
System.out.println("server: new packet!!:");
//create a byte[] with the "received packet length"(that's not true)
byte[] inData = new byte[datagramPacket.getLength()];
inData = datagramPacket.getData();
System.out.println("length: "+inData.length);
byte code;
code = inData[1];
System.out.println(code);
//check if its an RRQ packet
if (code == RRQ) {
System.out.println("server: RRQ PACKET!!");
String fileName = this.getFileName(inData);
System.out.println(fileName);
}
public String getFileName(byte[] inData) {
byte[] aux = new byte[inData.length - 7];
for (int i = 0; i < aux.length; i++) {
aux[i] = inData[i + 2];
}
return new String(aux);
}
公共静态短RRQ=1;
在这里输入代码
public void dataMetod()引发IOException{
字节[]数据包=新字节[516];
//带监听端口5000的插座
DatagramSocket DatagramSocket=新的DatagramSocket(5000);
//在接收数据包时
while(true){
DatagramPacket DatagramPacket=新的DatagramPacket(数据包,数据包.长度);
datagramSocket.receive(datagramPacket);
System.out.println(“服务器:新数据包!!:”;
//创建一个具有“接收数据包长度”的字节[](这不是真的)
byte[]inData=新字节[datagramPacket.getLength()];
inData=datagramPacket.getData();
System.out.println(“长度:+inData.length”);
字节码;
代码=inData[1];
System.out.println(代码);
//检查它是否是RRQ数据包
如果(代码==RRQ){
System.out.println(“服务器:RRQ数据包!!”;
字符串文件名=this.getFileName(inData);
System.out.println(文件名);
}
公共字符串getFileName(字节[]inData){
字节[]aux=新字节[inData.length-7];
对于(int i=0;i
试试这个:
public String getFileName(byte[] inData) {
final int maxLen = inData.length;
final StringBuilder sb = new StringBuilder();
int i = 2;
byte b;
while ( (i < maxLen) && (b = inData[i]) != 0 ) {
final int v = ((int)b) & 0xff;
sb.append( (char) v );
i++;
}
return sb.toString();
}
公共字符串getFileName(字节[]inData){
最终int maxLen=inData.length;
最终StringBuilder sb=新StringBuilder();
int i=2;
字节b;
而((i
我们可以通过在客户端类的文件名字符串中添加“\n”,然后使用BufferedReader来检测“\n”并保存文件名,而不是获取接收数据包的原始长度(通过数组搜索文件名)。
代码:
你怎么知道客户端实际上只发送了13个字节?你在使用什么客户端?好吧,对不起,这是我的第一篇文章,正在处理它。TFTP说“文件名以null结尾”。也许你应该相信这一点。“文件名以null结尾”由于数据包的长度,所以我依赖于它。不,文件名以一个0x00结尾,然后是“模式”和另一个0x00。规范没有提到“数据包中的最后七个字节”。(模式也可以是“netascii”…)它说:线程“main”中的异常java.lang.NullPointerException:null address | | null buffer我尝试了类似于在inData中搜索字节(0+mode+0)用户索引的方法(使用Arrays.binarySearch()),也许有办法,但我没有得到原始长度。我考虑编写一个if()它与空字节进行比较,并在找到的第一个空字节处返回字符串,但我没有找到与空字节的比较。
public String getFileName(byte[] inData) throws IOException {
//get a sub-array, from index[2] (beacuse we dont want opCode) to inData length
byte[] b =Arrays.copyOfRange(inData, 2, inData.length);
InputStream is = new ByteArrayInputStream(b);
BufferedReader bf = new BufferedReader(new InputStreamReader(is));
//We read a word that will be saved when "\n" is found.
//(adding "\n" previously to the fileName String in client class)
String filename = bf.readLine();
bf.close();
is.close();
System.out.println("server: filename is: "+filename.length()+" bytes");
return filename;
}