群聊(案例)

73 阅读1分钟
package run;


import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;

public class Account {
    private static ExecutorService EX = new ThreadPoolExecutor(3,5,
            3, TimeUnit.SECONDS, new ArrayBlockingQueue<>(5), Executors.defaultThreadFactory(),
            new ThreadPoolExecutor.AbortPolicy());
    public static List<Socket> LIST = new ArrayList<>();
    public static void main(String[] args) {
        try {
            System.out.println("====接收端====");
            ServerSocket serverSocket = new ServerSocket(8888);//创建接收端对象
            while (true) {
                Socket socket = serverSocket.accept();//等待连接发送端
                LIST.add(socket);//将每个接通发送端的对象存在集合里
                Runnable ru = new ServerSocketRead(socket);//创建线程任务
                EX.execute(ru);//启动线程
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
//接收端任务线程
class ServerSocketRead implements Runnable{
    private Socket socket;
    public ServerSocketRead(Socket socket){//构造器,将接收端的socket传进来
        this.socket = socket;
    }
    @Override
    public void run() {
        try {
            InputStream is = socket.getInputStream();//获取输入流
            BufferedReader bf = new BufferedReader(new InputStreamReader(is));//转为打印流
            String len;
            while ((len = bf.readLine()) != null){
                System.out.println(socket.getRemoteSocketAddress() + ": " + len);
                Mass(len);//调用方法
            }
        } catch (Exception e) {
           Account.LIST.remove(socket);//将断开的发送端管道从集合中删除
            System.out.println(socket.getRemoteSocketAddress() + "已离线");
        }

    }

    public void Mass(String msg) throws IOException {
        for (Socket socket1 : Account.LIST) {//遍历集合
            PrintStream ps = new PrintStream(socket1.getOutputStream());//获取每个管道缓冲输出流
            ps.println(msg);//将内容发送到每个客户端
            ps.flush();
        }

    }
}
package run;


import java.io.*;
import java.net.Socket;
import java.util.Scanner;
import java.util.concurrent.*;

public class FileDemo {
    private static ExecutorService EX = new ThreadPoolExecutor(3,5,3,
            TimeUnit.SECONDS,new ArrayBlockingQueue<>(5), Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());
    public static void main(String[] args) {
        try {
            System.out.println("====发送端====");
            Scanner sc = new Scanner(System.in)
            Socket socket = new Socket("127.0.0.1",8888);;//获取发送端对象
            Runnable ru = new SocketRead(socket);//创建线程对象
            EX.execute(ru);//启动线程
              OutputStream os = socket.getOutputStream();//获取输出流对象
              PrintWriter pw  =new PrintWriter(os);//获取缓冲输出流对象
              while (true){
                  pw.println(sc.nextLine());
                  pw.flush();
              }
        } catch (Exception e) {
           e.printStackTrace();
        }
    }
}
class SocketRead implements Runnable {
    private Socket socket;

    public SocketRead(Socket socket) {//构造器 将发送端socket传进来
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            InputStream is = socket.getInputStream();//获取输入流对象
            BufferedReader bf = new BufferedReader(new InputStreamReader(is));//获取缓冲输入流对象
            String len;
            while ((len = bf.readLine()) != null) {
                System.out.println( socket.getRemoteSocketAddress() + ": " + len);
            }
        } catch (Exception e) {
            System.out.println("您已被服务端剔除");
        }

    }
}