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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 spiderman 于 2013-11-8 21:36 编辑
  1. import java.io.*;
  2. import java.net.*;
  3. class  LoginClient
  4. {
  5.         public static void main(String[] args) throws Exception
  6.         {
  7.                 Socket s=new Socket("192.168.1.101",10009);

  8.                 BufferedReader br=
  9.                         new BufferedReader(new InputStreamReader(System.in));

  10.                 BufferedReader sbr=
  11.                         new BufferedReader(new InputStreamReader(s.getInputStream()));
  12.                
  13.                 PrintWriter pw=new PrintWriter(s.getOutputStream(),true);

  14.                 for(int i=0;i<3;i++)
  15.                 {
  16.                         String name=br.readLine();                        
  17.                         if(name==null)
  18.                         break;
  19.                         pw.println(name);
  20.                         String info=sbr.readLine();
  21.                         System.out.println("服务器:"+info);        
  22.                         if(info.contains("欢迎"))
  23.                         break;
  24.                 }
  25.                 br.close();
  26.                 s.close();
  27.         }
  28. }




  29. class LoginServer
  30. {
  31.         public static void main(String[] args) throws Exception
  32.         {
  33.                 ServerSocket ss=new ServerSocket(10009);
  34.                 while(true)
  35.                 {
  36.                         Socket s=ss.accept();
  37.                         new Thread(new UserLogin(s)).start();               
  38.                 }

  39.         }
  40. }







  41. class UserLogin implements Runnable
  42. {
  43.         private Socket s=null;
  44.         
  45.         UserLogin(Socket s)
  46.         {
  47.         this.s=s;
  48.         }

  49.         public void run()
  50.         {
  51.         String ip=s.getInetAddress().getHostAddress();
  52.         System.out.println(ip+"...connected");
  53.         
  54.                
  55.                         BufferedReader sbr=null;
  56.                         PrintWriter spw=null;               
  57.                         try
  58.                         {
  59.                                 sbr=
  60.                                 new BufferedReader(new InputStreamReader(s.getInputStream()));
  61.                                 spw=
  62.                                 new PrintWriter(s.getOutputStream(),true);
  63.                         }
  64.                         catch (Exception e)
  65.                         {
  66.                                 throw new RuntimeException(ip+"Socket输入输出流出现问题");
  67.                         }
  68.                
  69.         
  70.         for(int i=0;i<3;i++)
  71.                 {                                
  72.                         BufferedReader br=null;
  73.                         try
  74.                         {
  75.                                 br=new BufferedReader(new FileReader("UserName.txt"));
  76.                         }
  77.                         catch (Exception e)
  78.                         {
  79.                         
  80.                         }


  81.                         String name=null;

  82.                         try
  83.                         {
  84.                                 name=sbr.readLine();
  85.                                 
  86.                         }
  87.                         catch (Exception e)
  88.                         {
  89.                         throw new RuntimeException("输入流读取出现问题1");
  90.                         }        




  91. //if(name==null)
  92. //break;
  93.                         String line=null;               
  94.                         boolean flag=false;


  95.                         try
  96.                         {
  97.                                 while((line=br.readLine())!=null)
  98.                                 {               
  99.                                         System.out.println(line);
  100.                                         if(line.equals(name))
  101.                                         {
  102.                                                         
  103.                                                         flag=true;
  104.                                                         break;
  105.                                         }                        
  106.                                 }
  107.                         }
  108.                         catch (Exception e)
  109.                         {
  110.                                 throw new RuntimeException("输入流读取出现问题2");
  111.                         }

  112.                         
  113.                         if(flag)
  114.                         {
  115.                                 System.out.println(name+"登陆成功");               
  116.                                 spw.println("登陆成功--欢迎");
  117.                                 break;
  118.                         }
  119.                         else
  120.                                 System.out.println(name+"尝试登陆");
  121.                                 spw.println(name+"登陆失败");        
  122.                

  123.                

  124.         
  125.                         try
  126.                         {
  127.                                         br.close();
  128.                         }
  129.                         catch (Exception e)
  130.                         {
  131.                                 throw new RuntimeException("关闭异常1");
  132.                         }
  133.                


  134.                 }
  135.                

  136.         
  137.                         try
  138.                         {
  139.                                         s.close();
  140.                         }
  141.                         catch (Exception e)
  142.                         {
  143.                                 throw new RuntimeException("关闭异常2");
  144.                         }

  145.         }
  146. }
