客户端要求服务器从服务器删除文件。在下面的代码中有三行代码,注释“有问题”。如果我不包含标记为“有问题”的行,则下面的程序成功删除该文件,然后返回以服务来自客户端的更多请求。如果这些行包含在代码中,则所请求的文件不会被删除,客户端和服务器都会挂起。这段代码有什么问题? (提前致谢)
客户方:
//...
client1 = new Socket(ip, port);
inFromServer = new BufferedReader(new InputStreamReader(client1.getInputStream()));
outToServer = new DataOutputStream(client1.getOutputStream());
Scanner scan0 = new Scanner(System.in);
String command = scan0.nextLine();
switch (command) {
//Other cases...
case "Delete file":
outToServer.writeBytes(command + '\n');
System.out.print("Enter file name: ");
Scanner del_file = new Scanner(System.in);
String file_name = del_file.nextLine();
outToServer.writeBytes(file_name);
System.out.println("\n" + inFromServer.readLine() + "\n");//Problematic
client1.close();
break;
服务器端:
server1accept = server1.accept();
inFromClient = new DataInputStream(server1accept.getInputStream());
outToClient = new DataOutputStream(server1accept.getOutputStream());
BufferedReader readIncoming = new BufferedReader(newInputStreamReader(server1accept.getInputStream()));
String clientMsg = readIncoming.readLine();
String server_file_location = "D:/"; //server file storage location
switch (clientMsg) {
//other cases
case "Delete file":
System.out.print("Command from ip: " + server1accept.getInetAddress() + " port: "+ server1accept.getPort()+": ");
System.out.println("Delete file");
String del_file = readIncoming.readLine();
String path = server_file_location + del_file;
if(Files.exists(Paths.get(path)) == true){
System.out.println("Deleting file: " +Paths.get(path));
Files.delete(Paths.get(path));
System.out.println("Deleted");
outToClient.writeBytes("Deleted");//Problematic
}
else{
System.out.println("Requested file does not exist");
outToClient.writeBytes("No such file exists"); //Problematic
}
break;
答案 0 :(得分:0)
像这样的客户端 - 服务器程序需要是对称的。如果在一端写一行,则必须在另一端读取一行。如果写入6个字节,则另一端必须读取6个字节。
这不是这种情况。客户端发送一行:
outToServer.writeBytes(command + '\n');
服务器读取它:
String clientMsg = readIncoming.readLine();
到目前为止,一切都很好。然后客户端发送一些字节(文件名):
outToServer.writeBytes(file_name);
但服务器读取一行:
String del_file = readIncoming.readLine();
因此,服务器将阻塞,直到客户端关闭套接字或发送换行符。
我强烈建议您在纸上定义一个明确的协议,并在两端使用对称类和方法。