java基础实现聊天室功能,群聊,私聊(UTP,读写流,ServerSocket,Socket运用)

java基础实现聊天室功能,群聊,私聊(UTP,读写流,ServerSocket,Socket运用),第1张

java基础实现聊天室功能,群聊,私聊(UTP,读写流,ServerSocket,Socket运用) java基础实现聊天室功能,群聊,私聊(UTP,读写流,ServerSocket,Socket运用) 1.消息发送工具代码
package com.liangrui.chatPlace;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;


public class SendUtil implements Runnable {
    private BufferedReader bufferedReader;      //输入流
    private DataOutputStream dataOutputStream; //输出流
    private Socket client; //客户
    private boolean whetherRunning; //是否继续运行
    private String name; //用户名

    
    public SendUtil(Socket client,String name){
        this.client=client;
        this.name=name;
        this.whetherRunning=true;
        bufferedReader=new BufferedReader(new InputStreamReader(System.in));

        try {
            dataOutputStream=new DataOutputStream(client.getOutputStream());
            //发送用户名
            send(name);
        } catch (IOException e) {
            e.printStackTrace();
            release();
        }
    }

    @Override
    public void run() {
        while (whetherRunning){
            String msg=getMsgFromConsole();
            send(msg);
            //如果输入bye,则客户退出
            if ("bye".equals(msg)){
                release();
            }
        }
    }

    
    private void send(String msg){
        try {
            dataOutputStream.writeUTF(msg);
            dataOutputStream.flush();
        } catch (IOException e) {
            e.printStackTrace();
            release();
        }
    }

    
    private void release(){
        this.whetherRunning=false;
        ReleaseUtil.release(bufferedReader,dataOutputStream,client);
    }

    
    private String getMsgFromConsole(){
        try {
            return bufferedReader.readLine();
        } catch (IOException e) {
            e.printStackTrace();
            return "输入消息时,网络出错啦!!!";
        }
    }
}
2.消息接收工具代码
package com.liangrui.chatPlace;

import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;


public class ReceiveUtil implements Runnable{

    private DataInputStream dataInputStream;//输入流
    private Socket client;//客户
    private boolean whetherRunning;//是否继续运行

    
    public ReceiveUtil(Socket client){
        this.client=client;
        this.whetherRunning=true;
        try {
            dataInputStream=new DataInputStream(client.getInputStream());
        } catch (IOException e) {
            e.printStackTrace();
            release();
        }
    }

    
    private String receive(){
        try {
            return dataInputStream.readUTF();
        } catch (IOException e) {
            e.printStackTrace();
            release();
            return "接收消息时,网络出错啦!!!";
        }
    }

    @Override
    public void run() {
        while (whetherRunning){
            System.out.println(receive());
        }
    }

    private void release(){
        this.whetherRunning=false;
        ReleaseUtil.release(dataInputStream,client);
    }
}

3.资源释放工具代码
package com.liangrui.chatPlace;

import java.io.BufferedInputStream;
import java.io.Closeable;
import java.io.IOException;
import java.net.Socket;


