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服务器已关闭..."); } } }