Advertisement
Guest User

Untitled

a guest
Jun 26th, 2019
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.39 KB | None | 0 0
  1. import java.net.Socket;
  2. import java.net.SocketAddress;
  3. import java.net.InetSocketAddress;
  4. import java.io.IOException;
  5. import java.util.HashMap;
  6. import java.net.ServerSocket;
  7. import java.net.SocketTimeoutException;
  8.  
  9. public class Main
  10. {
  11. static ServerSocket serverSocket_;
  12. static HashMap<String, ServerInformation> servers_;
  13. static int verboseLevel_;
  14. static int threadTimeout_;
  15. static int masterPort_;
  16. static int serverNumber_;
  17. static int socketTimeOut_;
  18.  
  19. static {
  20. Main.serverSocket_ = null;
  21. Main.servers_ = new HashMap<String, ServerInformation>();
  22. Main.verboseLevel_ = 5;
  23. Main.threadTimeout_ = 10;
  24. Main.masterPort_ = 6510;
  25. Main.serverNumber_ = 1;
  26. Main.socketTimeOut_ = 6000;
  27. }
  28.  
  29. public static void main(final String[] args) {
  30. try {
  31. setupServerAndCleanup(Main.masterPort_);
  32. while (true) {
  33. handleIncomingConnection();
  34. }
  35. }
  36. catch (IOException e) {
  37. e.printStackTrace();
  38. }
  39. }
  40.  
  41. static void setupServerAndCleanup(final int port) throws IOException {
  42. (Main.serverSocket_ = new ServerSocket()).setReuseAddress(true);
  43. Main.serverSocket_.bind(new InetSocketAddress(Main.masterPort_));
  44. System.out.println("Server socket up and running on port " + Main.masterPort_);
  45. Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
  46. @Override
  47. public void run() {
  48. if (Main.serverSocket_ != null) {
  49. try {
  50. Main.serverSocket_.close();
  51. System.out.println("Server socket closed, port released");
  52. }
  53. catch (IOException e) {
  54. e.printStackTrace();
  55. }
  56. }
  57. }
  58. }));
  59. }
  60.  
  61. static void handleIncomingConnection() throws IOException {
  62. final Socket clientSocket = Main.serverSocket_.accept();
  63. clientSocket.setSoTimeout(Main.socketTimeOut_);
  64. final ClientThread client = new ClientThread(clientSocket);
  65. client.start();
  66. }
  67.  
  68. }
  69.  
  70. import java.util.Iterator;
  71. import java.io.IOException;
  72. import java.io.Reader;
  73. import java.io.InputStreamReader;
  74. import java.util.regex.Pattern;
  75. import java.io.BufferedReader;
  76. import java.io.PrintWriter;
  77. import java.net.Socket;
  78. import java.net.SocketTimeoutException;
  79.  
  80. public class ClientThread extends Thread
  81. {
  82. Socket clientSocket_;
  83. String clientIp_;
  84. String serverIp_;
  85. ServerInformation server_;
  86. PrintWriter out_;
  87. BufferedReader in_;
  88. boolean prepareTermination_;
  89. boolean terminated_;
  90. private static final Pattern numberPattern;
  91.  
  92. static {
  93. numberPattern = Pattern.compile("\d+");
  94. }
  95.  
  96. public ClientThread(final Socket sock) {
  97. this.clientSocket_ = sock;
  98. this.clientIp_ = this.clientSocket_.getRemoteSocketAddress().toString();
  99. this.serverIp_ = null;
  100. this.server_ = null;
  101. this.prepareTermination_ = false;
  102. this.terminated_ = false;
  103. }
  104.  
  105. @Override
  106. public void run() {
  107. try {
  108. this.out_ = new PrintWriter(this.clientSocket_.getOutputStream(), true);
  109. this.in_ = new BufferedReader(new InputStreamReader(this.clientSocket_.getInputStream()));
  110.  
  111. long lastActionTime = System.currentTimeMillis();
  112. while (true) {
  113.  
  114. if (this.in_.ready() || System.currentTimeMillis() - lastActionTime >= 1000 * Main.threadTimeout_) {
  115. if (System.currentTimeMillis() - lastActionTime >= 1000 * Main.threadTimeout_) {
  116. //this.logDebugMessage(3, "Thread was killed due to prolonged inactivity (" + Main.threadTimeout_ + " seconds)");
  117. this.terminateThread();
  118. return;
  119. }
  120.  
  121. final String tempInputLine;
  122. if(((tempInputLine = this.in_.readLine()) == null )){
  123. this.terminateThread(); //end thread
  124. return;
  125. }
  126. else
  127. {
  128. lastActionTime = System.currentTimeMillis();
  129. final String inputLine = tempInputLine.trim();
  130. if (ClientThread.numberPattern.matcher(inputLine).matches()){
  131. final int val = Integer.parseInt(inputLine);
  132. switch (val) {
  133. case 1: { //send data to other players
  134. final int parseCount = Integer.parseInt(this.in_.readLine().trim());
  135. final StringBuilder msg = new StringBuilder();
  136. for (int j = 0; j < parseCount; ++j) {
  137. msg.append(String.valueOf(this.in_.readLine().trim()) + "|");
  138. }
  139. for (final ClientThread thread2 : this.server_.ipToClientThread_.values()) {
  140. if (thread2 != this) {
  141. thread2.out_.print(msg);
  142. thread2.out_.flush();
  143. }
  144. }
  145. //this.logDebugMessage(5, "Packet for others: '" + msg.toString() + "'");
  146. break;
  147. }
  148.  
  149. case 2: { //remove game server
  150. //this.logDebugMessage(1, "A game server has been deleted, ip: " + ipServer);
  151. Main.servers_.remove(this.server_.ip_);
  152. this.serverIp_ = null;
  153. for (final ClientThread thread : this.server_.ipToClientThread_.values()) {
  154. thread.prepareTermination_ = true;
  155. }
  156. this.terminateThread();
  157. return;
  158. }
  159. case 3: { //connect new client
  160. final String ipServer = this.in_.readLine().trim();
  161. final String ipClient = this.in_.readLine().trim();
  162. this.logDebugMessage(1, "A client wishes to connect to a server, client: " + ipClient + ", server: " + ipServer);
  163. final ServerInformation info = Main.servers_.getOrDefault(ipServer, null);
  164. if (info == null) {
  165. System.out.println("Connection to the server failed, no such server in the server list");
  166. this.out_.print("*" + 1 + "|" + 1 + "~" + "|");
  167. this.out_.flush();
  168. break;
  169. }
  170. this.server_ = info;
  171. this.server_.ipToClientThread_.put(ipClient, this);
  172. this.logDebugMessage(1, "Connection success");
  173. this.logDebugMessage(5,"Map: " + this.server_.ipToClientThread_);
  174. this.out_.print("*" + 1 + "|" + 2 + "~" + "|");
  175. this.out_.flush();
  176. break;
  177. }
  178. case 4: { //disconnect client
  179. final String ipClient = this.in_.readLine().trim();
  180. this.server_.ipToClientThread_.remove(ipClient);
  181. this.logDebugMessage(1, String.valueOf(ipClient) + " disconnected from the server at " + this.server_.ip_);
  182. this.serverIp_ = null;
  183. this.terminateThread();
  184. return;
  185. }
  186.  
  187. case 5: { //host create new game
  188. if (Main.serverNumber_ > 1000000) {
  189. Main.serverNumber_ = 10;
  190. }
  191. Main.serverNumber_ += 1;
  192. final String ipServer = Integer.toString(Main.serverNumber_); //unique server number
  193. final String ipHost = this.in_.readLine().trim(); //host
  194. final String name = this.in_.readLine().trim(); //Server name
  195. final String description = this.in_.readLine().trim(); //class
  196. final String servervar1 = this.in_.readLine().trim(); //max players
  197. final String servervar3 = this.in_.readLine().trim(); //current lap
  198. final String servervar4 = this.in_.readLine().trim(); //total laps
  199. final String servervar5 = this.in_.readLine().trim(); //status
  200. final String servervar6 = this.in_.readLine().trim(); //Password
  201. final String servervar7 = this.in_.readLine().trim(); //Online version
  202. final String servervar8 = this.in_.readLine().trim(); //Game server
  203. final long servervar9 = System.currentTimeMillis(); //server creation time
  204. //this.logDebugMessage(1, "A game server has been registered, ip: " + ipServer + ", name: " + name + ", description: " + description + ", servervar1: " + servervar1);
  205. final ServerInformation gameServer = new ServerInformation(name, servervar1, servervar3, servervar4, servervar5, servervar6, servervar7, servervar8, servervar9, ipHost, ipServer, this.clientSocket_, this.out_, this.in_);
  206. gameServer.description_ = description;
  207. gameServer.ipToClientThread_.put(ipHost, this);
  208. this.server_ = gameServer;
  209. Main.servers_.put(ipServer, gameServer);
  210. this.serverIp_ = ipServer;
  211. break;
  212. }
  213. default: {
  214. this.logDebugMessage(0, "Unrecognized case: '" + inputLine + "', " + val);
  215. break;
  216. }
  217. }
  218. }
  219. else if (inputLine.length() > 0) {
  220. this.logDebugMessage(0, "Unformated '" + inputLine + "'");
  221. if (this.server_ != null) {
  222. this.server_.out_.print(inputLine);
  223. this.server_.out_.flush();
  224. }
  225. }
  226. if (this.prepareTermination_) {
  227. this.terminateThread();
  228. return;
  229. }
  230. continue;
  231. }
  232. }
  233. }
  234. }
  235. catch (SocketTimeoutException e) {
  236. e.printStackTrace();
  237. try {
  238. this.terminateThread();
  239. }
  240. catch (IOException e2) {
  241. e2.printStackTrace();
  242. }
  243. }
  244. catch (IOException e3) {
  245. e3.printStackTrace();
  246. try {
  247. this.terminateThread();
  248. }
  249. catch (IOException e4) {
  250. e4.printStackTrace();
  251. }
  252. }
  253. }
  254.  
  255. //debug messages
  256. void logDebugMessage(final int requiredVerbose, final String msg) {
  257. if (Main.verboseLevel_ >= requiredVerbose) {
  258. System.out.println("[" + this.clientIp_ + "] " + msg);
  259. }
  260. }
  261.  
  262. //terminate thread
  263. void terminateThread() throws IOException {
  264. if (!this.terminated_) {
  265. if (this.serverIp_ != null) {
  266. Main.servers_.remove(this.serverIp_);
  267. }
  268. this.clientSocket_.close();
  269. this.in_.close();
  270. this.out_.close();
  271. this.logDebugMessage(3, "Cleanup successful");
  272. this.terminated_ = true;
  273. }
  274. }
  275. }
  276.  
  277. import java.util.HashMap;
  278. import java.io.BufferedReader;
  279. import java.io.PrintWriter;
  280. import java.net.Socket;
  281.  
  282. public class ServerInformation
  283. {
  284. public String name_; //Server name
  285. public String description_; //class
  286. public String servervar1_; //max players
  287. public long servervar2_; //server last update
  288. public String servervar3_; //current lap
  289. public String servervar4_; //total laps
  290. public String servervar5_; //status
  291. public String servervar6_; //password
  292. public String servervar7_; //online version
  293. public String servervar8_; //game server
  294. public long servervar9_; //server creation time
  295. public String ipHost_; //ip host
  296. public String ip_; //unique id server
  297. public Socket socket_;
  298. PrintWriter out_;
  299. BufferedReader in_;
  300. HashMap<String, ClientThread> ipToClientThread_;
  301.  
  302. public ServerInformation(final String name, final String servervar1, final String servervar3, final String servervar4, final String servervar5, final String servervar6, final String servervar7, final String servervar8, final long servervar9, final String ipHost, final String ip, final Socket socket, final PrintWriter out, final BufferedReader in) {
  303. this.name_ = name;
  304. this.description_ = ""; //class
  305. this.servervar1_ = servervar1; //max players
  306. this.servervar2_ = System.currentTimeMillis(); //server last update
  307. this.servervar3_ = servervar3; //current lap
  308. this.servervar4_ = servervar4; //total laps
  309. this.servervar5_ = servervar5; //status
  310. this.servervar6_ = servervar6; //password
  311. this.servervar7_ = servervar7; //online version
  312. this.servervar8_ = servervar8; //game server
  313. this.servervar9_ = servervar9; //server creation time
  314. this.ipHost_ = ipHost;
  315. this.ip_ = ip;
  316. this.socket_ = socket;
  317. this.out_ = out;
  318. this.in_ = in;
  319. this.ipToClientThread_ = new HashMap<String, ClientThread>();
  320. }
  321. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement