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 如何正确使用writeUTF()方法?_Java_Sockets_Serversocket_Dataoutputstream - Fatal编程技术网

Java 如何正确使用writeUTF()方法?

Java 如何正确使用writeUTF()方法?,java,sockets,serversocket,dataoutputstream,Java,Sockets,Serversocket,Dataoutputstream,我试图使客户端和服务器简单地交换文件,因此,我试图使用writeUtf()方法将文件名作为字符串发送,但它根本不起作用 public class Client { public static void main(String[] args) throws Exception { @SuppressWarnings("resource") Socket client = new Socket("localhost", 1241); Path currentRelative

我试图使客户端和服务器简单地交换文件,因此,我试图使用
writeUtf()
方法将文件名作为
字符串发送,但它根本不起作用

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

}
    }
公共类客户端{
公共静态void main(字符串[]args)引发异常{
@抑制警告(“资源”)
套接字客户端=新套接字(“localhost”,1241);
Path currentRelativePath=Path.get(“”);
字符串currentPath=currentRelativePath.toAbsolutePath().toString();
DataOutputStream outToServer=新的DataOutputStream(client.getOutputStream());
DataInputStream DataInforomServer=新的DataInputStream(client.getInputStream());
扫描仪键盘输入=新扫描仪(System.in);
System.out.println(“输入操作类型(PUt、Get或Exit)”;
字符串操作类型=keyboardInput.nextLine();
开关(操作型){
案例“付诸表决”:
outToServer.writeChar('P');
System.out.println(“文件或目录名:”);
字符串fileOrderName=keyboardInput.nextLine();
//outToServer.writeUTF(文件名);
//write((短)fileOrderName.length());
outToServer.writeUTF(文件名);
File fileorder=新文件(fileordername);
if(fileOrder.getParent()==currentPath | | fileOrder.getParent()==null){
if(fileorder.isDirectory()){
outToServer.writeInt(1);
FileOperations.zipDir(fileorder);
write(FileOperations.readFileAsByteArray(fileordername+“.zip”);
File tmp=新文件(fileOrderName+“.zip”);
tmp.delete();
}
否则{
outToServer.writeInt(0);
byte toSend[]=FileOperations.readFileAsByteArray(FileOrderName);
outToServer.writeDouble(toSend.length);

对于(inti=0;i来说,只有一种方法可以使用它,而这不是它

int lengthRecvd= (int)dataInFromClient.readDouble();
这里您正在读取一个尚未写入的
double
,因此您将得到输入中接下来8个字节的double值

        byte[] toRecv=new byte[lengthRecvd];
        for(int i=0; i<lengthRecvd; i++){
            toRecv[i]=dataInFromClient.readByte();
        }
在这里,您终于可以读取数据了,这是唯一实际写入的数据

令人惊讶的是,这段代码没有抛出某种类型的
IOException

除了字节数组之外,您只能使用
DataOutputStream
的相应方法实际写入的
DataInputStream
数据进行读取

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