【问题标题】:Java - How to read next line and store multiple data separately in their own variable?Java - 如何读取下一行并将多个数据分别存储在自己的变量中?
【发布时间】:2013-03-02 02:56:14
【问题描述】:

我在将数据从一个客户端类传递到另一个服务器类时遇到了问题。我创建了变量来存储客户端发送到服务器的每个信息,如果地址或密码不正确,它使用 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);

【问题讨论】:

标签: java variables network-programming store next


【解决方案1】:

您实际上并没有问对正确的问题,您遇到的问题是由之前的疏忽造成的,如果您解决了这个问题,您可以跳过这个问题。

当您在客户端上使用fromUser.readLine(); 读取该行时,您收到的字符串将删除其行分隔符,如 Javadocs 中所述:

public String 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<String, String>

【讨论】:

  • 谢谢。行分隔符完成了这项工作。很好的信息。
【解决方案2】:

使用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

【讨论】:

    【解决方案3】:

    问题是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");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-21
      • 1970-01-01
      • 1970-01-01
      • 2017-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多