为什么我的申请没有进入我的if语句

我正在尝试用Java编写控制台客户端 – 服务器应用程序; 使用套接字,我目前有一个简单的登录系统和一个简单的命令系统。 登录系统似乎有效,但无论用户是否输入正确的凭据,它都会向客户端打印“无效的用户名和密码”行。 – 连接肯定有效。

但是,命令系统似乎根本不起作用,当服务器收到命令时,它似乎没有发回任何东西。

所以我的主要问题是为什么我的服务器在收到命令时不会向客户端发送任何内容?

这是我的服务器:

import java.io.*; import java.net.*; class TCPServer2 { public static void main(String argv[]) throws Exception { ServerSocket welcomeSocket = new ServerSocket(6789); String[][] Login = {{"MATT","UNCP"},{"JOHN","UNCP"},{"CARL","UNCP"}}; String Command; String username; String username1; String password; String password1; String cmd; while(true) { Socket connectionSocket = welcomeSocket.accept(); BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream())); DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream()); username = inFromClient.readLine(); System.out.println("\nUsername received: " + username); password = inFromClient.readLine(); System.out.println("\nPassword received: " + password); username1=username.toUpperCase(); password1=password.toUpperCase(); for(int i = 0; i<Login.length; i++) { if(Login[i][0].equals(username1) && Login[i][1].equals(password1)) { outToClient.writeBytes("Hello " + username1); outToClient.writeBytes("\nOther users registered on the server currently include: \n"); for(int k = 0; k<Login.length; k++) { outToClient.writeBytes(Login[k][0]); } } else { outToClient.writeBytes("Invalid Username and/or password.\n"); } } BufferedReader inFromClient2 = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream())); DataOutputStream outToClient2 = new DataOutputStream(connectionSocket.getOutputStream()); Command = inFromClient2.readLine(); System.out.println("\nCommand received: " + Command); if(Command.equals("listTranslations")) { outToClient2.writeBytes("English,Thai,Geordie,etc."); } else { if(Command.equals("getCost")) { outToClient2.writeBytes("£100\n"); } else { outToClient2.writeBytes("Invalid Command"); } } } } } 

这是我的客户:

 import java.io.*; import java.net.*; class TCPClient2 { public static void main(String argv[]) throws Exception { String userName; String passWord; String loginInfo; String loginInfo2; String loginInfo3; String command; String commandInfo; String commandInfo2; BufferedReader inFromUser = new BufferedReader( new InputStreamReader(System.in)); Socket clientSocket = new Socket("localhost", 6789); DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream()); BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); System.out.println("Username: "); userName = inFromUser.readLine(); outToServer.writeBytes(userName + "\n"); System.out.println("Password: "); passWord = inFromUser.readLine(); outToServer.writeBytes(passWord + "\n"); loginInfo = inFromServer.readLine(); System.out.println(loginInfo); loginInfo2 = inFromServer.readLine(); System.out.println(loginInfo2); loginInfo3 = inFromServer.readLine(); System.out.println(loginInfo3); System.out.println("Please enter a command: "); command = inFromUser.readLine(); outToServer.writeBytes(command); commandInfo = inFromServer.readLine(); System.out.println(commandInfo); commandInfo2 = inFromServer.readLine(); System.out.println(commandInfo); clientSocket.close(); } } 

这是我第一次在stackoverflow上问一个问题,但我过去经常浏览它。 所以我只是想对你提供的伟大社区说声谢谢。

我不确定这是否会对您有所帮助,但检查在每次writeBytes调用之后是否不必刷新以确实将数据输出到客户端。

尝试添加outToClient.flush();

这是我的评论的延续:

我就是这样做的,首先我要替换它: String[][] Login = {{"MATT","UNCP"},{"JOHN","UNCP"},{"CARL","UNCP"}}; 通过类似的东西:

 Map userDetails = new HashMap(); userDetails.put("MAT", "UNCP"); userDetails.put("JOHN","UNCP"); userDetails.put("CARL", "UNCP"); 

然后,而不是这个:

  for(int i = 0; i 

我会这样做:

 if (userDetails.get(username1).equals(password1)) { outToClient.writeBytes("Hello " + username1); outToClient.writeBytes("\nOther users registered on the server currently include: \n"); for (String str : userDetails.keySet() { outToClient.writeBytes(str); } } else { outToClient.writeBytes("Invalid Username and/or password.\n"); } 

我看到它的方式,系统正在工作并打印Invalid credentials字符串是因为,假设您提供这些登录详细信息: CARLUNCP ,您传递第二组凭据,因此您的循环将检查凭据将它们与第一组进行比较,由于它们不匹配,它将打印该消息。 在第二次迭代中,它将看到凭据匹配并将登录。

有关更多信息,请查看JavaDoc 。 除了通常的ListSet之外,HashMap是一个通常是一件好事。