add HTTP Handle Class and Complete AuthMe Hook...

master
j502647092 2015-07-28 21:02:56 +08:00
parent 4fc551baeb
commit 260d6e57fd
3 changed files with 298 additions and 27 deletions

View File

@ -8,7 +8,10 @@ import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import org.bukkit.Bukkit;
import cn.citycraft.CTZLoginServer.CTZLoginServer;
import cn.citycraft.CTZLoginServer.Socket.Response.HttpStates;
import fr.xephi.authme.api.API;
public class CTZLoginServerSocket implements Runnable {
@ -28,48 +31,131 @@ public class CTZLoginServerSocket implements Runnable {
public void run() {
ServerSocket s = null;
Socket socket = null;
BufferedReader br = null;
PrintWriter pw = null;
try {
// 设定服务端的端口号
s = new ServerSocket(PORT);
System.out.println("CTZL服务器开始监听:" + s);
s = new ServerSocket(2000);
System.out.println("CTZL服务器开始监听 端口:" + s.getLocalPort());
// 等待请求,此方法会一直阻塞,直到获得请求才往下走
while (true) {
socket = s.accept();
// 用于接收客户端发来的请求
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// 用于发送返回信息,可以不需要装饰这么多io流使用缓冲流时发送数据要注意调用.flush()方法
pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(
socket.getOutputStream())), true);
while (true) {
if (socket.isClosed()) {
break;
}
String str = br.readLine();
if (str.equals("END")) {
break;
}
Thread.sleep(1000);
API.isRegistered(str);
pw.println("Message Received");
pw.flush();
}
System.out.println("CTZL服务器收到请求 客户端IP: " + socket.getRemoteSocketAddress() + " 端口:"
+ socket.getPort());
new ClientThread(socket).start();
}
} catch (Exception e) {
System.out.println("CTZL服务器崩溃...");
} finally {
System.out.println("关闭连接");
try {
br.close();
pw.close();
socket.close();
s.close();
} catch (Exception e2) {
}
}
}
}
class ClientThread extends Thread {
Socket client = null;
BufferedReader br = null;
PrintWriter pw = 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);
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 "isregister":
username = req.getQuerystring("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.getQuerystring("username");
password = req.getQuerystring("password");
if (username == null || password == null) {
res.setState(HttpStates.Bad_Request);
break;
}
if (API.registerPlayer(username, password))
res.setHtml("true");
else
res.setHtml("false");
break;
case "login":
username = req.getQuerystring("username");
password = req.getQuerystring("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 "islogin":
username = req.getQuerystring("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.getQuerystring("username");
password = req.getQuerystring("password");
if (username == null) {
res.setState(HttpStates.Bad_Request);
break;
}
if (API.checkPassword(username, password))
res.setHtml("true");
// TODO 处理玩家密码修改事件
else
res.setHtml("false");
break;
default:
res.setState(HttpStates.Bad_Request);
}
System.out.println(res.toString());
pw.write(res.toString());
pw.flush();
}
break;
}
}
br.close();
pw.close();
client.close();
} catch (Exception e) {
}
}
}
}

View File

@ -0,0 +1,106 @@
/**
*
*/
package cn.citycraft.CTZLoginServer.Socket;
import java.util.HashMap;
/**
* @author
* 20157284:58:26
* HTTP
* GET
*/
public class Request {
protected boolean isSuccess = false;
protected String prefix;
protected Method method;
protected String version;
protected HashMap<String, String> querystring = new HashMap<String, String>();
enum Method {
GET, POST
}
/**
* Response
*
* @param response
*/
public Request(String response) {
try {
String[] args = response.split(" ");
// 解析协议
if (args[0].equalsIgnoreCase(Method.GET.toString()))
method = Method.GET;
else
method = Method.POST;
// 判断是否有查询字符串
if (args[1].contains("?")) {
// 获得分割符?的位置
int lastc = args[1].indexOf("?");
// 解析URL
prefix = args[1].substring(0, lastc);
// 解析查询字符串
String[] params = args[1].substring(lastc).split("&");
for (String param : params) {
if (param.contains("=")) {
String[] paraminfo = param.split("=");
querystring.put(paraminfo[0], paraminfo[1]);
}
}
} else {
// 直接配置为区域
prefix = args[1];
}
// 解析HTTP版本
version = args[2];
isSuccess = true;
} catch (Exception e) {
}
}
/**
* @return
*/
public String getPrefix() {
return prefix;
}
/**
* @return
*/
public HashMap<String, String> getQuerystring() {
if (querystring.isEmpty())
return null;
return querystring;
}
/**
* @return
*/
public String getQuerystring(String key) {
return querystring.get(key);
}
/**
* @return
*/
public Method getMethod() {
return method;
}
/**
* @return HTTP
*/
public String getVersion() {
return version;
}
/**
* @return
*/
public boolean isSuccess() {
return isSuccess;
}
}

View File

@ -0,0 +1,79 @@
/**
*
*/
package cn.citycraft.CTZLoginServer.Socket;
import java.util.Date;
import java.util.HashMap;
import java.util.Map.Entry;
/**
* @author
* 20157287:19:28
* HTTP
*/
public class Response {
protected HttpStates state = HttpStates.OK;
protected String version = "HTTP/1.1";
protected HashMap<String, String> header = new HashMap<String, String>();
protected String html = "";
public enum HttpStates {
OK(200), // 客户端请求成功
Bad_Request(400), // 客户端请求有语法错误,不能被服务器所理解
Unauthorized(401), // 请求未经授权这个状态代码必须和WWW-Authenticate报头域一起使用
Forbidden(403), // 服务器收到请求,但是拒绝提供服务
Not_Found(404), // 请求资源不存在eg输入了错误的URL
Internal_Server_Error(500), // 服务器发生不可预期的错误
Server_Unavailable(503); // 服务器当前不能处理客户端的请求,一段时间后可能恢复正常
private int num = 0;
/**
* @return
*/
public int getNum() {
return num;
}
HttpStates(int num) {
this.num = num;
}
@Override
public String toString() {
return super.toString().replace("_", " ");
}
}
public Response() {
header.put("Date", new Date().toString() + " GMT");
header.put("Server", "Minecraft-CTZLoginServer");
header.put("Content-Type", "text/html; charset=UTF-8");
}
public void setHtml(String html) {
this.html = html;
}
public void setState(HttpStates state) {
this.state = state;
}
public void setHeader(String key, String value) {
header.put(key, value);
}
@Override
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append(version + " " + state.getNum() + " " + state.toString() + "\r\n");
for (Entry<String, String> entry : header.entrySet()) {
sb.append(entry.getKey() + ": " + entry.getValue() + "\r\n");
}
sb.append("\r\n");
sb.append(this.html);
return sb.toString();
}
}