基于网路编程以及多线程的实战项目---------聊天室

目录

一、需求分析

二、业务逻辑以及要构建的类的分析

1.UserLogin类

2.KeHuDuan类

3.ChatServer类

4.ChatThread类

5.LoginServer

6.ReadThread类

7.WriteThread类

8.总结

三、总结

四、注意

 

一、需求分析

1.首先该聊天室是基于网络编程以及多线程的,所以要有客户端与服务器的交互过程,同时应为多线程的加入允许多人登录聊天。

2.其次,聊天室是多人的。所以要实现颧髎和私聊两种聊天模式。

二、业务逻辑以及要构建的类的分析

1.UserLogin类

首先用户需要进行登录,所以我们要创建一个userlogin进行用户信息存储以及用户的登陆验证

代码如下:

public class UserLogin {
    //登陆验证
    public static boolean isLogin(String username, String password){
        Map<String,String> usermap = is();
        if (usermap.containsKey(username) && password.equals(usermap.get(username))){
            System.out.println("登陆成功!!!");
            return true;
        }else {
            System.out.println("登陆失败!!!");
            return false;
        }
    }
    //存储用户数据
    private static Map<String,String> is(){
        Map<String,String> userMap = new HashMap<>();
        userMap.put("小张","123456");
        userMap.put("小王","123456");
        userMap.put("小刘","123456");
        userMap.put("小李","123456");
        return userMap;
    }
}

2.KeHuDuan类

该类主要用于向服务器发出请求,并接收客户端协会的数据

代码如下:

public class KeHuDuan {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("localhost",6667);

        Scanner sc = new Scanner(System.in);
        System.out.println("请输入用户名:");
        String username = sc.next();

        System.out.println("请输入密码:");
        String password = sc.next();

        //向服务器发送账号密码
        OutputStream os = socket.getOutputStream();
        PrintWriter pw = new PrintWriter(os);
        pw.println(username+"-"+password);
        pw.flush();

        //接收服务器回写的信息
        InputStream is = socket.getInputStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        String message = br.readLine();

        if (Boolean.valueOf(message)){//如果登陆成功
            chat(username);//开始聊天
        }
    }

    private static void chat(String username) throws IOException {
        //连接聊天服务器
        Socket socket = new Socket("localhost",5874);

        //向服务器发送用户信息
        OutputStream os = socket.getOutputStream();
        PrintWriter pw = new PrintWriter(os);
        pw.println(username);
        pw.flush();
        //开启写线程任务
        new WriteThread(socket).start();
        //开启读线程任务
        new ReadThread(socket).start();
    }
}

3.ChatServer类

该类用来和客户端交互

代码如下:

public class ChatServer {
    static Map<String, Socket> socketMap = new HashMap<>();
    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(5874);
        while (true){
            System.out.println("聊天服务器已启动,等待客户端连接");
            Socket socket = server.accept();
            System.out.println("连接成功");

            //接收客户端发送的用户信息
            InputStream is  = socket.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            String username = br.readLine();
            System.out.println("读取到的用户名:"+username);
            socketMap.put(username,socket);
            //开启聊天线程任务
            new ChatThread(socket).start();
        }
    }
}

4.ChatThread类

该类是本项目的核心类,编写了群聊和私聊的的业务

代码如下:

