CTZLoginServer/src/cn/citycraft/CTZLoginServer/Socket/CTZLoginServerSocket.java

185 lines
5.2 KiB
Java

package cn.citycraft.CTZLoginServer.Socket;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import org.bukkit.Bukkit;
import cn.citycraft.CTZLoginServer.CTZLoginQueue;
import cn.citycraft.CTZLoginServer.CTZLoginServer;
import cn.citycraft.CTZLoginServer.CTZServers;
import cn.citycraft.CTZLoginServer.Socket.Response.HttpStates;
import fr.xephi.authme.api.API;
public class CTZLoginServerSocket implements Runnable {
class ClientThread extends Thread {
Socket client = null;
BufferedReader br = null;
PrintWriter pw = null;
String ip = null;
public ClientThread(Socket client) {
this.client = client;
}
@Override
public void run() {
try {
// 用于接收客户端发来的请求
br = new BufferedReader(new InputStreamReader(client.getInputStream()));
// 用于发送返回信息,可以不需要装饰这么多io流使用缓冲流时发送数据要注意调用.flush()方法
pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(client.getOutputStream())), true);
ip = client.getInetAddress().getHostAddress();
while (true) {
String str = br.readLine();
if (str != null) {
Request req = new Request(str);
Response res = new Response();
String username = "";
String password = "";
if (req.isSuccess) {
switch (req.getPrefix().substring(1)) {
case "isregistered":
username = req.Query("username");
if (username == null) {
res.setState(HttpStates.Bad_Request);
break;
}
if (API.isRegistered(username)) {
res.setHtml("true");
} else {
res.setHtml("false");
}
break;
case "register":
username = req.Query("username");
password = req.Query("password");
if (username == null || password == null) {
res.setState(HttpStates.Bad_Request);
break;
}
if (API.registerPlayer(username, password)) {
res.setHtml("true");
Bukkit.getConsoleSender().sendMessage("§6玩家: §a" + username + " §d注册成功 IP: " + ip);
} else {
res.setHtml("false");
}
break;
case "login":
username = req.Query("username");
password = req.Query("password");
if (username == null || password == null) {
res.setState(HttpStates.Bad_Request);
break;
}
if (API.checkPassword(username, password)) {
res.setHtml("true");
if (CTZLoginQueue.isCheckIP()) {
CTZLoginQueue.add(username, ip);
} else {
CTZLoginQueue.add(username);
}
Bukkit.getConsoleSender().sendMessage("§6玩家: §a" + username + " §3登录成功 IP: " + ip);
} else {
res.setHtml("false");
}
break;
case "islogin":
username = req.Query("username");
if (username == null) {
res.setState(HttpStates.Bad_Request);
break;
}
if (Bukkit.getPlayer(username) != null) {
res.setHtml("true");
} else {
res.setHtml("false");
}
break;
case "changepassword":
username = req.Query("username");
password = req.Query("password");
if (username == null || password == null) {
res.setState(HttpStates.Bad_Request);
break;
}
if (API.checkPassword(username, password)) {
res.setHtml("true");
// TODO 处理玩家密码修改事件
} else {
res.setHtml("false");
}
break;
case "serverlist":
res.setState(HttpStates.OK);
res.setHtml(CTZServers.getJson());
break;
default:
res.setState(HttpStates.Bad_Request);
}
pw.write(res.toString());
pw.flush();
}
break;
}
}
br.close();
pw.close();
client.close();
} catch (Exception e) {
}
}
}
ServerSocket s = null;
Socket socket = null;
public int port = 25580;
public CTZLoginServer plugin;
/**
* 初始化服务端口
*/
public CTZLoginServerSocket(CTZLoginServer plugin, int port) {
this.plugin = plugin;
this.port = port;
}
@Override
public void run() {
try {
// 设定服务端的端口号
s = new ServerSocket(port);
System.out.println("CTZL服务器开始监听 端口:" + s.getLocalPort());
// 等待请求,此方法会一直阻塞,直到获得请求才往下走
while (true) {
socket = s.accept();
new ClientThread(socket).start();
}
} catch (Exception e) {
System.out.println("CTZL服务器崩溃...");
} finally {
System.out.println("CTZL服务器已关闭...");
try {
socket.close();
s.close();
} catch (Exception e2) {
}
}
}
public void ShutDown() {
try {
socket.close();
s.close();
} catch (Exception e) {
System.out.println("CTZL服务器已关闭...");
}
}
}