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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© yufeng47 中级黑马   /  2013-4-9 14:38  /  1759 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. import java.io.*;
  2. import java.net.*;
  3. //客户端
  4. class LoginClient
  5. {
  6.         public static void main(String[] args) throws Exception
  7.         {
  8.                 //创建客户端的socket服务。指定目的主机和端口
  9.                 Socket s = new Socket("psy",10004);
  10.                 //创建输入流
  11.                 BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
  12.                 //获取客户端输出流
  13.                 PrintWriter out = new PrintWriter(s.getOutputStream(),true);
  14.                 //获取客户端输入流
  15.                 BufferedReader bufIn =
  16.                         new BufferedReader(new InputStreamReader(s.getInputStream()));
  17.                
  18.                 for (int i=0; i<3; i++)
  19.                 {
  20.                         String line = bufr.readLine();
  21.                         if (line==null)
  22.                                 break;        //跳出当前循环,执行循环体以后的内容
  23.                         if (line.equals(""))
  24.                         {
  25.                                 System.out.println("用户名不能为空!");
  26.                                 continue;//跳出当前循环,继续执行下一次循环
  27.                         }
  28.                         out.println(line);
  29.                        
  30.                         String info = bufIn.readLine();                               
  31.                         System.out.println("客户端:"+info);
  32.                         if (info.contains("欢迎"))
  33.                                 break;       
  34.                 }

  35.                 bufr.close();
  36.                 s.close();
  37.         }
  38. }
  39. //将服务端处理客户端数据的过程封装进线程
  40. class UserThread implements Runnable
  41. {
  42.         private Socket s;
  43.         UserThread(Socket s)
  44.         {
  45.                 this.s = s;
  46.         }
  47.         public void run()
  48.         {
  49.                 String ip = s.getInetAddress().getHostAddress();
  50.                 System.out.println(ip+"...connected");
  51.                 try
  52.                 {
  53.                         for (int x=0; x<3; x++)
  54.                         {
  55.                                 //获取服务端输入流
  56.                                 BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));       
  57.                                 String name = bufIn.readLine();
  58.                                 if(name==null)
  59.                                         break;
  60.                                 //创建输入流关联用户文件
  61.                                 BufferedReader bufr = new BufferedReader(new FileReader("user.txt"));
  62.                                 //获取服务端输出流
  63.                                 PrintWriter out = new PrintWriter(s.getOutputStream(),true);

  64.                                 boolean flag = false;
  65.                                 String line = null;
  66.                                 while ((line=bufr.readLine())!=null)
  67.                                 {
  68.                                         if (line.equals(name))
  69.                                         {
  70.                                                 flag = true;
  71.                                                 break;
  72.                                         }
  73.                                 }
  74.                                 if (flag)
  75.                                 {
  76.                                         System.out.println("服务端:"+name+",已登录");
  77.                                         out.println(name+",欢迎光临!");
  78.                                         /*
  79.                                         问:第60行的break与该处的break都可达到一个目的跳出循环关闭客户端,而且他们之中只要满足第60行
  80.                                                 break,就会达到关闭客户端的目的,为什么还得在这个地方实现break?
  81.                                         答:目的是节约资源,提高服务端性能。
  82.                                                 若只是第60行有break,也能达到关闭客户端的目的。但是会导致即使满足了这个地方的条件,
  83.                                                 还得要多执行一段时间,直到下一次读到第60行的break才跳出关闭客户端流。
  84.                                                 若用户太多的情况下,不利于服务端优化,高效释放资源。
  85.                                         break存在的必要:为了跳出当前循环,以便关闭客户端,释放资源。
  86.                                         */
  87.                                         break;        //或者用s.close()代替break。       
  88.                                 }
  89.                                 else
  90.                                 {
  91.                                         System.out.println("服务端:"+name+",尝试登录");
  92.                                         out.println("用户名"+name+"不存在!");
  93.                                 }
  94.                         }       
  95.                         System.out.println("关闭客户端链接");
  96.                         s.close();
  97.                 }               
  98.                 catch (Exception e)
  99.                 {
  100.                         throw new RuntimeException(ip+",校验失败");
  101.                 }
  102.         }
  103. }
  104. //服务端
  105. class LoginServer
  106. {
  107.         public static void main(String[] args) throws Exception
  108.         {
  109.                 //创建服务端,监听端口10004
  110.                 ServerSocket ss = new ServerSocket(10004);
  111.                 while (true)
  112.                 {
  113.                         //获取客户端(可获取多个不同客户端发来的数据)
  114.                         Socket s = ss.accept();
  115.                         //创建线程,将客户端引用作为值传递给线程构造函数。
  116.                         //目的是保证不同的客户端,在服务端都享有一个独立的线程,互不影响,并发执行。
  117.                         new Thread(new UserThread(s)).start();
  118.                 }
  119.         }
  120. }
复制代码

3 个回复

倒序浏览
问题在哪儿。。 这是分享帖么~
回复 使用道具 举报
陈丽莉 发表于 2013-4-9 14:58
问题在哪儿。。 这是分享帖么~

问了 不过不是在开头和结尾 实在程序段中间:shutup:
回复 使用道具 举报
yufeng47 发表于 2013-4-9 16:03
问了 不过不是在开头和结尾 实在程序段中间

中间那段你不是自己回答了吗?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马