服务器执行客户端请求后,客户端在尝试从服务器接收确认消息时挂起

时间:2014-01-31 23:05:49

标签: java sockets client-server

客户端要求服务器从服务器删除文件。在下面的代码中有三行代码,注释“有问题”。如果我不包含标记为“有问题”的行,则下面的程序成功删除该文件,然后返回以服务来自客户端的更多请求。如果这些行包含在代码中,则所请求的文件不会被删除,客户端和服务器都会挂起。这段代码有什么问题? (提前致谢)

客户方:

//...
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;

1 个答案:

答案 0 :(得分:0)

像这样的客户端 - 服务器程序需要是对称的。如果在一端写一行,则必须在另一端读取一行。如果写入6个字节,则另一端必须读取6个字节。

这不是这种情况。客户端发送一行:

outToServer.writeBytes(command + '\n');

服务器读取它:

String clientMsg = readIncoming.readLine();

到目前为止,一切都很好。然后客户端发送一些字节(文件名):

outToServer.writeBytes(file_name);

但服务器读取一行:

String del_file = readIncoming.readLine();

因此,服务器将阻塞,直到客户端关闭套接字或发送换行符。

我强烈建议您在纸上定义一个明确的协议,并在两端使用对称类和方法。