我正在学习Java中FTP客户端和服务器编程的基础知识。我现在试图通过使用txt文件将注册的用户名从客户端存储到服务器中来实现一个非常简单的登录系统。
但是,我发现了一个问题,它只会读取文本文件的第一个注册行,即使它已经显示在控制台中注册,我仍然会得到无效用户名的结果。
我试图通过使用读取线缓冲读取器来修复错误,据说将每行读入txt文件,但我仍然卡住了。有什么建议我可以遵循吗?非常感谢你帮助我。
截图
FTPClient.java
class FTPClient
{
public static void main(String args[]) throws Exception
{
Socket soc=new Socket("127.0.0.1",5217);
transferfileClient t=new transferfileClient(soc);
t.userLogin();
}
}
class transferfileClient
{
Socket ClientSoc;
DataInputStream din;
DataOutputStream dout;
BufferedReader br;
transferfileClient(Socket soc)
{
try
{
ClientSoc=soc;
din=new DataInputStream(ClientSoc.getInputStream());
dout=new DataOutputStream(ClientSoc.getOutputStream());
br=new BufferedReader(new InputStreamReader(System.in));
}
catch(Exception ex)
{
}
}
void SendFile() throws Exception
{
//Send File from Client to Server
}
public void userLogin() throws Exception{
System.out.println("Press 1 to LOGIN or 2 to CREATE a new account");
System.out.print("\nEnter Choice :");
int choice;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
choice = Integer.parseInt(br.readLine());
if(choice==1)
{
validateUser();
}
else if(choice==2)
{
writeFileIO();
userBack();
}
}
void userBack() throws Exception {
userLogin();
}
void validateUser() throws Exception{
BufferedReader getIt = new BufferedReader(new InputStreamReader(System.in));
String userName = "";
try{
FileInputStream fstream = new FileInputStream("../FTPServer/userInfo.txt");
DataInputStream in = new DataInputStream(fstream);
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String strLine;
System.out.println("Enter your username");
userName = getIt.readLine();
while ((strLine = br.readLine()) != null){
if (userName.equals(strLine)){
System.out.print("Successful Login\n");
displayMenu();
}
else{
System.out.println("Invalid Username");
userBack();
}
}
in.close();
} catch (Exception e) {//Catch exception if any
System.out.println("\nError in validate user");
}
}
//Store new username into text file
public void writeFileIO()
{
while(true){
System.out.print("Enter your new username: ");
Scanner scan = new Scanner(System.in);
String text = scan.nextLine();
FileWriter fWriter = null;
BufferedWriter writer = null;
try{
fWriter = new FileWriter("../FTPServer/userInfo.txt", true);
writer = new BufferedWriter(fWriter);
writer.write(text);
writer.newLine();
writer.close();
System.out.println("Your new username has been created.");
return;
}
catch (Exception e) {
System.out.println("Error!");
}
}
//Successful login - show display menu for file transfer
public void displayMenu() throws Exception
{
while(true)
{
System.out.println("Files in directory");
System.out.println("=========================");
System.out.println("[ MENU ]");
System.out.println("1. Upload File");
System.out.println("2. Download File");
System.out.println("3. Delete File");
System.out.println("4. Exit");
System.out.print("\nEnter Choice :");
int menuchoice;
menuchoice=Integer.parseInt(br.readLine());
if(menuchoice==1)
{
dout.writeUTF("SEND");
SendFile();
}
else if(menuchoice==2)
{
dout.writeUTF("GET");
ReceiveFile();
}
else if(menuchoice==3)
{
dout.writeUTF("DEL");
}
else
{
dout.writeUTF("DISCONNECT");
System.exit(1);
}
}
}
}
答案 0 :(得分:1)
诀窍在于validateUser函数:
将else语句放在while循环之外:
原因: - while循环运行,它检查文本文件中的第一行,它失败然后落入' else' ,然后调用userBack
函数,意味着未检查文本文件的其余部分。
void validateUser() throws Exception{
BufferedReader getIt = new BufferedReader(new InputStreamReader(System.in));
String userName = "";
try{
FileInputStream fstream = new FileInputStream("../FTPServer/userInfo.txt");
DataInputStream in = new DataInputStream(fstream);
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String strLine;
System.out.println("Enter your username");
userName = getIt.readLine();
while ((strLine = br.readLine()) != null){
if (userName.equals(strLine)){
System.out.print("Successful Login\n");
displayMenu();
}
}
System.out.println("Invalid Username");
userBack();
in.close();
} catch (Exception e) {//Catch exception if any
System.out.println("\nError in validate user");
}