JavaSE02_Day01(下2)-群聊聊天室(四)、Collection接口初识

一、群聊聊天室

1.1 聊天室案例四

群聊业务:将当前多个客户端向服务器端发送消息以后,可以让所有客户端发送的消息不光在服务器端有显示,也可以让这些消息在不同的客户端中都显示。

1.客户端需要有读取服务端发送数据的功能,需要在原有输出流的基础上,再拥有输入流进行读取服务器端发送数据。

2.服务器端需要有向客户端写出数据的功能,需要在原有输入流的基础上,再拥有输出流进行向客户端发送数据。

实现步骤:

  • 在服务器端定义输出流类型的数组对象,用于保存各个客户端发送的数据的输出流对象

  • 服务器之前只是拥有输入流对象,用于读取客户端发送过来的数据消息,现在需要将服务器端接收到客户端发送的数据再依次发送给每个客户端实现群聊效果,所以,需要在服务器端中添加输出流,并将这个输出流对象保存到上一步定义的数组中

  • 客户端之前只是拥有输出流对象,用于向服务器端写出相关数据,但是通过图示和步骤二,客户端也需要进行读取服务端发送的数据消息,所以需要在客户端中添加输入流对象,用于读取服务器端发送过来的群聊数据

Server

Client:

测试效果:

(1)服务端

服务端正在启动...
服务端启动成功!
等待客户端连接...
一个客户端连接完毕!
等待客户端连接...
一个客户端连接完毕!
等待客户端连接...
一个客户端连接完毕!
等待客户端连接...
127.0.0.1说你好,我是1号
127.0.0.1说你好,我是2号
127.0.0.1说你好,我是3号

(2)客户端1

开始连接服务端...
连接服务端成功!
你好,我是1号
127.0.0.1说你好,我是1号
127.0.0.1说你好,我是2号
127.0.0.1说你好,我是3号

(3)客户端2

开始连接服务端...
连接服务端成功!
127.0.0.1说你好,我是1号
你好,我是2号
127.0.0.1说你好,我是2号
127.0.0.1说你好,我是3号

(4)客户端3

开始连接服务端...
连接服务端成功!
127.0.0.1说你好,我是1号
127.0.0.1说你好,我是2号
你好,我是3号
127.0.0.1说你好,我是3号

注意事项

1.客户端和服务端均要进行数据读写操作,才能实现群聊功能,服务端就相当于一个中转站,把每个客户端发送过来的消息,接收后再发送给其他客户端;

2.新建线程任务序列后要放到线程中,记得最后要启动线程;

3.服务端连接客户端时,要将连接和线程操作放到while循环里,循环等待进行多个客户端的连接,不循环只能连接一个客户端,其他客户端连接不进来。

二、Collection接口

2.1 定义:

        在Java.util包中提供集合接口及其接口的实现子类,接口可以理解成是一个容器,可以使用集合帮助程序员进行存放各种元素,类似于之前所学习的数组。

注意:工作中使用集合的频率 > 使用数组的频率。

2.2 优势:

       因为数组的使用可以观察到,数组的长度是固定的,所谓的扩容和缩容,实际上是创建新的数组对象。而集合的长度是可变的,没有长度限制,所以使用集合的概率会远远高于使用数组的概率,集合也提供大量的API方法,进行对集合中的元素进行操作。

2.3 分类:

2.4 说明:

       Collection接口定义了所有集合都具备的方法,并且该接口提供了两个子接口,分别为Set和List。

  • Set集合中存储的元素规定是不能重复的,并且大部分是无序的

  • List集合中存储的元素规定是允许重复的,例如可以对这两个元素使用equals方法进行比较,如果返回值为true,证明是重复元素。

