Java实现多人聊天室

多人聊天室原理图

在这里插入图片描述

源码

工具类:
该类用于关闭各种流。

public class CloseUtil {
    public static void CloseAll(Closeable... closeable){
        for(Closeable c:closeable){
            if (c != null) {
                try {
                    c.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

服务器:
服务器端创建一个serverSocket对象通过accept()方法监听是否有tcp连接,同时有一个储存socket对象的集合将连接进来的对象储存到List集合中,服务器将消息进行转发。

//服务器
public class Server {
    //存储每一个连接进来的客户端
    public static List<MyChannel> list=new ArrayList<>();

    public static void main(String[] args) throws Exception {
         //创建ServerSocket对象
        ServerSocket serverSocket = new ServerSocket(9999);
        while (true){
            //连接进来的客户端
            Socket client = serverSocket.accept();
            System.out.println(client.getInetAddress()+"进入聊天室");
        MyChannel myChannel = new MyChannel(client);
        list.add(myChannel);
        new Thread(myChannel).start();
        }
    }
}

消息转发类:
具体的消息转发实现类,将信息发给除发送消息以外的其他客户端。

//用于信息转发
public class MyChannel implements Runnable{
    private DataInputStream dis;
    private DataOutputStream dos;
    private boolean flag=true;

    public MyChannel(Socket socket) {
        try{
            dis=new DataInputStream(socket.getInputStream());
            dos=new DataOutputStream(socket.getOutputStream());
        }catch (IOException e){
            flag=false;
            CloseUtil.CloseAll(dis,dos);
        }
    }
    //接收数据的方法
    private String receive(){
        String str="";
        try{
            str= dis.readUTF();
        }catch (IOException e){
            flag=false;
            CloseUtil.CloseAll(dis,dos);
            Server.list.remove(this);
        }
        return str;
    }
    //发送数据的方法
    private void send(String str){
        try {
            if (str != null && str.length() != 0) {
                dos.writeUTF(str);
                dos.flush();
            }
        }catch (Exception exception){
           flag=false;
           CloseUtil.CloseAll(dos,dis);
           Server.list.remove(this);
        }
    }
    //转发消息的方法
    private void sendToOther(){
        String str=this.receive();
        List<MyChannel> list = Server.list;
        for (MyChannel other:list) {
            if(other==list){
                continue;//不发送信息给自己
            }
            //将消息发送给其他客户端
            other.send(str);
        }
    }

    @Override
    public void run() {
        while (flag){
            sendToOther();
        }
    }
}

发送信息类:
用于从键盘上获取数据然后将数据发送出去

public class Send implements Runnable{
    //从键盘上获取数据
    private BufferedReader br;
    private DataOutputStream dos;
    private boolean flag=true;

    public Send() {
        br=new BufferedReader(new InputStreamReader(System.in));
    }
    public Send(Socket socket){
        this();
        try{
            dos=new DataOutputStream(socket.getOutputStream());
        }catch (Exception e){
            flag=false;
            CloseUtil.CloseAll(dos,socket);
            e.printStackTrace();
        }
    }


    private String getMessage(){
        String str="";
        try{
            str=br.readLine();
        }catch (IOException e){
            flag=false;
            CloseUtil.CloseAll(br);
        }
        return str;
    }
    private void send(String str){
        try {
            dos.writeUTF(str);
            dos.flush();
        } catch (IOException e) {
            flag=false;
            CloseUtil.CloseAll(dos);
            e.printStackTrace();
        }

    }

    @Override
    public void run() {
        while (flag){
            this.send(getMessage());
        }
    }
}

信息接收类:

public class Receive implements Runnable{
    //接受数据流
    private DataInputStream dis;
    private boolean flag=true;


    public Receive(Socket socket){
        try {
            dis = new DataInputStream(socket.getInputStream());
        }catch (Exception e){
            flag=false;
            CloseUtil.CloseAll(dis,socket);
        }
    }
    private String getMessage(){
        String str="";
        try {
            str=dis.readUTF();
        } catch (IOException e) {
            flag=false;
            CloseUtil.CloseAll(dis);
            e.printStackTrace();
        }
        return str;
    }
    @Override
    public void run() {
        while (flag){
            System.out.println(this.getMessage());
        }
    }
}

客户端:

public class client {
    public static void main(String[] args) throws Exception{
        Socket socket = new Socket(InetAddress.getLocalHost(),9999);
        Send send = new Send(socket);
        Receive receive = new Receive(socket);
        new Thread(send).start();
        new Thread(receive).start();
    }
}

先将服务器启动然后启动客户端:测试结果如下

在这里插入图片描述
有喜欢的小伙伴可以自己拿去玩,代码复制直接有效。

  • 34
    点赞
  • 187
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论
实现多人聊天室需要用到网络编程和多线程技术,下面是一个简单的Java多人聊天室实现示例: 服务端代码: ```java import java.io.*; import java.net.*; import java.util.*; public class ChatServer { private ServerSocket server; private ArrayList<Socket> clients = new ArrayList<Socket>(); public ChatServer(int port) throws IOException { server = new ServerSocket(port); System.out.println("Server started on port " + port); } public void start() { while (true) { try { Socket client = server.accept(); clients.add(client); System.out.println("Client connected: " + client.getInetAddress().getHostName()); new Thread(new ClientHandler(client)).start(); } catch (IOException e) { e.printStackTrace(); } } } public void broadcast(String message) { System.out.println("Broadcasting message: " + message); for (Socket client : clients) { try { PrintWriter out = new PrintWriter(client.getOutputStream(), true); out.println(message); } catch (IOException e) { e.printStackTrace(); } } } private class ClientHandler implements Runnable { private Socket client; private BufferedReader in; public ClientHandler(Socket client) throws IOException { this.client = client; in = new BufferedReader(new InputStreamReader(client.getInputStream())); } @Override public void run() { String message; try { while ((message = in.readLine()) != null) { broadcast(message); } } catch (IOException e) { e.printStackTrace(); } finally { try { client.close(); } catch (IOException e) { e.printStackTrace(); } clients.remove(client); System.out.println("Client disconnected: " + client.getInetAddress().getHostName()); } } } public static void main(String[] args) throws IOException { ChatServer server = new ChatServer(5000); server.start(); } } ``` 客户端代码: ```java import java.io.*; import java.net.*; import java.util.Scanner; public class ChatClient { public static void main(String[] args) { try { Socket server = new Socket("localhost", 5000); System.out.println("Connected to server: " + server.getInetAddress().getHostName()); new Thread(new ServerHandler(server)).start(); PrintWriter out = new PrintWriter(server.getOutputStream(), true); Scanner scanner = new Scanner(System.in); String message; while ((message = scanner.nextLine()) != null) { out.println(message); } scanner.close(); server.close(); } catch (IOException e) { e.printStackTrace(); } } private static class ServerHandler implements Runnable { private Socket server; private BufferedReader in; public ServerHandler(Socket server) throws IOException { this.server = server; in = new BufferedReader(new InputStreamReader(server.getInputStream())); } @Override public void run() { String message; try { while ((message = in.readLine()) != null) { System.out.println(message); } } catch (IOException e) { e.printStackTrace(); } } } } ``` 运行Server类开启服务端,运行Client类开启客户端即可实现多人聊天室
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

活跃的咸鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值