控制台版多人聊天室(包含登录、注册业务)

package chattingSoftware.client;

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


public class Client {

    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("127.0.0.1", 10086);

        System.out.println("连接上服务器");

        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("--------------------欢迎来到何平的聊天室-----------------------");
            System.out.println("1 登录");
            System.out.println("2 注册");
            System.out.println("请输入你的选择:");

            int choise = sc.nextInt();
            switch (choise) {
                case 1:
                    login(socket);
                    break;
                case 2:
                    register(socket);
                    break;
                default:
                    System.out.println("没有这个选项,请重新输入");
            }
        }
    }

    private static void login(Socket socket) throws IOException {
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

        Scanner sc = new Scanner(System.in);
        //第二步:向服务器发送用户信息
        System.out.println("请输入用户名:");
        String username = sc.nextLine();
        System.out.println("请输入密码:");
        String password = sc.nextLine();

        StringBuffer sb = new StringBuffer();
        sb.append("username=").append(username).append("&password=").append(password);

        //第一次向服务器发送登录信号
        bw.write("login");
        bw.newLine();
        bw.flush();

        //第二次向服务器发送输入的用户密码进行校验
        bw.write(sb.toString());
        bw.newLine();
        bw.flush();

        //第二步:接收服务器反馈
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String flag = br.readLine();
        System.out.println(flag);
        switch (flag) {
            case "1" -> {
                System.out.println("登录成功!");
                System.out.println("登录成功,开始聊天");


                //创建一个线程读取服务器发来的信息
                new ClientMythread(socket).start();

                //向服务器写出信息
                talkToClient(bw);
            }


            case "2" -> System.out.println("密码输入错误");

            case "3" -> System.out.println("用户名不存在");

        }


    }


    private static void talkToClient(BufferedWriter bw) throws IOException {

        while (true) {
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入您想说的话:");
            String message = sc.nextLine();
            bw.write(message);
            //换行
            bw.newLine();
            //清空缓冲区
            bw.flush();
        }
    }

    private static void register(Socket socket) throws IOException {
        //客户端发送
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

        Scanner sc = new Scanner(System.in);
        //第二步:向服务器发送用户信息
        System.out.println("请输入用户名:");
        String username = sc.nextLine();
        System.out.println("请输入密码:");
        String password = sc.nextLine();
        System.out.println("请再次输入密码:");
        String password2 = sc.nextLine();

        if (!password.equals(password2)) {
            System.out.println("两次密码不一致,请重新输入");
            return;
        }

        if (!username.matches("[a-zA-Z]{6,18}") || !password.matches("[a-zA-Z]\\d{2,7}")) {
            System.out.println("用户名或密码格式错误,用户名6到18位纯字母,密码长度3-8位,第一位必须是大写或者小写的字母,后面必须是纯数字");
            return;
        }

        StringBuffer sb = new StringBuffer();
        sb.append("username=").append(username).append("&password=").append(password);

        //第一次向服务器发送登录信号
        bw.write("register");
        bw.newLine();
        bw.flush();

        //第二次向服务器发送输入的用户密码进行校验
        bw.write(sb.toString());
        bw.newLine();
        bw.flush();

        //第二步:接收服务器反馈
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String flag = br.readLine();
        System.out.println(flag);
        switch (flag) {
            case "1" -> System.out.println("已经存在该用户");
            case "2" -> System.out.println("注册成功!");
        }
    }
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

