A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王宝龙 中级黑马   /  2012-10-3 17:54  /  1695 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王宝龙 于 2012-10-3 19:38 编辑


正常的情况是我们每输入一次,服务端会去校验一次,如果正确就结束,如果校验三次都是错误的客户端程序也结束。
在程序的29行if(info.contains("欢迎"));
这个语句后正常不应该有分号!
有了分号就会产生这样结果:你如果输入的是正确的用户名,就会正常结束,但是如果输入一次是错误的只能输入一次
客户端也会结束,服务端就会输出一个你的错的那个name,和两个null;
因为一个分号结果会差好多
但是没搞明白为什么会有这样的差异

  1. import java.io.*;
  2. import java.net.*;

  3. class LoginClient
  4. {
  5.         public static void main(String[] arge) throws Exception
  6.         {
  7.                 Socket s = new Socket("192.168.0.103",10007);
  8.                
  9.                 BufferedReader bufr =
  10.                         new BufferedReader(new InputStreamReader(System.in));
  11.                         
  12.                 PrintWriter out = new PrintWriter(s.getOutputStream(),true);
  13.                
  14.                 BufferedReader bufIn =
  15.                         new BufferedReader(new InputStreamReader(s.getInputStream()));
  16.                         
  17.                         
  18.                 for(int x=0; x<3; x++)
  19.                 {
  20.                         String line = bufr.readLine();
  21.                         if(line==null)
  22.                                 break;
  23.                         out.println(line);
  24.                         
  25.                         String info = bufIn.readLine();
  26.                         System.out.println("info:"+info);
  27.                         if(info.contains("欢迎"));//<font color="red">问题就在这</font>
  28.                                 break;
  29.                 }
  30.                 bufr.close();
  31.                 s.close();
  32.         }
  33. }
  34. class UserThread implements Runnable
  35. {
  36.         private Socket s;
  37.         UserThread(Socket s)
  38.         {
  39.                 this.s = s;
  40.         }
  41.         public void run()
  42.         {
  43.                 String ip = s.getInetAddress().getHostAddress();
  44.                 System.out.println(ip);
  45.                 try
  46.                 {
  47.                         for(int x=0;x<3;x++)
  48.                         {
  49.                                 BufferedReader bufIn =
  50.                                         new BufferedReader(new InputStreamReader(s.getInputStream()));
  51.                                 String name = bufIn.readLine();
  52.                                 if(name==null)
  53.                                         break;
  54.                                 
  55.                                 BufferedReader bufr =
  56.                                         new BufferedReader(new FileReader("user.txt"));
  57.                                        
  58.                                 PrintWriter out = new PrintWriter(s.getOutputStream(),true);        
  59.                                        
  60.                                 String line = null;
  61.                                 
  62.                                 boolean flag = false;
  63.                                 while((line=bufr.readLine())!=null)
  64.                                 {
  65.                                         if(line.equals(name))
  66.                                         {
  67.                                                 flag = true;
  68.                                                 break;
  69.                                         }        
  70.                                 }
  71.                                 if(flag)
  72.                                 {
  73.                                         System.out.println(name+",已登录");
  74.                                         out.println(name+",欢迎光临");
  75.                                         break;
  76.                                 }
  77.                                 else
  78.                                 {
  79.                                         System.out.println(name+",尝试登录");
  80.                                         out.println(name+",用户名不存在");
  81.                                 }
  82.                         }
  83.                         s.close();
  84.                 }
  85.                 catch(Exception e)
  86.                 {
  87.                         throw new RuntimeException("登录超时");
  88.                 }
  89.         }
  90. }

  91. class LoginServer
  92. {
  93.         public static void main(String[] arge) throws Exception
  94.         {
  95.                 ServerSocket ss = new ServerSocket(10007);
  96.                
  97.                 while(true)
  98.                 {
  99.                         Socket s = ss.accept();
  100.                         
  101.                         new Thread(new UserThread(s)).start();
  102.                 }
  103.         }
  104. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

3 个回复

倒序浏览
你在if语句后面加上了分号,就相当于if语句结束了,这样的话你的break语句就不再受if语句的限制了,每次执行for循环,都会执行break语句,就导致了for循环运行一次,程序就会退出。所以要么不加分号,要么把分号和break都放到一个大括号里面,再跟到if语句后面

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
for(int x=0; x<3; x++)

                {

                        String line = bufr.readLine();

                        if(line==null)

                                break;

                        out.println(line);

                        

                        String info = bufIn.readLine();

                        System.out.println("info:"+info);

                        if(info.contains("欢迎"));//<font color="red">问题就在这</font>

                                break;

                }




如果有;      
if(info.contains("欢迎"));
                break;
相当于
if(info.contains("欢迎")){} break  都会被执行跳出For循环
如果没有;     
if(info.contains("欢迎"))
                break;
相当于
if(info.contains("欢迎"))  break;只有if 为真才执行
{
                break;
}
回复 使用道具 举报
有点看不懂
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马