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