复制代码
为了更好的表达我的问题,我将全部代码复制如上。同时为了发现异常发生的位置,我将服务端的代码分别进行了try.我的问题是:
1.用户在客户端进行了ctrl+c操作,按照毕老师视频里的展示,当不判断返回为null的情况下,则会在服务端提示null尝试登陆两次失败,但是我的实际演示情况是——有时会像毕老师演示的结果,有时则会在服务端socket输入流进行readLine()操作时会报异常,也就是说,不一定会发生什么情况,随即的。为什么会发生这种情况呢?(PS:我用的是jdk1.7,会不会跟我的jdk版本有关系?)
2.还是1的问题,按照我的正常理解,当客户端把socket资源关闭了以后,服务端再读取socket的输入流理所当然的会报异常,因为数据源已经关闭了,为什么在毕老师的视频里还会返回null呢?



评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1 赞一个!

查看全部评分

1 个回复

倒序浏览
你看看这个,好像我也只修改了IP地址。我这也是1.7的,是对的啊。
package networkprogramming;

/*
客户端通过键盘录入用户名。
服务器对这个用户名进行校验。

如果该用户存在,在服务端显示xxx,已登录。
并在客户端显示xxx ,欢迎光临。

如果该用户存在,在服务端显示xxx,尝试登陆。
并在客户端显示xxx,该用户不存在。

最多就登陆三次。

*/

import java.io.*;
import java.net.*;

class  LoginClient
{
        public static void main(String[] args) throws Exception {
                Socket s=new Socket("192.168.0.101",10009);
                BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
                BufferedReader sbr= new BufferedReader(new InputStreamReader(s.getInputStream()));
                PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
        for(int i=0;i<3;i++) {
                String name=br.readLine();                        
            if(name==null)
                    break;
            pw.println(name);
            String info=sbr.readLine();
            System.out.println("服务器:"+info);        
            if(info.contains("欢迎"))
                 break;
        }
        br.close();
        s.close();
    }
}

class LoginServer
{
        public static void main(String[] args) throws Exception {
                ServerSocket ss=new ServerSocket(10009);
                while(true) {
                        Socket s=ss.accept();
                        new Thread(new UserLogin(s)).start();
                }
        }
}

class UserLogin implements Runnable {
        private Socket s=null;      
        UserLogin(Socket s) {
                this.s=s;
        }
        public void run() {
                String ip=s.getInetAddress().getHostAddress();
        System.out.println(ip+"...connected");                       
        BufferedReader sbr=null;
        PrintWriter spw=null;               
        try {
                sbr=new BufferedReader(new InputStreamReader(s.getInputStream()));
                spw= new PrintWriter(s.getOutputStream(),true);
        } catch (Exception e) {
                throw new RuntimeException(ip+"Socket输入输出流出现问题");
        }
        for(int i=0;i<3;i++) {
                BufferedReader br=null;
                try {
                        br=new BufferedReader(new FileReader("UserName.txt"));
                } catch (Exception e) {                     
                }
                String name=null;
                try {
                        name=sbr.readLine();                              
                } catch (Exception e) {
                        throw new RuntimeException("输入流读取出现问题1");
                }        
                //if(name==null)
                //break;
                String line=null;               
                boolean flag=false;
                try {
                        while((line=br.readLine())!=null) {               
                                System.out.println(line);
                                if(line.equals(name)) {                                                        
                                        flag=true;
                                        break;
                                }                        
                        }
                } catch (Exception e) {
                        throw new RuntimeException("输入流读取出现问题2");
                }
                if(flag) {
                        System.out.println(name+"登陆成功");
                        spw.println("登陆成功--欢迎" + name);
                        break;
                } else {
                        System.out.println(name+"尝试登陆");
                        spw.println(name+"登陆失败");
                }
                try {
                        br.close();
                } catch (Exception e) {
                        throw new RuntimeException("关闭异常1");
                }              
        }            
        try {
                s.close();
        } catch (Exception e) {
                throw new RuntimeException("关闭异常2");
        }
        }
}

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马