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