2.5 集合的add、size、clear、isEmpty方法的使用

 package cn.tedu.collection;
 
 import java.util.ArrayList;
 import java.util.Collection;
 
 /**
  * Collection集合案例演示一
  * @author cjn
  *
  */
 public class CollectionDemo01 {
 
     public static void main(String[] args) {
         //1.创建集合对象(向上造型),<E>表示的是泛型,参数化数据类型,对输入参数类型进行限制,避免发生错误
         Collection<String> c = new ArrayList<String>();
         
         /*
          * 2.向集合中添加元素
          * boolean add(E e)
          * 该方法表示可以向集合中添加对应类型的元素,
          * 如果添加元素成功,则返回值为true,
          * 如果添加元素失败,返回值为false。
          */
         c.add("one");
         c.add("two");
         c.add("three");
         c.add("four");
         System.out.println("集合对象:" + c);
         
         /*
          * 3.查看集合中元素的个数
          * int size()
          * 该方法可以返回集合中的元素个数
          */
         int size = c.size();
         System.out.println("集合的元素个数为:" + size);
 
         /*
          * 4.判断集合是否是空集合
          * boolean isEmpty()
          * 该方法如果判断集合为空(不包含元素),返回值为true,
          * 反之,包含元素则返回fasle。
          */
         boolean isEmpty = c.isEmpty();
         System.out.println("集合是否为空集合:" + isEmpty);
         
         /*
          * 5.清空集合
          * void clear()
* 删除/清空集合中全部元素
          */
         c.clear();
         System.out.println(c);
         System.out.println(c.size());
         System.out.println(c.isEmpty());
         
    }
 
 }

测试结果:

 集合对象:[one, two, three, four]
 集合的元素个数为:4
 集合是否为空集合:false
 []
 0
 true

2.6 contains()方法

       集合中还提供了判断指定元素是否被集合进行包含的方法:boolean contains(Object o),该方法返回值是boolean类型,如果集合中包含指定元素时,则返回值为true,反之包含false。

Point.java

 package cn.tedu.collection;
 /**
  * 用于判断集合中是否包含某个元素的类
  * @author cjn
  *
  */
 public class Point {
  private int x;
  private int y;
 
  public Point() {}
 
  public Point(int x, int y) {
  super();
  this.x = x;
  this.y = y;
  }
 
  public int getX() {
  return x;
  }
 
  public void setX(int x) {
  this.x = x;
  }
 
  public int getY() {
  return y;
  }
 
  public void setY(int y) {
  this.y = y;
  }
 
  @Override
  public String toString() {
  return "Point [x=" + x + ", y=" + y + "]";
  }
 
  @Override
  public int hashCode() {
  final int prime = 31;
  int result = 1;
  result = prime * result + x;
  result = prime * result + y;
  return result;
  }
 
  @Override
  public boolean equals(Object obj) {
  if (this == obj)
  return true;
  if (obj == null)
  return false;
  if (getClass() != obj.getClass())
  return false;
  Point other = (Point) obj;
  if (x != other.x)
  return false;
  if (y != other.y)
  return false;
  return true;
  }
 }
 

contains测试类:Collection_contains.java:

 package cn.tedu.collection;
 
 import java.util.ArrayList;
 import java.util.Collection;
 
 /**
  * 使用contains方法判断集合中是否包含指定元素
  * @author cjn
  *
  */
 public class Collection_contains {
 
     public static void main(String[] args) {
         //1.创建集合实例对象,并且指定集合中添加元素的类型为点类型
         Collection<Point> c = new ArrayList<Point>();
         
         //2.向集合中添加点元素      
         c.add(new Point(1, 1));
         c.add(new Point(-1, 1));
         c.add(new Point(-1, -1));
         c.add(new Point(1, -1));
         
         //3.创建点的对象
         Point p = new Point(1, 1);

         //4.判断第三步所创建的点对象,是否在集合中有包含
         boolean isContains = c.contains(p);
         System.out.println("是否集合中包含指定元素内容:" + isContains);
       
    }
 
 }

测试结果:

 是否集合中包含指定元素内容:true

 

posted @ 2021-07-03 23:55  Coder_Cui  阅读(109)  评论(0编辑  收藏  举报