黑马程序员技术交流社区

标题: 客户端并发登陆问题 [打印本页]

作者: 汪小照    时间: 2012-9-18 15:24
标题: 客户端并发登陆问题
本帖最后由 汪小照 于 2012-9-19 18:37 编辑

这个程序实现的功能是:定义一个客户端与服务端,实现客户端的并发登陆。客户端与服务端最多只校验三次。存放用户的信息是记事本。
问题是:我第一次输入正确的用户名,服务端显示欢迎登陆,这是正常现象。为甚么在第二次输入的是正确用户名,服务端却显示正在尝试登陆,正常情况下,应该显示欢迎登陆,因为要校验三次啊。我仔细查找了程序,发现的确是校验了三次,麻烦各位坛友看一下,问题到底出现在哪?谢谢啊
  1. /*
  2. 客户端并发登陆
  3. */
  4. //客户端
  5. import java.net.*;
  6. import java.io.*;
  7. class TcpClient
  8. {
  9. public static void main(String [] args) throws Exception
  10. {
  11. Socket s = new Socket("127.0.0.1",30000);
  12. BufferedReader br = new BufferedReader(
  13. new InputStreamReader(System.in));
  14. PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
  15. BufferedReader brin = new BufferedReader(
  16. new InputStreamReader(s.getInputStream()));
  17. String line = null;
  18. for(int x=0;x<3;x++)
  19. {
  20. line = br.readLine();
  21. if(line==null)
  22. break;
  23. pw.println(line);

  24. String name = brin.readLine();
  25. System.out.println(name);
  26. if(name.contains("欢迎"))
  27. break;
  28. }
  29. br.close();
  30. s.close();
  31. }
  32. }

  33. //服务端
  34. class TcpServer
  35. {
  36. public static void main(String [] args) throws Exception
  37. {
  38. ServerSocket ss = new ServerSocket(30000);
  39. while(true)
  40. {
  41. Socket s = ss.accept();
  42. new Thread(new ServerThread(s)).start();
  43. }
  44. }
  45. }
  46. class ServerThread implements Runnable
  47. {
  48. private Socket s;
  49. ServerThread(Socket s)
  50. {
  51. this.s = s;
  52. }

  53. public void run()
  54. {
  55. String ip = s.getInetAddress().getHostAddress();
  56. System.out.println(ip+"......contected");
  57. try
  58. {
  59. BufferedReader brin = new BufferedReader(
  60. new InputStreamReader(s.getInputStream()));
  61. PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
  62. BufferedReader br = new BufferedReader(
  63. new FileReader("info.txt"));
  64. for(int x=0;x<3;x++)
  65. {
  66. String line =null;
  67. String name = brin.readLine();
  68. if(name==null) break;
  69. boolean flag=false;
  70. while((line=br.readLine())!=null)
  71. {
  72. if(line.equals(name))
  73. {
  74. flag = true;
  75. break;
  76. }
  77. }
  78. if(flag)
  79. {
  80. pw.println(name +" 欢迎登陆");
  81. System.out.println(name+" 已登录");
  82. break;
  83. }
  84. else
  85. {
  86. pw.println(name+" 用户名不存在");
  87. System.out.println(name+" 正在尝试登陆");
  88. }


  89. }
  90. s.close();
  91. }
  92. catch (Exception e)
  93. {
  94. e.printStackTrace();
  95. }
  96. }
  97. }
复制代码

4.jpg (11.81 KB, 下载次数: 41)

存放的用户信息

存放的用户信息

2.jpg (19.04 KB, 下载次数: 36)

服务端

服务端

3.jpg (12.76 KB, 下载次数: 36)

客户端

客户端

作者: 赵永康    时间: 2012-9-19 16:31
那你这个有没有遇到过输入错误的名字还能登陆的情况??个人认为应该是跟线程增加监听的问题,第一次假如有个正确的名字进来后把flag改为true后突然失去了执行权,然后进来一个错误的名字,此时flag等于true 也应该能登陆,你监听一个锁试试!!至于说正确的名字不能登陆,我也是没有想清楚啊??同样求解...
作者: 汪小照    时间: 2012-9-19 17:58
输入错误的名字就不能登录了
作者: 孔肖    时间: 2012-9-19 17:58
这里是由于你的服务端在校验的时候出错导致的,注意的点我已经在代码中用红色标出

class ServerThread implements Runnable
{
     private Socket s;
    ServerThread(Socket s)
    {
          this.s = s;
    }
   
    public void run()
   {
          String ip = s.getInetAddress().getHostAddress();
          System.out.println(ip+"......contected");
  
         try
        {
             for(int x=0;x<3;x++)
            {
                // 注意这里的获取客户端发来的信息的代码要一并放在for循环的内部
               //注意这里是循环判断,如果是输入错误的用户名,则在客户端是并未结束的,还要继续进行判断
              BufferedReader brin = new BufferedReader(new InputStreamReader(s.getInputStream()));
              PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
              BufferedReader br = new BufferedReader(new FileReader("info.txt"));
              String line =null;
              String name = brin.readLine();

             if(name==null)
                   break;

            boolean flag=false;

             while((line=br.readLine())!=null)
            {
                if(line.equals(name))
               {
                    flag = true;
                    break;
                }
           }
          if(flag)
         {
                pw.println(name +" 欢迎登陆");
               System.out.println(name+" 已登录");
                break;
          }
        else
       {
            pw.println(name+" 用户名不存在");
           System.out.println(name+" 正在尝试登陆");
       }
   }
   
   s.close();
  }
  catch (Exception e)
  {
   e.printStackTrace();
  }
}
}

作者: 汪小照    时间: 2012-9-19 18:04
放在for循环里面的确回归到了正常现象




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2