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