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.CTZLoginServer; import cn.citycraft.CTZLoginServer.Socket.Response.HttpStates; import fr.xephi.authme.api.API; 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() { ServerSocket s = null; Socket socket = null; try { // 设定服务端的端口号 s = new ServerSocket(2000); System.out.println("CTZL服务器开始监听 端口:" + s.getLocalPort()); // 等待请求,此方法会一直阻塞,直到获得请求才往下走 while (true) { socket = s.accept(); 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 { 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) { } } } }