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 org.bukkit.ChatColor; import cn.citycraft.CTZServer.CTZServer; import cn.citycraft.CTZServer.socket.Response.HttpStates; public class CTZLoginServerSocket extends Thread { 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.getLogger().info(ChatColor.BLUE + "CTZ服务器开始监听 端口:" + s.getLocalPort()); // 等待请求,此方法会一直阻塞,直到获得请求才往下走 while (true) { socket = s.accept(); new ClientThread(socket).start(); } } catch (Exception e) { CTZServer.getLogger().warning(ChatColor.RED + "CTZ服务器崩溃: " + e.getMessage()); } finally { ShutDown(); } } /** * 关闭服务器 */ public void ShutDown() { try { socket.close(); s.close(); } catch (Exception e) { } CTZServer.getLogger().info(ChatColor.RED + "CTZ服务器已关闭..."); System.exit(0); } 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(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) { } } } }