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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 一碗小米周 于 2013-12-5 13:02 编辑
  1. package gui;

  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;
  5. import java.io.PrintWriter;
  6. import java.net.Socket;
  7. import java.net.UnknownHostException;


  8. public class LoginInClient {
  9.         public static void main(String[] args){
  10.                 try
  11.                 {
  12.                         Socket s = new Socket("172.16.21.50",10030);
  13.                         
  14.                                 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  15.                                 PrintWriter pw =new PrintWriter(s.getOutputStream(),true);
  16.                                 BufferedReader brr =new BufferedReader(new InputStreamReader(s.getInputStream()));
  17.                                 for(int i=0;i<3;i++){
  18.                                         String line =br.readLine();
  19.                                         pw.println(line);
  20.                                         s.shutdownOutput();
  21.                                         String str =brr.readLine();
  22.                                         System.out.println(str);
  23.                                 }        
  24.                                 
  25.                                 br.close();
  26.                                 s.close();
  27.                         
  28.                         
  29.                 }
  30.                 catch (UnknownHostException e) {
  31.                         e.printStackTrace();
  32.                 }
  33.                 catch (IOException e) {
  34.                         e.printStackTrace();
  35.                 }
  36.         
  37.         }
  38. }
复制代码


  1. package gui;

  2. import java.io.BufferedReader;
  3. import java.io.FileReader;
  4. import java.io.IOException;
  5. import java.io.InputStreamReader;
  6. import java.io.OutputStreamWriter;
  7. import java.io.PrintWriter;
  8. import java.net.ServerSocket;
  9. import java.net.Socket;


  10. public class LoginInServer {
  11.         public static void main(String[] args){
  12.                 try
  13.                 {
  14.                         ServerSocket ss = new ServerSocket(10030);
  15.                         Socket s = ss.accept();
  16.                         System.out.println("shhit");
  17.                         while(true)
  18.                         {
  19.                                 new Thread(new myThread2(s)).start();
  20.                         }
  21.                 }
  22.                 catch (IOException e) {
  23.                         e.printStackTrace();
  24.                 }
  25.                
  26.         }

  27. }
  28. class myThread2 implements Runnable{
  29.         private Socket s;
  30.         public myThread2(Socket s) {
  31.                 this.s=s;
  32.         }
  33.         public void run(){
  34.                 try
  35.                 {
  36.                         for(int i=0;i<3;i++){
  37.                                 BufferedReader br =new BufferedReader(new InputStreamReader(s.getInputStream()));
  38.                                 String str = br.readLine();
  39.                                 BufferedReader brr = new BufferedReader(new FileReader("E:\\sql.txt"));
  40.                                 
  41.                                 PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
  42.                                 String line =null;
  43.                                 while((line=brr.readLine())!=null){
  44.                                         if(str.equals(line))
  45.                                         {
  46.                                                 pw.println("登陆成功");
  47.                                                 break;
  48.                                         }
  49.                                         else {
  50.                                                 pw.println("登陆失败,请尝试登陆!");
  51.                                                 break;
  52.                                         }
  53.                                 }
  54.                         
  55.                         }
  56.                 }
  57.                 catch (Exception e)
  58.                 {
  59.                         
  60.                 }
  61.                 }
  62.         }
  63.         
  64.         
复制代码

上面是我写的一个登陆到服务器的一个简单小程序。但是当我开启服务器段的时候,再开启客户端,myeclipse就会死了。cpu运行达到100%。出现卡机现象。求大神帮忙看看啊。谢谢各位了。


评分

参与人数 1技术分 +1 收起 理由
贺奕凯 + 1

查看全部评分

2 个回复

倒序浏览
本帖最后由 Jim-剣◆﹏ 于 2013-12-5 11:20 编辑

哈哈,一看你的问题描述就知道怎么回事,肯定是写了多线程,我曾经遇到过这个问题,小研究了下
你的问题出在服务端
在这段代码里
                    try

16.                {

17.                        ServerSocket ss = new ServerSocket(10030);

18.                        Socket s = ss.accept();

19.                        System.out.println("shhit");

20.                        while(true)

21.                        {

22.                                new Thread(new myThread2(s)).start();

23.                        }

24.                }

很明显,你的循环条件是true,这样写的后果会:无论有没有客户端连接进来,我都无限开启线程,那么这是一个死循环,会不断地开启线程,CPU使用率自然会达到100%
应该把Socket s = ss.accept();这句放进循环体中,因为 ss.accept();这个方法是阻塞式的方法
只有当有新的客户端连接进来的时候才会返回一个Socket对象,此时才会往下执行这句代码:new Thread(new myThread2(s)).start();
如果没有客户端连接,就一直阻塞,直到有新的连接
那么这样的效果就是,只有当有客户端连接的时候才开启一个线程,,那么这样就不会死循环了,并且达到有多少个客户端连接进来就开启多少个线程
程序改为:
                   try

16.                {

17.                        ServerSocket ss = new ServerSocket(10030);

19.                        System.out.println("shhit");

20.                        while(true)

21.                        {
                                     Socket s = ss.accept();
22.                                new Thread(new myThread2(s)).start();

23.                        }

24.                }

评分

参与人数 1技术分 +1 收起 理由
贺奕凯 + 1

查看全部评分

回复 使用道具 举报
Jim-剣◆﹏ 发表于 2013-12-5 11:02
哈哈,一看你的问题描述就知道怎么回事,肯定是写了多线程,我曾经遇到过这个问题,小研究了下
你的问题出 ...

原来是这样啊。谢谢大神。。。:lol
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马