public class ReleaseUtil {

    
    public static void release(Closeable... targets){
        for (Closeable target : targets) {
            if (target!=null){
                try {
                    target.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

4.用户代码,一个用户代表一个客户端
package com.liangrui.chatPlace;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.concurrent.CopyOnWriteArrayList;


public class User implements Runnable{
    private CopyOnWriteArrayList users;
    private DataInputStream dataInputStream;         //输入流,用来接收数据
    private DataOutputStream dataOutputStream;       //输出流,用来发送数据
    private Socket client;                           //客户
    private boolean whetherRunning;                       //是否继续运行
    private String name;                             //用户名

    public User(Socket client,CopyOnWriteArrayList users){
        users.add(this);
        this.users=users;
        this.client=client;
        whetherRunning=true;
        try {

            dataInputStream=new DataInputStream(client.getInputStream());
            dataOutputStream=new DataOutputStream(client.getOutputStream());
            //获取用户名
            this.name=receive();
            //欢迎你的到来
            this.send("欢迎您,"+this.name);
            sendOthers(this.name+"来到了良睿聊天室",true);
        } catch (IOException e) {
            e.printStackTrace();
            release();
        }
    }

    
    private void send(String msg){
        try {
            dataOutputStream.writeUTF(msg);
            dataOutputStream.flush();
        } catch (IOException e) {
            e.printStackTrace();
            release();
        }
    }

    
    private String receive(){
        try {
            return dataInputStream.readUTF();
        } catch (IOException e) {
            e.printStackTrace();
            release();
            return "";
        }
    }

    
    private void sendOthers(String msg,boolean isSys){
        //是否私聊,有@表示私聊,否则为群聊
        boolean whetherPrivate=msg.startsWith("@");
        if (whetherPrivate){
            //:所在的下标
            int idx=msg.indexOf(":");
            //获取目标
            String targetName=msg.substring(1,idx);
            //发送的消息
            msg=msg.substring(idx+1);
            for (User user : users) {
                if (user.name.equals(targetName)){//找到目标
                    user.send(this.name+"悄悄地对您说:"+msg);
                }
            }
        }else {//不是私聊,是群聊
            for (User user : users) {
                if (user==this){//如果是自己则不做处理
                    continue;
                }

                if (isSys){//系统消息
                    user.send(msg);
                }else {//群聊
                    user.send(this.name+"对所有人说:"+msg);
                }
            }
        }
    }

    
    private void release(){
        this.whetherRunning=false;
        ReleaseUtil.release(dataInputStream,dataOutputStream,client);
        //退出
        users.remove(this);
        sendOthers(this.name+"离开了大家庭...",true);
    }


    @Override
    public void run() {
        while (whetherRunning){
            String msg=receive();
            if (!"".equals(msg)){
                sendOthers(msg,false);
            }
        }
    }
}

5.服务器代码
package com.liangrui.chatPlace;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.CopyOnWriteArrayList;


public class Server {
    //在线的用户列表
    private static CopyOnWriteArrayList users =new CopyOnWriteArrayList();

    public static void main(String[] args) throws IOException {
        System.out.println("---------------服务器------------------");
        //指定端口,使用ServerSocket创建服务器
        ServerSocket server=new ServerSocket(8888);
        //阻塞式等待连接
        while (true){
            Socket client=server.accept();
            System.out.println("一个用户建立了连接");
            User user=new User(client,users);
            new Thread(user).start();
        }
    }
}

6.客户端代码
package com.liangrui.chatPlace;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;


public class Client {
    public static void main(String[] args) throws IOException {
        System.out.println("-----------客户端---------------");
        BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(System.in));
        System.out.println("请输入用户名:");
        String name=bufferedReader.readLine();
        //建立连接客户端
        Socket client=new Socket("localhost",8888);
        //一个线程发送消息,一个线程接收消息
        new Thread(new SendUtil(client,name)).start();
        new Thread(new ReceiveUtil(client)).start();
    }
}

7.实际运行情况
---------------服务器------------------
一个用户建立了连接
一个用户建立了连接
一个用户建立了连接
-----------客户端---------------
请输入用户名:
张三
欢迎您,张三
李四来到了良睿聊天室
王五来到了良睿聊天室
啦啦啦
王五悄悄地对您说:你是张三吗?
@王五:是的,请问你是?
王五悄悄地对您说:我是王五呀,大哥!
@王五:原来是王五呀,幸会幸会!!
李四对所有人说:bye
李四离开了大家庭...
-----------客户端---------------
请输入用户名:
李四
欢迎您,李四
王五来到了良睿聊天室
张三对所有人说:啦啦啦
bye
-----------客户端---------------
请输入用户名:
王五
欢迎您,王五
张三对所有人说:啦啦啦
@张三:你是张三吗?
张三悄悄地对您说:是的,请问你是?
@张三:我是王五呀,大哥!
张三悄悄地对您说:原来是王五呀,幸会幸会!!
李四对所有人说:bye
李四离开了大家庭...
到此,java基础实现聊天室功能已完成。有问题随时评论,觉得有用的话记得点个赞哦! 在代码实例中学习知识,学和用兼备,想要长期学习的小伙伴记得关注哦!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/4673058.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-06
下一篇 2022-11-06

发表评论

登录后才能评论

评论列表(0条)

保存