2015-07-25 10:15:14 +00:00
|
|
|
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;
|
|
|
|
|
2015-07-28 13:02:56 +00:00
|
|
|
import org.bukkit.Bukkit;
|
|
|
|
|
2015-07-27 13:14:51 +00:00
|
|
|
import cn.citycraft.CTZLoginServer.CTZLoginServer;
|
2015-07-28 13:02:56 +00:00
|
|
|
import cn.citycraft.CTZLoginServer.Socket.Response.HttpStates;
|
2015-07-27 13:14:51 +00:00
|
|
|
import fr.xephi.authme.api.API;
|
2015-07-25 10:15:14 +00:00
|
|
|
|
2015-07-27 13:14:51 +00:00
|
|
|
public class CTZLoginServerSocket implements Runnable {
|
|
|
|
|
|
|
|
public int PORT = 8080;
|
|
|
|
public CTZLoginServer plugin;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 初始化服务端口
|
|
|
|
*/
|
|
|
|
public CTZLoginServerSocket(CTZLoginServer plugin, int port) {
|
|
|
|
this.plugin = plugin;
|
|
|
|
PORT = port;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void run() {
|
2015-07-25 10:15:14 +00:00
|
|
|
ServerSocket s = null;
|
|
|
|
Socket socket = null;
|
2015-07-28 13:02:56 +00:00
|
|
|
|
2015-07-25 10:15:14 +00:00
|
|
|
try {
|
2015-07-27 13:14:51 +00:00
|
|
|
// 设定服务端的端口号
|
2015-07-28 13:02:56 +00:00
|
|
|
s = new ServerSocket(2000);
|
|
|
|
System.out.println("CTZL服务器开始监听 端口:" + s.getLocalPort());
|
2015-07-27 13:14:51 +00:00
|
|
|
// 等待请求,此方法会一直阻塞,直到获得请求才往下走
|
|
|
|
while (true) {
|
|
|
|
socket = s.accept();
|
2015-07-28 13:02:56 +00:00
|
|
|
System.out.println("CTZL服务器收到请求 客户端IP: " + socket.getRemoteSocketAddress() + " 端口:"
|
|
|
|
+ socket.getPort());
|
|
|
|
new ClientThread(socket).start();
|
2015-07-25 10:15:14 +00:00
|
|
|
}
|
|
|
|
} catch (Exception e) {
|
2015-07-27 13:14:51 +00:00
|
|
|
System.out.println("CTZL服务器崩溃...");
|
|
|
|
} finally {
|
|
|
|
System.out.println("关闭连接");
|
2015-07-25 10:15:14 +00:00
|
|
|
try {
|
|
|
|
socket.close();
|
|
|
|
s.close();
|
|
|
|
} catch (Exception e2) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-07-28 13:02:56 +00:00
|
|
|
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) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|