Как правильно использовать метод writeUTF ()? - PullRequest
0 голосов
/ 09 мая 2018

Я пытаюсь создать простой клиент и сервер, который обменивается файлами, поэтому я пытаюсь использовать метод writeUtf() для отправки имени файла как String, но он вообще не работает.

 public class Client {
    public static void main(String[] args) throws Exception {
    @SuppressWarnings("resource")
    Socket client = new Socket("localhost", 1241);
Path currentRelativePath = Paths.get("");
String currentPath = currentRelativePath.toAbsolutePath().toString();
DataOutputStream outToServer = new DataOutputStream(client.getOutputStream());
DataInputStream dataInFromServer = new DataInputStream(client.getInputStream());
Scanner keyboardInput=new Scanner(System.in);
System.out.println("Enter Operation Type(PUt, Get, Or Exit)");
String OperationType=keyboardInput.nextLine();
switch(OperationType){
case "PUT":
    outToServer.writeChar('P');
    System.out.println("File Or Directory name:");
    String FileOrDirName=keyboardInput.nextLine();
    //outToServer.writeUTF(FileOrDirName);
    //outToServer.write((short)FileOrDirName.length());
        outToServer.writeUTF(FileOrDirName);
    File fileOrDir=new File(FileOrDirName);
    if(fileOrDir.getParent()==currentPath || fileOrDir.getParent()==null){
    if(fileOrDir.isDirectory()){
        outToServer.writeInt(1);
        FileOperations.zipDir(fileOrDir);
        outToServer.write(FileOperations.readFileAsByteArray(FileOrDirName+".zip"));

        File tmp=new File(FileOrDirName+".zip");
        tmp.delete();
    }
    else {
        outToServer.writeInt(0);

        byte toSend[]=FileOperations.readFileAsByteArray(FileOrDirName);
        outToServer.writeDouble(toSend.length);
        for(int i=0; i<toSend.length; i++)
                outToServer.writeByte(toSend[i]);
    //  outToServer.write(ToSend,0,ToSend.length);
        //outToServer.write(FileOperations.readFileAsByteArray(FileOrDirName));
}
    outToServer.flush();
    outToServer.close();
    keyboardInput.close();
    client.close();
}   
    }

}
    }

а вот и Сервер:

        import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.IOException;
import java.net.Socket;
import java.nio.file.Path;
import java.nio.file.Paths;

class TcpFileServerThread extends Thread{
    private Socket client;
    public TcpFileServerThread(Socket client) {
        this.client = client;
    }
    public void run() {
        try {
            DataOutputStream outToClient = new DataOutputStream(client.getOutputStream());
            DataInputStream dataInFromClient = new DataInputStream(client.getInputStream()) ;
            Path currentRelativePath = Paths.get("");
            String currentPath = currentRelativePath.toAbsolutePath().toString();
            //File f;
            //System.out.println(dataInFromClient.readInt());
            /** client request PUT **/
            switch(dataInFromClient.readChar()){
            case 'P':
            int lengthRecvd= (int)dataInFromClient.readDouble();
            byte[] toRecv=new byte[lengthRecvd];

            for(int i=0; i<lengthRecvd; i++){
                toRecv[i]=dataInFromClient.readByte();
            }

        //  dataInFromClient.read(file_or_dir_from_client);
            //FileOrDirName="uu.txt";
            String FileOrDirName=dataInFromClient.readUTF();
        //  int arrLen=dataInFromClient.readShort();
        /** for(int i=0; i<arrLen; i++){
                char o=dataInFromClient.readChar();
                System.out.println(o);
            }**/

            System.out.println(FileOrDirName);
            File f=new File(FileOrDirName);
            if(f.getParent()==null || f.getParent()==currentPath){

            FileOperations.writeFromByteArrayToFile(toRecv, FileOrDirName); 
            if(dataInFromClient.readInt()==1){
                File zipFl=new File(FileOrDirName+".zip");
            FileOperations.unzip(zipFl);
                zipFl.delete();
            }   
            }

            }



        }
        catch(IOException e){
            e.printStackTrace();
        }
    }
    }

Я получаю FileNotFoundException, а вывод для System.out.println(FileOrDirName) на сервере - пустая строка, поскольку она была пустой.

1 Ответ

0 голосов
/ 11 мая 2018

Есть только один способ использовать его, и это не так.

int lengthRecvd= (int)dataInFromClient.readDouble();

Здесь вы читаете double, который не был написан. Таким образом, вы получите любое значение из следующих 8 байтов на входе.

        byte[] toRecv=new byte[lengthRecvd];
        for(int i=0; i<lengthRecvd; i++){
            toRecv[i]=dataInFromClient.readByte();
        }

Здесь вы читаете столько байтов ввода, которые могут быть чем угодно, но также не записаны.

Удали все это.

        String FileOrDirName=dataInFromClient.readUTF();

Вот, наконец, вы читаете данные, и это единственное, что на самом деле было записано.

Удивительно, что этот код не выдает IOException какого-то рода.

Вы можете читать только с DataInputStream данными, которые фактически были записаны соответствующим методом DataOutputStream, кроме простых байтовых массивов.

...