class ClientMyRunnable implements Runnable{
    Socket socket;
    public ClientMyRunnable(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {

        //循环,重复的接受
        while (true) {
            try {
                //接收服务器发送过来的聊天记录
                BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                String msg = br.readLine();
                System.out.println(msg );
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
package chattingSoftware.server;


import java.io.*;
import java.net.Socket;
import java.util.Properties;


public class MyThread extends Thread {
    static Properties prep;
    static Socket socket;

    public MyThread(Properties prep, Socket socket  ) {

        this.prep = prep;
        this.socket = socket;
    }

    @Override
    public void run() {
            System.out.println("连接上客户端");

        while (true) {
            try {
                //接收客户端的信息
                BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                String line = br.readLine();
                switch (line) {
                    case "login"-> loginJudge(br);
                    case "register"-> registerJudge(br);
                }
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }

    private void registerJudge(BufferedReader br) throws IOException {
        System.out.println("用户选择了注册操作");
        String userInfo = br.readLine();
        String usernameInput = userInfo.split("&")[0].split("=")[1];
        String passwordInput = userInfo.split("&")[1].split("=")[1];
        System.out.println("用户注册输入的用户名:"+usernameInput);
        System.out.println("用户注册输入的密码:"+passwordInput);

        if(prep.containsKey(usernameInput)){
           //包含本地文件,返回1
            writeMessageToClient("1");
            System.out.println("注册新用户失败,原因:已存在该用户");
        }else {
            //不包含用户名,保存至本地文件,返回2

            //保存至本地文件
            String user = usernameInput + "=" + passwordInput;
            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("mysocketnet/user.txt", true));
            bos.write(user.getBytes());
            bos.close();

            //向用户发送标记
            writeMessageToClient("2");
            System.out.println("注册成功,已将新用户信息存储在本地文件");
        }
    }


    private static void loginJudge(BufferedReader br) throws IOException {
        System.out.println("用户选择了登录操作");
        String userInfo = br.readLine();
        String usernameInput = userInfo.split("&")[0].split("=")[1];
        String passwordInput = userInfo.split("&")[1].split("=")[1];
        System.out.println("用户输入的用户名:"+usernameInput);
        System.out.println("用户输入的密码:"+passwordInput);

        if(prep.containsKey(usernameInput)){
            System.out.println(prep);
            //包含用户名
            String rightpasswordInput = prep.get(usernameInput) + "";
            System.out.println(rightpasswordInput);
            if(rightpasswordInput.equals(passwordInput)){
                //登录成功,提示用户可以开始聊天
                writeMessageToClient("1");
                //将当前客户添加到集合
                Server.list.add(socket);
                //读取客户端发送的信息并且群发
                tallToAll(br,usernameInput);
                System.out.println("1");
            }else {
                //密码错误,返回2
                writeMessageToClient("2");
                System.out.println("2");
            }
        }else {
            //不包含用户名,直接返回3
            writeMessageToClient("3");
            System.out.println("3");
        }
    }

    private static void tallToAll(BufferedReader br, String usernameInput) throws IOException {
        while (true) {
            //获取客户端发送的信息
            String line = br.readLine();
            System.out.println(usernameInput+"发送了一条消息:"+line);

            //向所有客户端群发信息
            for (Socket s : Server.list) {
                writeMessageToClient(s,usernameInput,line);
            }
        }
    }

    private static void writeMessageToClient(String flag) throws IOException {
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        bw.write(flag);
        //换行
        bw.newLine();
        //清空缓冲区
        bw.flush();
    }

    private static void writeMessageToClient(Socket s,String username,String message) throws IOException {
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        bw.write(username+"发送了一条消息:"+message);
        //换行
        bw.newLine();
        //清空缓冲区
        bw.flush();
    }
}
package chattingSoftware.server;

import java.io.FileInputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Properties;

public class Server {
//存放socket对象
static ArrayList<Socket> list = new ArrayList<Socket>();
    public static void main(String[] args) throws IOException {
        ServerSocket ss = new ServerSocket(10086);

        //把本地文件中的用户信息获取到
        Properties prop = new Properties();
        FileInputStream fis = new FileInputStream("mysocketnet/user.txt");
        prop.load(fis);
        fis.close();
        System.out.println(prop);

        while (true) {
            //只要有一个客户端来连接服务器就打开一个线程
            Socket socket = ss.accept();
            System.out.println("有客户端来连接");
            new MyThread(prop, socket).start();
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
多人聊天室是一种通过互联网连接多个用户进行实时交流的应用程序。在Java中实现一个多人聊天室需要包括以下几个主要部分:服务器端、客户端和注册功能。 服务器端是聊天室的核心组件,负责接收和处理客户端的连接请求,并转发消息给其他在线用户。它需要使用Java的Socket和ServerSocket类来建立与客户端的通信连接,并使用多线程实现多个用户的同时连接和消息分发。服务器端还需要维护用户列表,记录用户的信息,如用户名、IP地址等。 客户端是用户使用的程序,可以通过GUI界面或命令行与服务器端进行通信。在多人聊天室中,客户端需要与服务器建立连接,并发送和接收消息。客户端也需要使用Java的Socket类来与服务器进行通信。当用户发送消息时,客户端将消息发送给服务器端,服务器端再将该消息转发给其他在线用户。当客户端接收到其他用户发送的消息时,它会将消息显示在用户界面上。 注册功能是实现用户账号管理的一部分。用户需要提供一个唯一的用户名和密码进行注册,并且在登陆聊天室时需要验证用户名和密码。在Java中,可以将用户账号信息存储在数据库中,如MySQL或SQLite。注册功能还需要实现用户名和密码的校验,确保用户输入的信息符合规范。 总结起来,实现一个含有注册功能的多人聊天室需要编写服务器端和客户端的Java代码,使用Socket类进行通信,并使用多线程实现多个用户的同时连接和消息处理。还需要设计和实现用户账号管理功能,包括注册和登陆验证。通过这些步骤,就可以实现一个基本的多人聊天室应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值