-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathCommunication.java
136 lines (117 loc) · 4.4 KB
/
Communication.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
package cc.baka9.catseedlogin.bukkit;
import cc.baka9.catseedlogin.bukkit.database.Cache;
import cc.baka9.catseedlogin.bukkit.object.LoginPlayer;
import cc.baka9.catseedlogin.bukkit.object.LoginPlayerHelper;
import cc.baka9.catseedlogin.util.CommunicationAuth;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* bukkit 与 bc 的通讯交流
*/
public class Communication {
private static ServerSocket serverSocket;
/**
* 异步关闭 socket server
*/
public static void socketServerStopAsync() {
CatSeedLogin.instance.runTaskAsync(Communication::socketServerStop);
}
public static void socketServerStop() {
if (serverSocket != null && !serverSocket.isClosed()) {
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 异步启动 socket server 监听bc端发来的请求
*/
public static void socketServerStartAsync() {
CatSeedLogin.instance.runTaskAsync(Communication::socketServerStart);
}
/**
* 启动 socket server 监听bc端发来的请求
*/
public static void socketServerStart() {
try {
InetAddress inetAddress = InetAddress.getByName(Config.BungeeCord.Host);
serverSocket = new ServerSocket(Integer.parseInt(Config.BungeeCord.Port), 50, inetAddress);
while (!serverSocket.isClosed()) {
Socket socket;
try {
socket = serverSocket.accept();
handleRequest(socket);
} catch (IOException e) {
break;
}
}
} catch (UnknownHostException e) {
CatSeedLogin.instance.getLogger().warning("无法解析域名或IP地址");
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 处理请求
*/
private static void handleRequest(Socket socket) throws IOException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String requestType = bufferedReader.readLine();
String playerName = bufferedReader.readLine();
switch (requestType) {
case "Connect":
handleConnectRequest(socket, playerName);
break;
case "KeepLoggedIn":
String time = bufferedReader.readLine();
String sign = bufferedReader.readLine();
handleKeepLoggedInRequest(playerName, time, sign);
socket.close();
break;
default:
break;
}
}
private static void handleKeepLoggedInRequest(String playerName, String time, String sign) {
// 验证请求的合法性
// 对比玩家名,时间戳,和authKey加密的结果(加密是因为如果登录服不在内网环境下,则可能会被人使用这个功能给发包来直接绕过登录)
if (sign.equals(CommunicationAuth.encryption(playerName, time, Config.BungeeCord.AuthKey))) {
// 切换主线程给予登录状态
CatScheduler.runTask( () -> {
LoginPlayer lp = Cache.getIgnoreCase(playerName);
if (lp != null) {
LoginPlayerHelper.add(lp);
Player player = Bukkit.getPlayerExact(playerName);
if (player != null) {
player.updateInventory();
}
}
});
}
}
private static void handleConnectRequest(Socket socket, String playerName) {
// 切换主线程获取是否已登录
CatScheduler.runTask( () -> {
boolean result = LoginPlayerHelper.isLogin(playerName);
// 切换异步线程返回结果
CatSeedLogin.instance.runTaskAsync(() -> {
try {
socket.getOutputStream().write(result ? 1 : 0);
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
});
});
}
}