Java -如何读取下一行并将多个数据分别存储在自己的变量中?

5lhxktic  于 2023-05-21  发布在  Java
关注(0)|答案(3)|浏览(134)

我在从一个客户端类向另一个服务器类传递数据时遇到了一个问题。我创建了变量来存储客户端发送到服务器的每个信息,它使用if语句,如果地址或密码不正确,则拒绝服务,否则拒绝服务。
然而,我遇到了一个问题,当用户输入密码;然后是地址。数据在第一轮自动传递。代替客户端发送密码数据,并将数据存储在服务器端的密码变量中。然后客户端发送地址,将数据存储在地址变量中。它只是发送两者,并将两者存储在一个变量中。

我要显示:

Password received: unlo91\ (made up password)
Address received: localhost

相反,我得到:

Password received: unlo91\localhost (made up password)
Address received: null

有没有一种方法,“对。客户端刚刚发送了密码。将其存储在PW var.好的,现在不要存储在PW var中,因为它已经在使用中(或者已经使用过一次)。移动到下一个可用变量(地址)以存储下一个。”

服务器:

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);
umuewwlo

umuewwlo1#

你没有真正问对问题,你的问题是由以前的疏忽造成的,如果你解决了它,你就可以跳过这个问题。
当你在客户端用fromUser.readLine();读入这一行时,你收到的String将删除它的行分隔符,如Javadocs中所述:
public String readLine()抛出IOException
读一行文字。一行被认为是以换行符('\n')、回车符('\r')或回车后紧跟着换行符的任何一种方式结束的。

返回:包含行内容的String,不包括任何行终止字符,如果已到达流的末尾,则为null

因此,如果在将字符串发送到服务器之前将它们添加回String,如下所示:

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<String, String>,如果你有一个未知数量的变量。

l7wslrjt

l7wslrjt2#

使用ArrayList<String>
ArrayList有一个方法add,它将一个新值添加到集合的末尾。完成后,您可以在ArrayList上使用forforeach循环,并一次一个地获取添加到其中的每个值。
http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html
如果你需要存储一堆字符串,但要将它们与名称相关联,那么你需要一个HashMap<String,String>
你可以在HashMap上执行.add("username", "tom").add("password", "hunter12"),为了得到一个值,你可以执行.get("username"),然后得到“tom”。
http://docs.oracle.com/javase/6/docs/api/java/util/HashMap.html

yc0p9oo0

yc0p9oo03#

问题是readline方法返回的字符串没有换行符。
http://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html#readLine%28%29
当你在服务器上使用它时,没有换行符,所以它会继续等待行尾。
在你的客户端上试试这个:

System.out.println("Type password");
myPass = fromUser.readLine();
toServer.writeBytes(myPass + "\n");

System.out.println("Type address");
myAd = fromUser.readLine();
toServer.writeBytes(myAd + "\n");

相关问题