Day40-Java基础之聊天室项目

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

}

  • 10
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值