我在从一个客户端类向另一个服务器类传递数据时遇到了一个问题。我创建了变量来存储客户端发送到服务器的每个信息,它使用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);
3条答案
按热度按时间umuewwlo1#
你没有真正问对问题,你的问题是由以前的疏忽造成的,如果你解决了它,你就可以跳过这个问题。
当你在客户端用
fromUser.readLine();
读入这一行时,你收到的String将删除它的行分隔符,如Javadocs中所述:public String readLine()抛出IOException
读一行文字。一行被认为是以换行符('\n')、回车符('\r')或回车后紧跟着换行符的任何一种方式结束的。
返回:包含行内容的String,不包括任何行终止字符,如果已到达流的末尾,则为null
因此,如果在将字符串发送到服务器之前将它们添加回String,如下所示:
您的服务器代码应该可以按预期工作,因为它们将再次被计为单独的行。
或者,如果你真的想这样做,你应该考虑一个
Map<String, String>
,如果你有一个未知数量的变量。l7wslrjt2#
使用
ArrayList<String>
。ArrayList有一个方法
add
,它将一个新值添加到集合的末尾。完成后,您可以在ArrayList上使用for
或foreach
循环,并一次一个地获取添加到其中的每个值。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
yc0p9oo03#
问题是readline方法返回的字符串没有换行符。
http://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html#readLine%28%29
当你在服务器上使用它时,没有换行符,所以它会继续等待行尾。
在你的客户端上试试这个: