说明:本程序为完整程序,分为客户端和服务端,可以直接使用,带详细注释
===========================服务端===========================
/*
* 登录和注册程序:
* 1. 客户端月服务端连接时,提示客户端选择功能:
* 2. 注册:客户端注册的时候,用户名和密码都是发送给服务端的,服务端需要把数据保存在服务端的文件上;
* 3. 登录:登录的时候客户端输入用户名和密码发送给服务校验并返回登录结果给客户端
*/
//服务端处理注册和登录程序
package com.lin.michael;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Properties;
public class LoginServer extends Thread{
//引用来自客户端的socket
Socket socket;
static File file = new File("c:\\users.properties");
//构造方法
public LoginServer(Socket socket){
this.socket = socket;
}
//静态代码块
static{
try {
//判断用户文件是否存在,如果不存在,就创建一个
if(!file.exists()){
file.createNewFile();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void run() {
try {
//1.获取用户的输入流通道,目的是获取用户的读取用户的数据;
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//1-2 获取socket的输出通道,目的是发送信息给客户端
OutputStreamWriter socketOut = new OutputStreamWriter(socket.getOutputStream());
//2.循环读取用户数据
while(true){
String info = bufferedReader.readLine();
//3.处理用户的数据
String[] datas = info.split(":");
String option = datas[0];
String userName = datas[1];
String password = datas[2];
//3-1 判断用户的选择
if("a".equalsIgnoreCase(option)){
//用户选择的是a 登录
Properties properties = new Properties();
//加载配置文件
properties.load(new FileReader(file));
if(properties.contains(userName)){
String filePwd = properties.getProperty(userName);
if(filePwd.equals(password)){
socketOut.write("欢迎" + userName + "登录!\r\n");
}else{
socketOut.write("密码错误!\r\n");
}
}else{
socketOut.write("用户名不存在,请重新输入\r\n");
}
socketOut.flush();
}else if("b".equalsIgnoreCase(option)){
//用户选择的是b 注册
//创建一个配置文件
Properties properties = new Properties();
//加载配置文件
properties.load(new FileReader(file));
//判断用户名是否存在
if(!properties.contains(userName)){
//用户名不存在,添加用户到配置文件
properties.setProperty(userName, password);
//保存数据到配置文件
properties.store(new FileWriter(file), "用户配置文件");
//返回注册信息
socketOut.write("注册成功\r\n");
}else{
//用户名存在,返回信息给客户端
socketOut.write("用户名已经被注册,请重新输入\r\n");
}
socketOut.flush();
}
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) throws IOException{
//1.建立服务端的TCP socket,目的是和客户端端沟通,接收和处理来自客户端的数据
ServerSocket serverSocket = new ServerSocket(9090);
//2.循环接收来自客户端的请求
while(true){
//接收客户端的请求,得到一个socket
Socket socket = serverSocket.accept();
//生成一个线程来处理客户端的饿请求数据
new LoginServer(socket).start();
}
}
}
===========================客户端===========================
/*
* 客户端接收登录和注册功能
*/
package com.lin.michael;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class LoginClient {
public static void main(String[] args) throws UnknownHostException, IOException{
//1.建立客户端的TCP Socket,目的是通过网络层与服务端实现连通;
Socket socket = new Socket(InetAddress.getLocalHost(), 9090);
//2.从socket建立输出到服务器的通道,转化成字符流
OutputStreamWriter socketOut = new OutputStreamWriter(socket.getOutputStream());
//3.获取Socket输入流对象
BufferedReader socketReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//3.从键盘接受用户输入通道,System.in是一个InputStream对象,BufferedReader没有读写功能,需要传入FileWriter
//因此,使用转换流来进行转换
BufferedReader keyReader = new BufferedReader(new InputStreamReader(System.in));
while(true){
//2.用户选择菜单
System.out.println("请选择功能:A. 登录; B.注册");
//4.读取用户输入
String option = keyReader.readLine();
//5.判断用户的选择
if("a".equalsIgnoreCase(option)){
//用户选择了登录
sendInfo(socketOut, keyReader, option, socketReader);
}else if("b".equalsIgnoreCase(option)){
//用户选择了注册
sendInfo(socketOut, keyReader, option, socketReader);
}
}
}
//定义函数:发送客户端请求并且处理来自服务端的数据
public static void sendInfo(OutputStreamWriter socketOut,
BufferedReader keyReader, String option, BufferedReader socketReader) throws IOException {
System.out.println("请输入用户名:");
String userName = keyReader.readLine();
System.out.println("请输入密码:");
String password = keyReader.readLine();
//将用户名和密码以及选项发送发送到服务端
String info = option +":" + userName + ":" + password + "\r\n";
socketOut.write(info);
socketOut.flush();
//读取服务器返回的信息
String line = socketReader.readLine();
System.out.println(line);
}
}