zoukankan      html  css  js  c++  java
  • 线程练习题---简易多人聊天室

     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 }
    View Code
  • 相关阅读:
    程序员为什么难管理?
    Python多继承
    如何从程序员走向管理层?
    为什么Python能超越JAVA,有什么优势?
    HTTP协议简介与在python中的使用详解
    人力资源管理书籍推荐,这本书HR必看
    把市面上的书翻了个遍,找到这五本经典营销管理书籍推荐给大家
    服务器部署之 cap deploy:setup
    【转】D3DXLoadSkinMeshFromXof函数及.x在不同dx版本中
    【转】C/C++字节对齐算法
  • 原文地址:https://www.cnblogs.com/gongxijun/p/4164182.html
Copyright © 2011-2022 走看看