Skip to content
This repository was archived by the owner on May 23, 2022. It is now read-only.

Commit 7746644

Browse files
authored
Merge pull request #2 from MCUmbrella/multithreaded-connection-processing-test
1.2 update
2 parents 4fd3cb2 + 0aae3c2 commit 7746644

File tree

2 files changed

+101
-76
lines changed

2 files changed

+101
-76
lines changed

bungee.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
name: CSLBungeeServer
22
main: vip.floatationdevice.mcumbrella.cslbungee.server.CSLBS
3-
version: 1.1.0
3+
version: 1.2.0
44
author: MCUmbrella

src/vip/floatationdevice/mcumbrella/cslbungee/server/CSLBS.java

Lines changed: 100 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
11
package vip.floatationdevice.mcumbrella.cslbungee.server;
22

33
import net.md_5.bungee.api.plugin.*;
4+
import net.md_5.bungee.BungeeCord;
45

56
import java.net.*;
7+
import java.text.SimpleDateFormat;
68
import java.io.*;
79
import java.util.*;
10+
811
public class CSLBS extends Plugin
912
{
1013
int port=14514;
1114
public static CSLBS main;
12-
long round;
13-
boolean valid=false;
15+
long round=0;
1416
static HashMap<String, Boolean> P = new HashMap<String, Boolean>();
1517
static HashSet<String> cmdWhitelist = new HashSet<String>();
1618
public void onEnable()
@@ -40,7 +42,7 @@ public void onEnable()
4042
bw.flush();
4143
bw.close();
4244
}
43-
BufferedReader br = new BufferedReader(new FileReader("cmdWhitelist.txt"));
45+
BufferedReader br = new BufferedReader(new FileReader(file));
4446
String str;
4547
while((str = br.readLine()) != null)
4648
{
@@ -49,7 +51,7 @@ public void onEnable()
4951
br.close();
5052
}catch(Throwable e)
5153
{
52-
getLogger().warning("Error reading/creating command whitelist("+this.getDataFolder().toPath()+File.separator+"cmdWhitelist.txt"+"). Using default values. ("+e.toString()+")");
54+
getLogger().severe("Error reading/creating command whitelist("+this.getDataFolder().toPath()+File.separator+"cmdWhitelist.txt"+"). Using default values. ("+e.toString()+")");
5355
cmdWhitelist.add("/login");
5456
cmdWhitelist.add("/register");
5557
cmdWhitelist.add("/l");
@@ -72,93 +74,116 @@ public void run()
7274
System.out.println("CSLBungee server listening on port:"+port);
7375
for(;;)
7476
{
75-
round++;
76-
//getLogger().info("Round "+round); DEBUG
77+
//getLogger().info("Round^ "+round); DEBUG
7778
Socket socket = server.accept();
78-
//getLogger().info("Incoming connection"); DEBUG
79-
valid=true;
80-
Thread t=new Thread("CSLBungee-Server Connection Timer")
79+
80+
81+
new Thread("CSLBungee-Server Connection Processor")
8182
{
83+
boolean dataValid=true;
8284
public void run()
8385
{
84-
//getLogger().info("Timer started"); DEBUG
85-
try {
86-
Thread.sleep(1000);
87-
socket.close();
88-
valid=false;
86+
long thisRound=++round; //used for debug and counting rounds
87+
//getLogger().info("Round "+thisRound); DEBUG
88+
89+
/* Timer: used to detect if a round took too many time to process.
90+
* Doesn't work as expected.
91+
* Fortunately it doesn't seem to have much impact on this version of CSLBungee Server.
92+
* Expected: Skip a round which took more than 1s to process.
93+
new Thread("CSLBungee-Server Connection Timer")
94+
{
95+
public void run()
96+
{
97+
//getLogger().info("Timer started"); DEBUG
98+
try {
99+
Thread.sleep(1000);
100+
if(!dataValid) {socket.close();getLogger().warning("Round "+thisRound+" took more 1s to process. Skipping");}
101+
} catch (Throwable e) {
102+
e.printStackTrace();
103+
}
104+
}
105+
}.start();
106+
*/
107+
108+
InputStream inputStream = null;
109+
try {
110+
inputStream = socket.getInputStream();
89111
} catch (Throwable e) {
112+
dataValid=false;
113+
getLogger().severe("Error initializing round "+thisRound+":");
90114
e.printStackTrace();
91115
}
92-
}
93-
};
94-
t.start();
95-
96-
InputStream inputStream = socket.getInputStream();
97-
byte[] bytes = new byte[64];
98-
int len;
99-
StringBuilder sb = new StringBuilder();
100-
try
101-
{
102-
while ((len = inputStream.read(bytes)) != -1) {
103-
sb.append(new String(bytes, 0, len,"UTF-8"));
104-
if(sb.toString().startsWith("GET "))
105-
{
106-
valid=false;
107-
try
108-
{
109-
OutputStreamWriter osw = new OutputStreamWriter(socket.getOutputStream(),"utf-8");
110-
osw.write("HTTP/1.1 400 Bad Request\r\n");
111-
osw.write("Server: CSLBungee-Server/1.0\r\n");
112-
osw.write("Content-Type: text/html;charset=UTF-8\r\n");
113-
osw.write("Transfer-Encoding: chunked\r\n");
114-
osw.write("Date: Sat, 1 Jan 1921 00:00:01 GMT\r\n");
115-
osw.write("\r\n");
116-
osw.write("c9\r\n");
117-
osw.write("<!DOCTYPE HTML>\r\n");
118-
osw.write("<html><body><center><h1>HTTP REQUEST NOT ALLOWED</h1><hr>CSLBungee-Server Version 1.0</center></body></html>\r\n");
119-
osw.flush();
120-
osw.close();
121-
socket.close();
122-
}catch(Throwable e) {socket.close();}
123-
break;
124-
}
125-
else if(!sb.toString().startsWith("CSLBungee-Client-1.0"))
126-
{
127-
valid=false;
128-
//getLogger().warning("Bad data received: \n"+sb+"\n================================"); DEBUG
129-
socket.close();
130-
break;
131-
}
132-
else
133-
{
134-
if(valid){
135-
socket.close();
136-
String[] data=sb.toString().split("\r\n");
137-
if(data.length!=3) {getLogger().warning("Bad data received(Round="+round+"):\n"+sb+"\n================================");break;}
138-
getLogger().info("CSLBungee Client connected");
139-
if(data[1].equals("S"))
116+
byte[] bytes = new byte[64];
117+
int len;
118+
StringBuilder sb = new StringBuilder();
119+
try
120+
{
121+
while ((len = inputStream.read(bytes)) != -1) {
122+
sb.append(new String(bytes, 0, len,"UTF-8"));
123+
if(sb.toString().startsWith("GET "))
140124
{
141-
P.replace(data[2],true);
142-
getLogger().info("Set player '"+data[2]+"' status to 'logged in'");
125+
dataValid=false;
126+
try
127+
{
128+
SimpleDateFormat sdf=new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.US);
129+
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
130+
String httpdate=sdf.format(new Date());
131+
OutputStreamWriter osw = new OutputStreamWriter(socket.getOutputStream(),"utf-8");
132+
osw.write("HTTP/1.1 400 Bad Request\r\n");
133+
osw.write("Server: CSLBungee-Server/1.2\r\n");
134+
osw.write("Content-Type: text/html;charset=UTF-8\r\n");
135+
osw.write("Transfer-Encoding: chunked\r\n");
136+
osw.write("Date: "+httpdate+"\r\n");
137+
osw.write("\r\n");
138+
osw.write("c9\r\n");
139+
osw.write("<!DOCTYPE HTML>\r\n");
140+
osw.write("<html><head><title>"+thisRound+"</title></head><body><center><h1>CSLBungee Server V1.2 Running</h1><hr>"+httpdate+"</center></body></html>\r\n");
141+
osw.flush();
142+
osw.close();
143+
socket.close();
144+
}catch(Throwable e) {socket.close();}
145+
break;
143146
}
144-
else if(data[1].equals("U"))
147+
else if(!sb.toString().startsWith("CSLBungee-Client-1.0"))
145148
{
146-
P.replace(data[2],false);
147-
getLogger().info("Set player '"+data[2]+"' status to 'not logged in'");
149+
dataValid=false;
150+
//getLogger().warning("Round "+thisRound+" bad data received:\n"+sb+"\n================================"); DEBUG
151+
socket.close();
152+
break;
148153
}
149154
else
150155
{
151-
getLogger().warning("Bad data received(Round="+round+"):\n"+sb+"\n================================");
156+
if(dataValid){
157+
socket.close();
158+
String[] data=sb.toString().split("\r\n");
159+
if(data.length!=3) {getLogger().warning("Round "+thisRound+" bad data received:\n"+sb+"\n================================");break;}
160+
//getLogger().info("CSLBungee Client connected"); DEBUG
161+
if(data[1].equals("S"))
162+
{
163+
P.replace(data[2],true);
164+
getLogger().info("Set player '"+data[2]+"' status to 'logged in'");
165+
}
166+
else if(data[1].equals("U"))
167+
{
168+
P.replace(data[2],false);
169+
getLogger().info("Set player '"+data[2]+"' status to 'not logged in'");
170+
}
171+
else
172+
{
173+
getLogger().warning("Round "+thisRound+" bad data received:\n"+sb+"\n================================");
174+
}
175+
break;
176+
};break;
152177
}
153-
break;
154-
};break;
155-
}
156-
}
178+
}
157179

158-
}catch(Throwable e){valid=false; /*getLogger().warning("ERROR PROCESSING DATA: "+e.toString());*/ socket.close();continue;}
159-
180+
}catch(Throwable e) {}
181+
//getLogger().info("Round "+thisRound+" end"); DEBUG
182+
}
183+
}.start();
184+
160185
}
161-
}catch(Throwable e) {getLogger().warning("CSLBungee SERVER ERROR(Round="+round+"):");e.printStackTrace();System.exit(-1);}
186+
}catch(Throwable e) {getLogger().severe("CSLBungee SERVER ERROR (round="+round+"):");e.printStackTrace();BungeeCord.getInstance().stop("CSLBungee Server thread error");System.exit(-1);}
162187
}
163188
}.start();
164189
getLogger().info("Enabled.");

0 commit comments

Comments
 (0)