黑马程序员技术交流社区

标题: 求援助--多客户端并发登录服务器程序(TCP),双方等待 [打印本页]

作者: jixusmile    时间: 2013-7-21 22:08
标题: 求援助--多客户端并发登录服务器程序(TCP),双方等待
本帖最后由 杨兴庭 于 2013-7-22 21:16 编辑

/*
程序运行情况:
1、开启服务器端
2、开启客户端,并输入用户名,按回车键后,客户端和服务器端都处于等待状态
*/

/*
该程序实现的是:
1、多客户端并发访问服务器端
2、客户端开启后输入用户名,若用户名存在,客户端显示欢迎信息,服务器端显示“xxx 已登录”
      否则,客户端显示用户“xxx不存在”,服务器端显示“xxx尝试登录服务器”
3、客户端尝试登录5次失败后程序结束
*/
import java.net.*;
import java.io.*;
class LoginClient
{
        public static void main(String[] args) throws Exception
        {
                Socket s=new Socket("LocalHost",12007);
                BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
                PrintWriter bufout=new PrintWriter(s.getOutputStream());
                BufferedReader bufin=new BufferedReader(new InputStreamReader(s.getInputStream()));
                for(int i=0;i<5;i++)
                {
                        String line=bufr.readLine();
                        //System.out.println(line);
                        if(line==null)
                                break;
                        bufout.println(line);
                        //System.out.println(line);
                        String info=bufin.readLine();
                        System.out.println("info"+info);
                        if(info.contains("欢迎"))                                
                                break;
                }        
                bufr.close();
                s.close();
        }
}
class ThreadLogin implements Runnable
{
        private Socket s;
        ThreadLogin(Socket s)
        {
                this.s=s;
        }
        public void run()
        {
                String ip=s.getInetAddress().getHostAddress();
                System.out.println(ip+"....connected");
                try
                {        
                        for(int i=0;i<5;i++)
                        {
                                BufferedReader bufin=new BufferedReader(new InputStreamReader(s.getInputStream()));
                                System.out.println(bufin.readLine());
                                System.out.println("shui");
                                BufferedReader bufr=new BufferedReader(new FileReader("UserName.txt"));
                                PrintWriter bufout=new PrintWriter(s.getOutputStream());
                                
                                String name=bufin.readLine();  

                                

                                String line=null;
                                boolean flag=false;
                                while((line=bufr.readLine())!=null)
                                {
                                        if(line.equals(name))
                                        {
                                                flag=true;
                                                break;
                                        }        
                                }
                                if(flag)
                                {
                                        System.out.println(name+"已登录");
                                        bufout.println(name+":欢迎登录");
                                        break;
                                }
                                else
                                        System.out.println(name+"尝试登录服务器");
                                        bufout.println(name+"不存在");
                                       
                        }
                        s.close();
                }
                catch (Exception e)
                {
                        throw new RuntimeException(ip+"校验失败");
                }
        }
}

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



作者: 张洪慊    时间: 2013-7-21 22:38
已测试:
  1. import java.net.*;
  2. import java.io.*;
  3. class LoginClient
  4. {
  5.          public static void main(String[] args) throws Exception
  6.          {
  7.                  Socket s=new Socket("LocalHost",12007);
  8.                  BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
  9.                  PrintWriter bufout=new PrintWriter(s.getOutputStream(),true);//没有自动刷新
  10.                  BufferedReader bufin=new BufferedReader(new InputStreamReader(s.getInputStream()));
  11.                  for(int i=0;i<5;i++)
  12.                  {
  13.                          String line=bufr.readLine();
  14.                          //System.out.println(line);
  15.                          if(line==null)
  16.                                  break;
  17.                          bufout.println(line);
  18.                          //System.out.println(line);
  19.                          String info=bufin.readLine();
  20.                          System.out.println("info: "+info);
  21.                          if(info.contains("欢迎"))                                
  22.                                  break;
  23.                  }        
  24.                  bufr.close();
  25.                  s.close();
  26.          }
  27. }
  28. class ThreadLogin implements Runnable
  29. {
  30.          private Socket s;
  31.          ThreadLogin(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<5;i++)
  42.                          {
  43.                                  BufferedReader bufin=new BufferedReader(new InputStreamReader(s.getInputStream()));
  44.                                  //System.out.println(bufin.readLine());//去掉这句,连续两次readLine(),下面会readLine会阻塞
  45.                                 // System.out.println("shui");
  46.                                  BufferedReader bufr=new BufferedReader(new FileReader("UserName.txt"));
  47.                                  PrintWriter bufout=new PrintWriter(s.getOutputStream(),true);//同样没有自动刷新
  48.                                  
  49.                                  String name=bufin.readLine();  
  50.                                  System.out.println("name="+name);
  51.                                  

  52.                                  String line=null;
  53.                                  boolean flag=false;
  54.                                  while((line=bufr.readLine())!=null)
  55.                                  {
  56.                                          if(line.equals(name))
  57.                                          {
  58.                                                  flag=true;
  59.                                                  break;
  60.                                          }        
  61.                                  }
  62.                                  if(flag)
  63.                                  {
  64.                                          System.out.println(name+"已登录");
  65.                                          bufout.println(name+":欢迎登录");
  66.                                          break;
  67.                                  }
  68.                                  else{//没加{}
  69.                                          System.out.println(name+"尝试登录服务器");
  70.                                          bufout.println(name+"不存在");
  71.                                                                  }
  72.                          }
  73.                          s.close();
  74.                  }
  75.                  catch (Exception e)
  76.                  {
  77.                          //throw new RuntimeException(ip+"校验失败");
  78.                                                  e.printStackTrace();
  79.                  }
  80.          }
  81. }

  82. class LoginServer
  83. {
  84.          public static void main(String[] args) throws Exception
  85.          {
  86.                  ServerSocket ss=new ServerSocket(12007);
  87.                  while(true)
  88.                  {
  89.                          Socket s=ss.accept();
  90.                          new Thread(new ThreadLogin(s)).start();
  91.                  }
  92.          }
  93. }
  94. /*
  95. 好好整理下思路,细心点
  96. */
复制代码

作者: jixusmile    时间: 2013-7-22 19:39
啊哈哈,谢了谦儿哥,问题的症结果然是在刷新和连续readLine()导致阻塞上,十分感谢
作者: jixusmile    时间: 2013-7-22 19:44
同时也谢谢 兴庭哥,我计划赶本月25号的第22届安卓班呢,只是苦于现在java基础不扎实,技术分也不够,急火攻心中..............
作者: jixusmile    时间: 2013-7-22 19:45
张洪慊 发表于 2013-7-21 22:38
已测试:

多谢多谢~~~!:D
作者: 杨兴庭    时间: 2013-7-22 21:15
jixusmile 发表于 2013-7-22 19:44
同时也谢谢 兴庭哥,我计划赶本月25号的第22届安卓班呢,只是苦于现在java基础不扎实,技术分也不够,急火 ...

貌似22期已经满了。。。不过23期还有很多的名额应该能赶的上的。。。技术分多多答题多多技术分,,呵呵
作者: 张洪慊    时间: 2013-7-22 23:07
jixusmile 发表于 2013-7-22 19:39
啊哈哈,谢了谦儿哥,问题的症结果然是在刷新和连续readLine()导致阻塞上,十分感谢 ...

共同加油吧,骚年




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