客户端-服务器程序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) {
}
}
}
以下是服务器上的输出和异常:
请帮忙
# 1 楼答案
除了在
if branch
中设置ServerResponse之外,您不会在任何地方设置它,但它看起来会直接进入您调用else branch
的ServerResponse.indexOf
中-此时它仍然为空此外,您应该以小写字母开始命名变量,
ServerResponse
应该是serverResponse
# 2 楼答案
ServerResponse
为空,因为检查ReceivedFilename
的if
条件仅在ReceivedFilename
为空时才指定默认值您需要将
Receivedfilename
分配给查看代码中逻辑的ServerResponse
作为旁注,您需要使用
equals()
方法来比较String
值,而不是使用==
操作符来比较字符串对象引用。当您试图用空白字符串检查ReceivedFilename是否等于时,您可能会trim()
ReceivedFilename,但这取决于您自己。当然,您有许多不同的方法来检查字符串是否为空。您可以自己修改该方法,也可以从已有该方法的第三方库获得帮助