这是我第一次制作 TCP客户端/服务器程序。我应该创建一个简单的Java客户端和服务器程序,要求客户端提供用户名和密码。从那里服务器检查其用户数据库(我试图使用覆盖维数组创建)以查看是否存在匹配并向客户端返回一条消息“Hello”(用户名),然后告诉用户所有其他服务器上的注册用户。
我的特定问题然而,每当我运行这两个时,当我到达该部分时,服务器应该通过循环,所有显示的是“其他在服务器上注册的用户目前包括:MATTCARLJOHN服务器上注册的其他用户目前包括:MATTCARLJOHN服务器上注册的其他用户目前包括:MATTCARLJOHN“。
似乎我的服务器完全忽略了我的for循环和if语句,它应该检查身份验证并直接跳转到该循环,无论我在客户端输入我的用户名和密码是什么。
以下是两个程序: 客户
import java.io.*;
import java.net.*;
class TCPClient2
{
public static void main(String argv[]) throws Exception
{
String userName;
String passWord;
String loginInfo;
String loginInfo2;
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);
clientSocket.close();
}
}
和服务器
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 username;
String username1;
String password;
String password1;
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("Username received: " + username);
password = inFromClient.readLine();
System.out.println("Password received: " + password);
username1=username.toUpperCase() + '\n';
password1=password.toUpperCase() + '\n';
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("Other users registered on the server currently include: ");
for(int k = 0; k<Login.length; k++){
outToClient.writeBytes(Login[k][0]);}
else
outToClient.writeBytes("Invalid Username and/or password.");
}
}
}
}
}
任何帮助都会受到高度赞赏,这是我第一次在网站上发帖,我对网络和Java一般都很陌生,所以如果我的问题看起来很混乱,请原谅我。
谢谢。
答案 0 :(得分:1)
您要向username1
和password1
添加换行符。这些换行符不存在于硬编码的登录凭据("MATT","UNCP"
)中,因此比较...
if(Login[i][0].equals(username1) && Login[i][1].equals(password1)){
永远不会成功。
只需忽略username1
和password1
的换行符(至少在if
之后)。
哦,不要忘记所有邮件的换行符,例如:
outToClient.writeBytes("Invalid Username and/or password.\n");
// /
// added the \n
答案 1 :(得分:0)
当我运行代码时,代码实际上似乎对我有用。在客户端上看到:
$ java TCPClient -classpath .
Username:
blah
Password:
blah
在服务器上我看到:
$ java TCPServer -classpath .
Username received: blah
Password received: blah