/src/network/Server.java

http://inequity.googlecode.com/ · Java · 155 lines · 109 code · 25 blank · 21 comment · 1 complexity · 11c5be14909818ad3b83afdd729729c8 MD5 · raw file

  1. package network;
  2. import elements.CompObj;
  3. import elements.Consts;
  4. import elements.LobbyNode;
  5. import java.awt.Dimension;
  6. import java.io.IOException;
  7. import java.io.ObjectInputStream;
  8. import java.io.ObjectOutputStream;
  9. import java.util.logging.Level;
  10. import java.util.logging.Logger;
  11. import javax.swing.JFrame;
  12. import java.net.*;
  13. import java.util.ArrayList;
  14. import java.util.concurrent.PriorityBlockingQueue;
  15. import javax.swing.JScrollPane;
  16. import javax.swing.JTextArea;
  17. import javax.swing.SwingUtilities;
  18. import packets.CommandRequest;
  19. /**
  20. * Server
  21. */
  22. public class Server extends JFrame
  23. {
  24. public ObjectInputStream socketIn;
  25. public ObjectOutputStream socketOut;
  26. private JTextArea systemLog;
  27. private JScrollPane logPane;
  28. /**
  29. * Constructor
  30. * Initializes minimalistic logging GUI
  31. */
  32. public Server()
  33. {
  34. setTitle("InEquity Server");
  35. setSize(new Dimension(500, 200));
  36. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  37. systemLog = new JTextArea();
  38. logPane = new JScrollPane(systemLog);
  39. systemLog.setEditable(false);
  40. add(logPane);
  41. }
  42. /**
  43. * Waits for clients to connect and returns a proxy with their connection objects
  44. * @param serverSocket the listening server socket
  45. * @param srvQ server request queue
  46. * @return proxy containing connection objects for single client
  47. */
  48. public NetQProxy acceptClientConnection(ServerSocket serverSocket,
  49. PriorityBlockingQueue<CommandRequest> srvQ)
  50. {
  51. Socket IOSocket = null;
  52. PriorityBlockingQueue<CommandRequest> clientQ = null;
  53. Net2QRunnable rIn = null;
  54. Q2NetRunnable rOut = null;
  55. Thread tIn = null;
  56. Thread tOut = null;
  57. try
  58. {
  59. IOSocket = serverSocket.accept();
  60. socketOut = new ObjectOutputStream(IOSocket.getOutputStream());
  61. socketIn = new ObjectInputStream(IOSocket.getInputStream());
  62. clientQ = new PriorityBlockingQueue<CommandRequest>(Consts.SERVER_QUEUE_SIZE, new CompObj());
  63. rOut = new Q2NetRunnable(socketOut, clientQ);
  64. rOut.enableLogging(this);
  65. rIn = new Net2QRunnable(socketIn, srvQ);
  66. rIn.setLoggingServer(this);
  67. tOut = new Thread(rOut);
  68. tIn = new Thread(rIn);
  69. tOut.start();
  70. tIn.start();
  71. }
  72. catch(IOException e)
  73. {
  74. e.printStackTrace();
  75. }
  76. return new NetQProxy(tIn, tOut, clientQ);
  77. }
  78. /**
  79. * Posts a log message to the gui
  80. * @param logMsg message to be logged
  81. */
  82. public void postLogMsg(String logMsg)
  83. {
  84. systemLog.append('\n' + logMsg);
  85. SwingUtilities.invokeLater(new Runnable()
  86. {
  87. public void run()
  88. {
  89. systemLog.setCaretPosition(systemLog.getText().length());
  90. }
  91. });
  92. }
  93. /**
  94. * Requires one port parameter
  95. * @param args command-line arguments
  96. */
  97. public static void main(String[] args)
  98. {
  99. int port = Consts.DEFAULT_PORT;
  100. PriorityBlockingQueue<CommandRequest> srvQ =
  101. new PriorityBlockingQueue<CommandRequest>
  102. (Consts.SERVER_QUEUE_SIZE, new CompObj());
  103. ArrayList<LobbyNode> lobbyList = new ArrayList<LobbyNode>();
  104. try
  105. {
  106. Server srv = new Server();
  107. Lobby lobby = new Lobby(srvQ, srv, lobbyList);
  108. if(args.length >= 1)
  109. {
  110. port = Integer.parseInt(args[0]);
  111. }
  112. ServerSocket server = new ServerSocket(port);
  113. srv.setVisible(true);
  114. srv.postLogMsg("Allowing lobby members");
  115. lobby.startListener();
  116. while(true)
  117. {
  118. lobby.addPlayer(srv.acceptClientConnection(server, srvQ));
  119. }
  120. }
  121. catch (SocketException e)
  122. {
  123. System.out.println("Socket already taken, exiting.");
  124. }
  125. catch (Exception ex)
  126. {
  127. Logger.getLogger(Server.class.getName()).log(Level.SEVERE, "Server", ex);
  128. }
  129. }
  130. }