txt文件:

zhangsan=123
lisi=1234
wangwu=12345


Client类:

package Day32;

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",10001);
        System.out.println("服务器连接成功!");

        while (true) {
            System.out.println("**********欢迎来到黑马聊天室********");
            System.out.println("1.登录");
            System.out.println("2.注册");
            System.out.println("输入你的选择: ");

            Scanner sc = new Scanner(System.in);
            String choose=sc.nextLine();
            switch (choose){
                case "1"-> login(socket);
                case "2"-> System.out.println("用户选择了注册");
                default -> System.out.println("没有这个选项");
            }
        }

    }

    public 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();

        //按txt里的格式拼接
        StringBuilder sb = new StringBuilder();
        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 message=br.readLine();
        System.out.println(message);
        //1.登录成功  2.密码有误  3.用户名不存在
        if ("1".equals(message)){
            System.out.println("登录成功,开始聊天");
            //开通一条线程接收服务端信息
            new Thread(new ClientMyRunnable(socket)).start();
            //聊天
            talkAll(bw);
        } else if ("2".equals(message)) {
            System.out.println("密码错误");
        } else if ("3".equals(message)) {
            System.out.println("用户名不存在");
        }
    }

    //向服务器写出消息
    public static void talkAll(BufferedWriter bw) throws IOException {
        Scanner sc = new Scanner(System.in);
        while(true){
            System.out.println("输入你要说的:");
            String talk = sc.nextLine();
            bw.write(talk);
            bw.newLine();
            bw.flush();
        }
    }

}

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) {
                throw new RuntimeException(e);
            }
        }

    }
}


Server类:

package Day32;

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

public class Server {

    static ArrayList<Socket> list=new ArrayList<>();

    public static void main(String[] args) throws IOException {

        ServerSocket ss = new ServerSocket(10001);

        //1.获取本地文件正确的文档
        Properties properties = new Properties();
        FileInputStream fis=new FileInputStream("D:\\Study\\Code\\Java\\Base\\src\\Day32\\user.txt");
        properties.load(fis);
        fis.close();

        //2.接收客户端数据进行判断
        //只要来一个客户端,就开通一条线程
        while(true){
            Socket socket = ss.accept();
            System.out.println("有客户端来连接");
            new Thread(new MyRunnable(socket,properties)).start();
        }

    }
}

class MyRunnable implements Runnable{
    Socket socket;
    Properties properties;
    public MyRunnable(Socket socket, Properties properties) {
        this.properties=properties;
        this.socket=socket;
    }

    @Override
    public void run() {
        //接收用户发送的数据
        try {
            BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));

            while (true) {
                String choose=br.readLine();
                switch (choose){
                    case "login"-> login(br);
                    case "register"-> System.out.println("注册");
                }
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    //获取用户登录时传递信息进行判断
    public void login(BufferedReader br) throws IOException {
        System.out.println("用户选择登录");
        String userinfo=br.readLine();//第二次读取是读取用户传递信息
        String[] userinfoArr=userinfo.split("&");
        String usernameInput=userinfoArr[0].split("=")[1];
        String passwordInput=userinfoArr[1].split("=")[1];

        if (properties.containsKey(usernameInput)){
            //用户名存在
            String rightPassword = (String) properties.get(usernameInput);
            if (passwordInput.equals(rightPassword)){
                writeMessage("1");
                //开始聊天
                Server.list.add(socket);
                //接收消息
                talkAll(br,usernameInput);
            }else{
                writeMessage("2");
            }
        }else {
            //用户名不存在
            writeMessage("3");
        }
    }

    public void talkAll(BufferedReader br,String username) throws IOException {
        while(true){
            String message = br.readLine();
            System.out.println(username+"发送消息:"+message);

            //群发
            for (Socket s : Server.list) {
                writeMessage(s,message);
            }
        }
    }

    public void writeMessage(Socket socket,String message) throws IOException {
        BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        bw.write(message);
        bw.newLine();
        bw.flush();
    }

    public void writeMessage(String message) throws IOException {
        //获取输出流
        BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        bw.write(message);
        bw.newLine();
        bw.flush();
    }
}


扩展

一、Properties集合的特点 Properties集合的特点如下:

键值对存储:Properties集合以键值对的形式存储数据,每个键和值都是字符串类型。 持久化:Properties集合可以将数据保存到文件中,并从文件中加载数据,实现持久化存储和读取。 读写配置信息:Properties集合常用于读取和写入配置信息,如应用程序的配置文件、数据库连接信息等。 线程安全:Properties集合是线程安全的,可以在多线程环境中使用。 二、Properties集合的使用方法 1、创建Properties对象 可以通过以下方式创建Properties对象:

Properties properties = new Properties();

1 2、添加键值对 使用setProperty(key, value)方法可以向Properties对象中添加键值对:

properties.setProperty("key1", "value1"); properties.setProperty("key2", "value2");

1 2 3、获取键对应的值 可以使用getProperty(key)方法获取指定键对应的值:

String value = properties.getProperty("key1");

1 4、遍历Properties集合 可以使用keySet()方法获取Properties集合中所有的键,然后通过遍历键集来获取对应的值:

Set<String> keys = properties.keySet(); for (String key : keys) { String value = properties.getProperty(key); System.out.println(key + ": " + value); }

1 2 3 4 5 5、从文件加载数据 使用load(InputStream)方法可以从文件中加载Properties集合的数据:

try (InputStream is = new FileInputStream("config.properties")) { properties.load(is); } catch (IOException e) { e.printStackTrace(); }

1 2 3 4 5 6、将数据保存到文件 可以使用store(OutputStream, comments)方法将Properties集合的数据保存到文件:

try (OutputStream os = new FileOutputStream("config.properties")) { properties.store(os, "Configuration"); } catch (IOException e) { e.printStackTrace(); } 1 2 3 4 5

三、示例代码 下面是一个示例代码,展示了如何使用Properties集合读取和写入配置信息:

import java.io.*; import java.util.Properties;
public class ConfigExample { public static void main(String[] args) { // 创建Properties对象 Properties properties = new Properties();
 
   // 从文件加载配置信息
    try (InputStream is = new FileInputStream("config.properties")) {
        properties.load(is);
    } catch (IOException e) {
        e.printStackTrace();
    }

    // 读取配置信息
    String host = properties.getProperty("host");
    int port = Integer.parseInt(properties.getProperty("port"));
    String username = properties.getProperty("username");
    String password = properties.getProperty("password");

    System.out.println("Host: " + host);
    System.out.println("Port: " + port);
    System.out.println("Username: " + username);
    System.out.println("Password: " + password);
 
 
   // 修改配置信息
    properties.setProperty("port", "8080");
    properties.setProperty("password", "newpassword");

    // 将修改后的配置信息保存到文件
    try (OutputStream os = new FileOutputStream("config.properties")) {
        properties.store(os, "Configuration");
    } catch (IOException e) {
        e.printStackTrace();
    }
}
 
}