Java—如何读取下一行并在自己的变量中分别存储多个数据?
我在将数据从一个客户机类传递到另一个服务器类时遇到了一个问题。我创建了变量来存储客户端发送给服务器的每个信息,它使用if语句,如果地址或密码不正确,则拒绝服务,否则拒绝服务 然而,我遇到了一个问题,当用户输入密码时;然后是地址。数据在第一轮自动传递。而不是客户端发送密码数据,并将数据存储在服务器的密码变量中。然后客户端发送地址,将数据存储在地址变量中。它只发送这两个变量,并将它们存储在一个变量中 我想显示:Java—如何读取下一行并在自己的变量中分别存储多个数据?,java,variables,network-programming,store,next,Java,Variables,Network Programming,Store,Next,我在将数据从一个客户机类传递到另一个服务器类时遇到了一个问题。我创建了变量来存储客户端发送给服务器的每个信息,它使用if语句,如果地址或密码不正确,则拒绝服务,否则拒绝服务 然而,我遇到了一个问题,当用户输入密码时;然后是地址。数据在第一轮自动传递。而不是客户端发送密码数据,并将数据存储在服务器的密码变量中。然后客户端发送地址,将数据存储在地址变量中。它只发送这两个变量,并将它们存储在一个变量中 我想显示: Password received: unlo91\ (made up password
Password received: unlo91\ (made up password)
Address received: localhost
Password received: unlo91\localhost (made up password)
Address received: null
cliPass = fromClient.readLine();
System.out.println("Client entered... " + cliPass );
cliAd = fromClient.readLine();
System.out.println("Client entered... " + cliAd);
System.out.println("Type password");
myPass = fromUser.readLine();
toServer.writeBytes(myPass);
System.out.println("Type address");
myAd = fromUser.readLine();
toServer.writeBytes(myAd);
相反,我得到:
Password received: unlo91\ (made up password)
Address received: localhost
Password received: unlo91\localhost (made up password)
Address received: null
cliPass = fromClient.readLine();
System.out.println("Client entered... " + cliPass );
cliAd = fromClient.readLine();
System.out.println("Client entered... " + cliAd);
System.out.println("Type password");
myPass = fromUser.readLine();
toServer.writeBytes(myPass);
System.out.println("Type address");
myAd = fromUser.readLine();
toServer.writeBytes(myAd);
是否有一种方法可以“对。客户端刚刚发送了密码。请将其存储在PW变量中。好的,现在不要存储在PW变量中,因为它已经在使用中(或已经使用过一次)。请转到下一个可用变量(地址)以存储下一个。”
服务器:
Password received: unlo91\ (made up password)
Address received: localhost
Password received: unlo91\localhost (made up password)
Address received: null
cliPass = fromClient.readLine();
System.out.println("Client entered... " + cliPass );
cliAd = fromClient.readLine();
System.out.println("Client entered... " + cliAd);
System.out.println("Type password");
myPass = fromUser.readLine();
toServer.writeBytes(myPass);
System.out.println("Type address");
myAd = fromUser.readLine();
toServer.writeBytes(myAd);
客户端:
Password received: unlo91\ (made up password)
Address received: localhost
Password received: unlo91\localhost (made up password)
Address received: null
cliPass = fromClient.readLine();
System.out.println("Client entered... " + cliPass );
cliAd = fromClient.readLine();
System.out.println("Client entered... " + cliAd);
System.out.println("Type password");
myPass = fromUser.readLine();
toServer.writeBytes(myPass);
System.out.println("Type address");
myAd = fromUser.readLine();
toServer.writeBytes(myAd);
使用ArrayList
ArrayList有一个方法,add
,它向集合的末尾添加一个新值。完成后,可以在ArrayList上使用for
或foreach
循环,并将每个值一次添加一个
如果需要存储一组字符串,但要将它们与名称关联,则需要一个HashMap
您可以在HashMap上执行.add(“用户名”、“汤姆”)
和.add(“密码”、“猎人12”)
,要获取值,您可以执行。获取(“用户名”)
并返回“汤姆”
使用数组列表
ArrayList有一个方法,add
,它向集合的末尾添加一个新值。完成后,可以在ArrayList上使用for
或foreach
循环,并将每个值一次添加一个
如果需要存储一组字符串,但要将它们与名称关联,则需要一个HashMap
您可以在HashMap上执行.add(“用户名”、“汤姆”)
和.add(“密码”、“猎人12”)
,要获取值,您可以执行。获取(“用户名”)
并返回“汤姆”
问题在于readline方法返回的字符串没有换行符 当您在服务器上使用它时,没有换行符,因此它将继续等待换行结束 在您的客户机上尝试以下操作:
System.out.println("Type password");
myPass = fromUser.readLine();
toServer.writeBytes(myPass + "\n");
System.out.println("Type address");
myAd = fromUser.readLine();
toServer.writeBytes(myAd + "\n");
问题是readline方法返回的字符串没有换行符 当您在服务器上使用它时,没有换行符,因此它将继续等待换行结束 在您的客户机上尝试以下操作:
System.out.println("Type password");
myPass = fromUser.readLine();
toServer.writeBytes(myPass + "\n");
System.out.println("Type address");
myAd = fromUser.readLine();
toServer.writeBytes(myAd + "\n");
你没有真正提出正确的问题,你的问题是由以前的疏忽造成的,如果你解决了它,你可以跳过这个问题 当您使用
fromUser.readLine()在客户端上读入该行时代码>,您收到的字符串将删除其行分隔符,如Javadocs中所述:
公共字符串readLine()引发IOException
读一行文字。一行被认为是由换行符('\n')、回车符('\r')或紧接着换行符的回车符中的任意一个终止的
返回:
包含行内容的字符串,不包括任何行终止字符,如果已到达流的结尾,则为null
因此,如果在将字符串发送到服务器之前将其重新添加到字符串中,如下所示:
System.out.println("Type password");
myPass = fromUser.readLine() + System.lineSeparator();
toServer.writeBytes(myPass);
System.out.println("Type address");
myAd = fromUser.readLine() + System.lineSeparator();
toServer.writeBytes(myAd);
您的服务器代码应该按预期工作,因为它们将再次作为单独的行计算
或者如果你真的想这样做,如果你有一个未知的变量数,你应该考虑<代码>地图>代码> < /p> 你不是在问正确的问题,你的问题是由先前的疏忽引起的,如果你解决了这个问题,你可以跳过这个问题。
当您使用
fromUser.readLine()在客户端上读入该行时代码>,您收到的字符串将删除其行分隔符,如Javadocs中所述:
公共字符串readLine()引发IOException
读一行文字。一行被认为是由换行符('\n')、回车符('\r')或紧接着换行符的回车符中的任意一个终止的
返回:
包含行内容的字符串,不包括任何行终止字符,如果已到达流的结尾,则为null
因此,如果在将字符串发送到服务器之前将其重新添加到字符串中,如下所示:
System.out.println("Type password");
myPass = fromUser.readLine() + System.lineSeparator();
toServer.writeBytes(myPass);
System.out.println("Type address");
myAd = fromUser.readLine() + System.lineSeparator();
toServer.writeBytes(myAd);
您的服务器代码应该按预期工作,因为它们将再次作为单独的行计算
或者如果你真的想这样做,如果你有一个未知的变量数,你应该考虑<代码> map <代码>。
看起来你需要一个某种数据结构类的集合:看起来你需要一个数据结构类的集合:谢谢。行分隔器完成了这项工作。信息也很好,谢谢。行分隔器完成了这项工作。信息也不错。