黑马程序员技术交流社区

标题: 求解决Socket问题。 [打印本页]

作者: L.I.F.E    时间: 2013-6-10 16:55
标题: 求解决Socket问题。
本帖最后由 L.I.F.E 于 2013-6-10 17:51 编辑
  1. /*
  2. 客户端通过键盘录入用户名。
  3. 服务端对这个用户名进行校验。

  4. 如果该用户名存在,在服务端显示XXX,已登录。
  5. 并在客户端显示XXX,欢迎光临。

  6. 如果该用户名不存在,在服务端显示XXX,尝试登录。
  7. 并在客户端显示XXX,该用户不存在。

  8. 最多登录三次。
  9. */

  10. import java.io.*;
  11. import java.net.*;

  12. class  LoginClient
  13. {
  14.         public static void main(String[] args) throws Exception
  15.         {
  16.                
  17.                 Socket s = new Socket("192.168.1.2",10010);
  18.                 //读取键盘输入
  19.                 BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
  20.                 //向socket流中写入数据
  21.                 PrintWriter out = new PrintWriter(s.getOutputStream(),true);
  22.                 //从socket流总读取数据。
  23.                 BufferedReader bufin = new BufferedReader(new InputStreamReader(s.getInputStream()));
  24.                 //判断
  25.                 for (int x = 0;x < 3 ; x++ )
  26.                 {

  27.                         String line = bufr.readLine();
  28.                         if (line == null)
  29.                         {
  30.                                 System.out.println("输入无效");
  31.                                 break;

  32.                         }
  33.                         out.println(line);
  34.                         String info = bufin.readLine();
  35.                         
  36.                         System.out.println("info:"+info);

  37.                         if (info.contains("欢迎"))
  38.                                 break;
  39.                         
  40.                 }
  41.                 bufr.close();
  42.                 s.close();
  43.         }
  44. }

  45. class UserThread implements Runnable
  46. {
  47.         private Socket s;
  48.         UserThread(Socket s)
  49.         {
  50.                 this.s = s;
  51.         }
  52.         public void run()
  53.         {
  54.                 //获取连接的客户端IP地址。
  55.                 String ip = s.getInetAddress().getHostAddress();
  56.                 System.out.println(ip+"....已连接");
  57.                 try
  58.                 {
  59.                         for (int i = 0; i < 3 ;i++ )
  60.                         {
  61.                                 //读取socket流中的数据。
  62.                                 BufferedReader bufin = new BufferedReader(new InputStreamReader(s.getInputStream()));

  63.                                 String name = bufin.readLine();
  64.                                 if (name == null)
  65.                                 {
  66.                                         break;
  67.                                 }
  68.                                 //读取本地文件中的数据
  69.                                 BufferedReader bufr = new BufferedReader(new FileReader("User.txt"));
  70.                                 //向socket流中反馈数据。
  71.                                 PrintWriter out = new PrintWriter(s.getOutputStream(),true);

  72.                                 String line = null;
  73.                                 boolean flag = false;
  74.                                 while ((line =bufr.readLine())!= null)
  75.                                 {
  76.                                         if(line.equals(name))
  77.                                         {
  78.                                                 flag = true;
  79.                                                 break;
  80.                                         }
  81.                                 }
  82.                                 if (flag)
  83.                                 {
  84.                                         System.out.println(name+"已登录");
  85.                                         out.println(name+",欢迎光临");
  86.                                         break;
  87.                                 }
  88.                                 else
  89.                                 {
  90.                                         System.out.println(name+"尝试登录");
  91.                                         out.println(name+",用户名不存在");

  92.                                 }
  93.                         }
  94.                         s.close();
  95.                 }
  96.                 catch (Exception e)
  97.                 {
  98.                         throw new RuntimeException("校验失败"+ip);
  99.                 }
  100.         }
  101. }



  102. class  LoginServer
  103. {
  104.         public static void main(String[] args) throws Exception
  105.         {
  106.                 ServerSocket ss = new ServerSocket(10010);
  107.                 while (true)
  108.                 {
  109.                         Socket s = ss.accept();
  110.                         new Thread(new UserThread(s)).start();
  111.                 }
  112.                
  113.         }
  114. }
复制代码
求解:在代码29行,判断输入次数时,如果输入为空,在流中的存储情况是什么啊?为什么直接回车,打印输出无效?并且如果Ctrl+c结束客户端程序,服务端是报异常。。。

直接回城的反馈.png (65.43 KB, 下载次数: 0)

直接回车的反馈信息

直接回车的反馈信息

Ctrl c的反馈.png (69.74 KB, 下载次数: 0)

ctrl+c的反馈信息

ctrl+c的反馈信息

作者: 李润根    时间: 2013-6-10 17:36
输入为空,就是NULL啊。直接回车,读取到的也是NULL。Ctrl+c是强制关闭程序,你强制关闭,当然会报异常了
作者: L.I.F.E    时间: 2013-6-10 17:44
问题是:回车,默认输入为空,但是下面输出语句:输入无效!没有打印。
再就是客户端ctrl+c,之后会向socket流中传入一个-1,服务器端会默认你输入的为空,并向客户端反馈信息。所以74行又判断了一次
作者: L.I.F.E    时间: 2013-6-10 17:54
是不是代码出问题了,我先去包饺子去!一会再看吧!
作者: 袁梦希    时间: 2013-6-11 09:00
你包饺子  我也想吃   嘿嘿
作者: 袁梦希    时间: 2013-6-12 19:15
等待大神回答




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