有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

客户端-服务器程序Java中的serversocket NullpointerException

我正在用java编写一个简单的客户机-服务器程序。客户端向服务器发送文件名。服务器接收到该文件,然后对其进行解析,解析完文件名后,向客户端发送响应,判断文件名是否正确或无效

在服务器中,解析文件名时抛出NullPointerException错误

代码如下:

Server.java

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketTimeoutException;


public class Server extends Thread {

private static int port;
private ServerSocket serverSocket=null;
private String ReceivedFilename=null;
private String ServerResponse=null;

public Server(int port) throws IOException {
    serverSocket = new ServerSocket(port);
    //serverSocket.setSoTimeout(20000);
}

public void run() {
    while (true) {
        try {
            System.out.println("Waiting for client to send File name...");
            Socket server = serverSocket.accept();
            System.out.println("Connected to Client");
            DataInputStream in = new DataInputStream(server.getInputStream());
            ReceivedFilename = in.readUTF();
            System.out.println("Received Filename: "+ReceivedFilename);
            if(ReceivedFilename == "")
                ServerResponse = "Filename is empty!";
            else{
                if(ServerResponse.indexOf(".bat") == ServerResponse.length()-4)
                {
                    ServerResponse = "Correct file name provided.";
                }
                else
                {
                    ServerResponse = "Invalid Filename! Server only accepts .bat files";
                }
            }
            DataOutputStream out = new DataOutputStream(server.getOutputStream());
            out.writeUTF(ServerResponse);
            server.close();
        } catch (SocketTimeoutException s) {
            System.out.println("Socket timed out!");
            break;
        } catch (IOException e) {
            e.printStackTrace();
            break;
        }
    }
}

public static void main(String[] args) {
    port = 9000;
    try {
        Thread t = new Server(port);
        t.start();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
}

Client.java

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class Client {

private static String serverName;

public static void main(String[] args) {
    String sName = "localhost";
    int port = 9000;
    String Filename = "Scripts.bat";
    try {
        System.out.println("Connecting to Server");
        Socket client = new Socket(sName, port);
        System.out.println("Connected to Server");
        OutputStream outToServer = client.getOutputStream();
        DataOutputStream out = new DataOutputStream(outToServer);
        System.out.println("Sending filename to Server");
        out.writeUTF(Filename);
        System.out.println("Filename sent");
        InputStream inFromServer = client.getInputStream();
        DataInputStream in = new DataInputStream(inFromServer);
        System.out.println("Server says " + in.readUTF());
        client.close();
    } catch (IOException e) {
    }
}
}

以下是服务器上的输出和异常:

enter image description here

请帮忙


共 (2) 个答案

  1. # 1 楼答案

    ServerResponse=null
    

    除了在if branch中设置ServerResponse之外,您不会在任何地方设置它,但它看起来会直接进入您调用else branchServerResponse.indexOf中-此时它仍然为空

    此外,您应该以小写字母开始命名变量,ServerResponse应该是serverResponse

  2. # 2 楼答案

    ServerResponse为空,因为检查ReceivedFilenameif条件仅在ReceivedFilename为空时才指定默认值

    if(ReceivedFilename.equals("")) // I changed it to use equals method
        ServerResponse = "Filename is empty!"; // only here the default value is assigned
    

    您需要将Receivedfilename分配给查看代码中逻辑的ServerResponse

    if(ReceivedFilename.equals("")) // I changed it to use equals method
        ServerResponse = "Filename is empty!";
    else{
         // If it comes to the else part, the ServerResponse is still null as initialized at the start and therefore throws the NPE
         ServerResponse = ReceivedFilename; // incase ReceivedFilename is not blank
         if(ServerResponse.indexOf(".bat") == ServerResponse.length()-4)
         ...
    }
    

    作为旁注,您需要使用equals()方法来比较String值,而不是使用==操作符来比较字符串对象引用。当您试图用空白字符串检查ReceivedFilename是否等于时,您可能会trim()ReceivedFilename,但这取决于您自己。当然,您有许多不同的方法来检查字符串是否为空。您可以自己修改该方法,也可以从已有该方法的第三方库获得帮助