/src/network/Server.java
http://inequity.googlecode.com/ · Java · 155 lines · 109 code · 25 blank · 21 comment · 1 complexity · 11c5be14909818ad3b83afdd729729c8 MD5 · raw file
- package network;
- import elements.CompObj;
- import elements.Consts;
- import elements.LobbyNode;
- import java.awt.Dimension;
- import java.io.IOException;
- import java.io.ObjectInputStream;
- import java.io.ObjectOutputStream;
- import java.util.logging.Level;
- import java.util.logging.Logger;
- import javax.swing.JFrame;
- import java.net.*;
- import java.util.ArrayList;
- import java.util.concurrent.PriorityBlockingQueue;
- import javax.swing.JScrollPane;
- import javax.swing.JTextArea;
- import javax.swing.SwingUtilities;
- import packets.CommandRequest;
- /**
- * Server
- */
- public class Server extends JFrame
- {
- public ObjectInputStream socketIn;
- public ObjectOutputStream socketOut;
- private JTextArea systemLog;
- private JScrollPane logPane;
- /**
- * Constructor
- * Initializes minimalistic logging GUI
- */
- public Server()
- {
- setTitle("InEquity Server");
- setSize(new Dimension(500, 200));
- setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- systemLog = new JTextArea();
- logPane = new JScrollPane(systemLog);
- systemLog.setEditable(false);
- add(logPane);
- }
- /**
- * Waits for clients to connect and returns a proxy with their connection objects
- * @param serverSocket the listening server socket
- * @param srvQ server request queue
- * @return proxy containing connection objects for single client
- */
- public NetQProxy acceptClientConnection(ServerSocket serverSocket,
- PriorityBlockingQueue<CommandRequest> srvQ)
- {
- Socket IOSocket = null;
- PriorityBlockingQueue<CommandRequest> clientQ = null;
- Net2QRunnable rIn = null;
- Q2NetRunnable rOut = null;
- Thread tIn = null;
- Thread tOut = null;
- try
- {
- IOSocket = serverSocket.accept();
- socketOut = new ObjectOutputStream(IOSocket.getOutputStream());
- socketIn = new ObjectInputStream(IOSocket.getInputStream());
- clientQ = new PriorityBlockingQueue<CommandRequest>(Consts.SERVER_QUEUE_SIZE, new CompObj());
- rOut = new Q2NetRunnable(socketOut, clientQ);
- rOut.enableLogging(this);
- rIn = new Net2QRunnable(socketIn, srvQ);
- rIn.setLoggingServer(this);
- tOut = new Thread(rOut);
- tIn = new Thread(rIn);
- tOut.start();
- tIn.start();
- }
- catch(IOException e)
- {
- e.printStackTrace();
- }
- return new NetQProxy(tIn, tOut, clientQ);
- }
- /**
- * Posts a log message to the gui
- * @param logMsg message to be logged
- */
- public void postLogMsg(String logMsg)
- {
- systemLog.append('\n' + logMsg);
- SwingUtilities.invokeLater(new Runnable()
- {
- public void run()
- {
- systemLog.setCaretPosition(systemLog.getText().length());
- }
- });
- }
- /**
- * Requires one port parameter
- * @param args command-line arguments
- */
- public static void main(String[] args)
- {
- int port = Consts.DEFAULT_PORT;
- PriorityBlockingQueue<CommandRequest> srvQ =
- new PriorityBlockingQueue<CommandRequest>
- (Consts.SERVER_QUEUE_SIZE, new CompObj());
- ArrayList<LobbyNode> lobbyList = new ArrayList<LobbyNode>();
- try
- {
- Server srv = new Server();
- Lobby lobby = new Lobby(srvQ, srv, lobbyList);
- if(args.length >= 1)
- {
- port = Integer.parseInt(args[0]);
- }
- ServerSocket server = new ServerSocket(port);
- srv.setVisible(true);
- srv.postLogMsg("Allowing lobby members");
- lobby.startListener();
- while(true)
- {
- lobby.addPlayer(srv.acceptClientConnection(server, srvQ));
- }
- }
- catch (SocketException e)
- {
- System.out.println("Socket already taken, exiting.");
- }
- catch (Exception ex)
- {
- Logger.getLogger(Server.class.getName()).log(Level.SEVERE, "Server", ex);
- }
- }
- }