线程练习题---简易多人聊天室

时间:2022-05-05
本文章向大家介绍线程练习题---简易多人聊天室,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
 1 package Day_1;
 2 
 3 import java.io.DataInputStream;
 4 import java.io.DataOutputStream;
 5 import java.io.EOFException;
 6 import java.io.IOException;
 7 import java.net.ConnectException;
 8 import java.net.Socket;
 9 import java.net.SocketException;
10 import java.net.UnknownHostException;
11 import java.util.Scanner;
12 
13 /*
14  * 对于聊天室而言,不需要进行单线程进行即可。
15  * 和Socket编程
16  * */
17 public class Client {
18 
19     private DataInputStream Dis = null;
20     private DataOutputStream Dos = null;
21     private boolean connect = false;
22     Socket sc = null;
23 
24     public static void main(String args[]) {
25         new Client().start();
26     }
27 
28     private void send(String str) {
29         try {
30             Dos.writeUTF(str);
31         } catch (IOException e) {
32             // TODO Auto-generated catch block
33             e.printStackTrace();
34         }
35     }
36 
37     private void sec() {
38         try {
39             System.out.println("这是来自服务器:" + sc.getInetAddress() + ": "
40                     + Dis.readUTF());
41         } catch (EOFException e) {
42             System.out.println("该客户端退出了!");
43         } catch (IOException e) {
44             // TODO Auto-generated catch block
45             e.printStackTrace();
46         }
47     }
48 
49     public void start() {
50         try {
51             // 建立连接
52             sc = new Socket("127.0.0.1", 8888);
53             Dos = new DataOutputStream(sc.getOutputStream());
54             Dis = new DataInputStream(sc.getInputStream());
55             connect = true; // 可以开始通话了
56         } catch (ConnectException e) {
57             System.out.println("服务器,木有打开!");
58         } catch (IOException e) {
59             // TODO Auto-generated catch block
60             e.printStackTrace();
61         }
62         while (connect) {
63             Scanner read = new Scanner(System.in);
64             while (read.hasNext()) {
65                 String st = read.next();
66                 if (st.equals("exit")) {
67                     try {
68                         if (Dos != null)
69                             Dos.close();
70                         if (Dis != null)
71                             Dis.close();
72                         if (sc != null)
73                             sc.close();
74                     } catch (IOException e) {
75                         // TODO Auto-generated catch block
76                         e.printStackTrace();
77                     }
78                     connect=false;
79                     break;
80                 }
81                 this.send(st);
82                 this.sec();
83             }
84         }
85     }
86 }
  1 package Day_1;
  2 
  3 import java.io.DataInputStream;
  4 import java.io.DataOutputStream;
  5 import java.io.EOFException;
  6 import java.io.IOException;
  7 import java.net.BindException;
  8 import java.net.ServerSocket;
  9 import java.net.Socket;
 10 import java.util.ArrayList;
 11 import java.util.Deque;
 12 import java.util.List;
 13 import java.util.concurrent.ExecutorService;
 14 import java.util.concurrent.Executors;
 15   
 16 
 17 public class GetPicture {
 18     
 19     /**
 20      * @param args
 21      * 聊天室有n个人在聊天,聊天服务器就应该为每个进入聊天室的人创建一个对应的线程,
 22      * 该线程监听对应的聊天者是否有消息传来。如果有,则向所有的聊天者广播该消息。
 23      * 实现该网络聊天系统、
 24      */
 25     private boolean started =false;
 26     private boolean connect=false;
 27     //放置一个链表来存放新建的客户端
 28     List<NewClient> list=new ArrayList<NewClient>() ;
 29     //设定一个无限制大小的线程池         
 30     ExecutorService  es = Executors.newCachedThreadPool();
 31     public static  void main(String[] args) {
 32         // TODO Auto-generated method stub
 33           new GetPicture().start();    
 34     }    
 35     
 36     public void start(){    
 37         final int port=8888;  
 38         ServerSocket  ss = null ;    
 39         try {
 40             //创建套接字
 41             ss = new ServerSocket(port);
 42             connect = true;
 43         }catch(BindException e)
 44         {
 45             //不做任何处理
 46         }
 47         catch (IOException e) {
 48             // TODO Auto-generated catch block
 49             e.printStackTrace();
 50         }
 51         //如果连接上,则表示不断的创建客户端对象
 52         try {
 53         while(connect){
 54               //表示不断的监听
 55                Socket st =  ss.accept();
 56                //将套接字放进 NewClient类中
 57                NewClient nc = new NewClient(st);
 58                //将NewClient类放进线程中,创建多线程
 59               // new Thread(nc).start();  //创建线程
 60                //放进线程池中
 61                es.execute(new Thread(nc));
 62                //将newClient放进链表中
 63                list.add(nc);
 64                System.out.println("客戶端接收成功");
 65             } }catch (IOException e) {
 66                 // TODO Auto-generated catch block
 67                 e.printStackTrace();
 68             }
 69         }
 70     
 71     
 72  //创建一个新的客户端类
 73 class NewClient implements Runnable
 74 {
 75      DataInputStream   Dis = null;
 76      DataOutputStream  Dos = null;
 77      Socket sc=null;
 78      boolean started=false; //初始断开
 79   public NewClient(Socket st){
 80            this.sc=st;
 81            try {
 82                 //获得对方发过来的缓存数据流
 83              Dis = new DataInputStream(st.getInputStream());
 84              Dos = new DataOutputStream(st.getOutputStream());
 85              //如果正常说明,已经接收到了对方的发送过来的数据、
 86              started =true;
 87         } catch (IOException e) {
 88             // TODO Auto-generated catch block
 89              e.printStackTrace();
 90         }
 91     }
 92   public void send(String str)
 93   {
 94        try {
 95            // 将数据写入到对方的内存中
 96              Dos.writeUTF(str);
 97         }
 98        catch(EOFException e){
 99            System.out.println("对方客户端退出了!");
100        } catch (IOException e) {
101             // TODO Auto-generated catch block
102             e.printStackTrace();
103         }
104   }
105   @Override
106   public void run() {
107      // TODO Auto-generated method stub
108       //如果连接上了,就可以提取相应的数据
109        String str=null;
110        try {
111        while(started){
112              //采用UTF-8的编码格式进行流的输入输出
113                str = Dis.readUTF();
114                /*for(int i=0;i<list.size() ;i++){
115                  list.get(i).send(str);
116                }*/
117                for( NewClient sc : list )
118                    sc.send(str);
119                } 
120        }catch(EOFException e){
121             //绑定异常,说明退出了
122             System.out.println("该客户端退出了!");
123         }catch (IOException e) {
124             // TODO Auto-generated catch block
125             e.printStackTrace();
126         }finally{
127               //当该线程消亡的时候,给予相应流的关闭
128             try {
129                  if(Dos!=null)Dos.close();
130                  if(Dis!=null)Dis.close();
131                  if(sc!=null)sc.close();
132                 } catch (IOException e) {
133                 // TODO Auto-generated catch block
134                 e.printStackTrace();
135             }
136           }
137   } 
138 }
139 }