public class ChatThread extends Thread{
    private Socket socket;
    public ChatThread(Socket socket) {
        this.socket = socket;
    }
    @Override
    public void run() {
        while (true){
            try {
                InputStream is = socket.getInputStream();
                BufferedReader br = new BufferedReader(new InputStreamReader(is));
                String message = br.readLine();
                System.out.println("读到的内容"+message);
                String[] values = message.split("-");
                Map<String,Socket> socketMap = ChatServer.socketMap;
                Set<String> keyset = socketMap.keySet();
                //长度为1是群聊
                if (values.length == 1){
                    for (String username : keyset){
                        Socket socket1 = socketMap.get(username);
                        //向除了自己以外的其他人发送消息
                        if (socket1 != socket){
                            OutputStream os = socket1.getOutputStream();
                            PrintWriter pw = new PrintWriter(os);
                            pw.println(message);
                            pw.flush();
                        }
                    }
                }else {
                    //获取用户名
                    String username = values[0];
                    //私聊
                    //获取对应的客户端通道
                    Socket socket2 = socketMap.get(username);
                    OutputStream os = socket2.getOutputStream();
                    PrintWriter pw = new PrintWriter(os);
                    pw.println(values[1]);
                    pw.flush();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }
}

5.LoginServer

登陆服务器 用于登录

代码如下:

public class LoginServer {
    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(6667);
        while (true) {
            System.out.println("登录服务器已启动,等待客户端连接");
            Socket socket = server.accept();
            System.out.println("连接成功");

            InputStream is = socket.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            String message =  br.readLine();
            System.out.println("message"+message);
            String[] values = message.split("-");//拆分
            String username = values[0];
            String password = values[1];
            System.out.println(username+":"+password);
            boolean flag = UserLogin.isLogin(username,password);
            System.out.println("flag"+flag);

            //回写信息
            OutputStream os = socket.getOutputStream();
            PrintWriter pw = new PrintWriter(os);
            pw.println(flag+"");
            pw.flush();
        }
    }
}

6.ReadThread类

该类用于客户端读操作

代码如下:

public class ReadThread extends Thread{
    private  Socket socket;
    public ReadThread(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        while (true){
            //读取信息
            try {
                InputStream is = socket.getInputStream();
                BufferedReader br =new BufferedReader( new InputStreamReader(is));
                String message = br.readLine();
                System.out.println("客户端读到的消息"+message);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

7.WriteThread类

该类用于客户端写操作

代码如下:

public class WriteThread extends Thread{
    private Socket socket;
    public  WriteThread(Socket socket){
        this.socket = socket;
    }

    @Override
    public void run() {
        Scanner sc = new Scanner(System.in);
        while (true){
            //写出消息
            try {
                OutputStream os = socket.getOutputStream();
                PrintWriter pw = new PrintWriter(os);
                System.out.println("请输入聊天内容");
                String message = sc.next();
                pw.println(message);
                pw.flush();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

8.总结

首先,用户登录,客户端向登陆服务器发送请求

然后登陆服务器将进行登陆验证,若验证通过向客户端发送登陆成功i信号。

客户端收到登录成功信号后,想聊天服务器发出聊天请求

聊天服务器开启聊天线程

聊天线程进行群聊还是私聊的判定

三、总结

该项目融合了网络编程、多线程、集合、以及转化流等知识点,代码并不难,主要是弄清楚其中的业务逻辑,以及客户端和服务器的交互过程。

四、注意

该项目测试时 直接输入聊天内容判定为群聊

姓名-聊天内容     的格式为私聊

测试时要讲客户端窗口多开  同时登陆多个用户方可看到效果

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Java网络编程是一种基于Java语言的开发技术,它涉及到使用Java编程语言来创建网络应用程序和解决方案。在Java网络编程项目中,主要包括以下几个方面的内容。 首先,项目需要对网络通信进行处理。Java提供了Socket类和ServerSocket类,用于在客户端和服务器之间建立可靠的网络连接。在项目中,需要通过Socket类实现客户端和服务器之间的通信,并使用ServerSocket类监听指定的端口,接收来自客户端的连接请求。 其次,项目需要编写服务器端代码。服务器端是项目的核心部分,它接收来自客户端的请求,处理请求并返回响应。在服务器端代码中,可以使用Java多线程技术,实现同时处理多个客户端请求的功能。同时,还可以使用Java的网络协议类,如HTTPURLConnection类,来进行网络协议的处理。 第三,项目需要编写客户端代码。客户端是与用户交互的界面,它负责向服务器发送请求,接收服务器返回的响应,并将响应展示给用户。在客户端代码中,可以使用Java的GUI类库,如Swing或JavaFX,来创建用户界面。此外,还可以使用Java的网络库,如URLConnection类,发送HTTP请求并接收服务器返回的数据。 最后,项目还可能涉及到安全性和性能优化等方面的考虑。在Java网络编程中,经常使用加密和身份验证等技术来保护数据的安全性。此外,还可以通过使用线程池、缓存和调优网络协议等方式,对项目进行性能优化,提高系统的响应速度。 总之,Java网络编程项目需要熟练掌握Java语言的网络编程相关知识,并结合项目需求,灵活运用各种技术和工具,实现有效的网络通信和数据传输。同时,还需要关注项目的安全性和性能优化,为用户提供稳定、安全、高效的网络服务。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

笑魇依然

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

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

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

打赏作者

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

抵扣说明:

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

余额充值