package cn.citycraft.CTZServer.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 cn.citycraft.CTZServer.socket.Response.HttpStates; import cn.citycraft.CTZServerCommon.CTZAuth; import cn.citycraft.CTZServerCommon.CTZServer; import net.md_5.bungee.api.ChatColor; public class CTZLoginServerSocket extends Thread { 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) { CTZServer.print(str); Request req = new Request(str); Response res = new Response(); String username = ""; String password = ""; String email = ""; if (req.isSuccess) { switch (req.getPrefix().substring(1)) { case "isregistered": username = req.Query("username"); if (username == null) { res.setState(HttpStates.Bad_Request); break; } if (CTZAuth.isRegistered(username)) res.setHtml("true"); else res.setHtml("false"); break; case "register": username = req.Query("username"); password = req.Query("password"); email = req.Query("email"); if (username == null || password == null || email == null) { res.setState(HttpStates.Bad_Request); break; } if (CTZAuth.registerPlayer(username, password, email)) { res.setHtml("true"); CTZServer.print("§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 (CTZAuth.checkPassword(username, password)) { res.setHtml("true"); CTZAuth.login(username, ip); CTZServer.print("§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 (CTZAuth.isLogin(username)) 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 (CTZAuth.checkPassword(username, password)) { res.setHtml("true"); CTZAuth.changePassword(username, password); } else res.setHtml("false"); break; case "serverlist": res.setState(HttpStates.OK); CTZServer.print(CTZServer.getJson()); res.setHtml(CTZServer.getJson()); break; default: res.setState(HttpStates.Bad_Request); } pw.write(res.toString()); pw.flush(); } break; } } br.close(); pw.close(); client.close(); } catch (Exception e) { CTZServer.warn(e.getMessage()); e.printStackTrace(); } } } ServerSocket s = null; Socket socket = null; int port = 25580; /** * 初始化服务端口 */ public CTZLoginServerSocket() { } /** * 初始化服务端口 */ public CTZLoginServerSocket(int port) { this.port = port; } @Override public void run() { try { // 设定服务端的端口号 s = new ServerSocket(port); CTZServer.print(ChatColor.BLUE + "CTZ服务器开始监听 端口:" + s.getLocalPort()); // 等待请求,此方法会一直阻塞,直到获得请求才往下走 while (true) { socket = s.accept(); new ClientThread(socket).start(); } } catch (Exception e) { CTZServer.print(ChatColor.RED + "CTZ服务器崩溃: " + e.getMessage()); } finally { ShutDown(); } } /** * 关闭服务器 */ public void ShutDown() { try { socket.close(); s.close(); } catch (Exception e) { } CTZServer.print(ChatColor.RED + "CTZ服务器已关闭..."); System.exit(0); } }