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