Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.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 如何从RRQ数据包中获取文件名?_Java_Sockets_Server_Datagram_Tftp - Fatal编程技术网

Java 如何从RRQ数据包中获取文件名?

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

我在TFTP服务器上工作。根据图像,我的数据包的最大长度是516字节(2+2+512)

我试图从客户机数据包中获取原始长度(在本例中,在RRQ数据包中发送13个字节),而不是从保存客户机数据包的服务器数据包长度(516字节)

我需要它来提取文件名,但字符串内容是“filename+nullBytes”,这些空字节来自服务器datagrampacket

这是我卡住的代码:

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