黑马程序员技术交流社区

标题: 这种异常该怎么查找? [打印本页]

作者: 李兆宁    时间: 2012-10-26 17:06
标题: 这种异常该怎么查找?
本帖最后由 李兆宁 于 2012-10-27 08:18 编辑
  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.100",10007);

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

  10.                 BufferedReader bufIn =
  11.                         new BufferedReader(new InputStreamReader(s.getInputStream()));

  12.                 PrintWriter out = new PrintWriter(s.getOutputStream(),true);

  13.                 for(int i=0; i<3; i++)
  14.                 {
  15.                         String name = bufr.readLine();
  16.                         if(name==null)
  17.                                 break;
  18.                         out.println(name);
  19.                         String line = bufIn.readLine();
  20.                         System.out.println(line);
  21.                         if(line.contains("欢迎"))
  22.                                 break;
  23.                 }
  24.                 bufr.close();
  25.                 s.close();
  26.         }
  27. }

  28. class LoginThread implements Runnable
  29. {
  30.         private Socket s;
  31.         LoginThread(Socket s)
  32.         {
  33.                 this.s = s;
  34.         }
  35.         public void run()
  36.         {
  37.                 String ip = s.getInetAddress().getHostAddress();
  38.                 System.out.println(ip+"...connected.");
  39.                 try
  40.                 {
  41.                         for(int i=0; i<3; i++)
  42.                         {
  43.                                 BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));

  44.                                 BufferedReader bufr = new BufferedReader(new FileReader("demo.txt"));

  45.                                 PrintWriter out = new PrintWriter(s.getOutputStream(),true);

  46.                                 String line = null;
  47.                                 String name = bufIn.readLine();
  48.                                 if(name==null)
  49.                                         break;
  50.                                 boolean flag = false;
  51.                                 while((line=bufr.readLine())!=null)
  52.                                 {
  53.                                         if(name.equals(line))
  54.                                         {
  55.                                                 flag = true;
  56.                                                 break;
  57.                                         }
  58.                                 }
  59.                                 if(flag)
  60.                                 {
  61.                                         System.out.println(name+",已登录");
  62.                                         out.println(name+",欢迎登陆.");
  63.                                         break;
  64.                                 }
  65.                                 else
  66.                                 {
  67.                                         System.out.println(name+",尝试登录");
  68.                                         out.println(name+" 用户名不存在,请重新输入");
  69.                                         break;
  70.                                 }
  71.                         }
  72.                         s.close();
  73.                 }
  74.                 catch (Exception e)
  75.                 {
  76.                         throw new RuntimeException(ip+"登录失败");
  77.                 }
  78.                

  79.         }
  80. }
  81. class LoginServer
  82. {
  83.         public static void main(String[] args) throws Exception
  84.         {
  85.                 ServerSocket ss = new ServerSocket(10007);
  86.                 while(true)
  87.                 {
  88.                         Socket s = ss.accept();

  89.                         new Thread(new LoginThread(s)).start();
  90.                 }
  91.         }
  92. }
复制代码
当输入不存在的用户名时,
第一次返回正常,第二次就报异常,
怎么查找问题所在,希望能给出您的解决步骤,
谢谢了!


作者: 黄邦荣    时间: 2012-10-26 17:44
大哥   你能把异常代代码片段给出来吗???
作者: 齐连涛    时间: 2012-10-26 18:09
就是啊 把报的异常贴出来啊
作者: 李靖    时间: 2012-10-26 18:38
终于找出来了,你通过测试的异常,很容易发现数据没有发过去,也就是说服务器端的监听出现了问题。
监听的循环应该在LoginThread中实现,而非是服务器的Socket中,同时也不应该关闭s.close();具体代码如下:
public void run() {
                String ip = s.getInetAddress().getHostAddress();
                System.out.println(ip + "...connected.");
                while(true){
               
                try {
                        BufferedReader bufIn = new BufferedReader(new InputStreamReader(s
                                        .getInputStream()));

                        BufferedReader bufr = new BufferedReader(new FileReader("demo.txt"));

                        PrintWriter out = new PrintWriter(s.getOutputStream(), true);
                        for (int i = 0; i < 3; i++) {

                                String line = null;
                                String name = bufIn.readLine();
                                if (name == null)
                                        break;
                                boolean flag = false;
                                while ((line = bufr.readLine()) != null) {
                                        if (name.equals(line)) {
                                                flag = true;
                                                break;
                                        }
                                }
                                if (flag) {
                                        System.out.println(name + ",已登录");
                                        out.println(name + ",欢迎登陆.");
                                        out.flush();
                                        break;
                                } else {
                                        System.out.println(name + ",尝试登录");
                                        out.println(name + " 用户名不存在,请重新输入");
                                        out.flush();
                                        break;
                                }
                        }
                        //out.close();
                        //bufIn.close();
                        //bufr.close();
                        // s.close();
                } catch (Exception e) {
                        throw new RuntimeException(ip + "登录失败");
                }
        }

作者: 李兆宁    时间: 2012-10-26 20:20
能不具体点,碰见这中异常,怎么一步步的分析呢?
作者: 李靖    时间: 2012-10-26 20:37
其实错误很好找,通过提示可以看到在23行出有错误,然后看到在看错误提示,可以看到是Socket错误,这个时候你要了解整个通信原理才行。23行是因为返回的是Null,这个时候可以发现out输出流已经完成,这个时候你要考虑的是,这个out真的写入了吗?然后通过看服务器端的提示,发现并没有写入,这个时候就要考虑服务器端是不是一直处于监听状态,这个时候要想的是让流保持一直联通,也就是这个while(true)应放在流的外面。如果放在线程的外面,是说每次请求的时候,都会创建一个线程,而实际这个程序只需要一个线程就可以了。如果创建了多个线程,就相当于有了多个Socket,这就违背了Socket的唯一性,客户端就不知道应该发送给哪个Socket了。其实遇到错误,没有什么特别好的办法,最好的就是单步调试,然后看看到底是哪一步出现了错误。
作者: 李兆宁    时间: 2012-10-27 08:17
谢谢诸位。。




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