Ensures that we close all sockets and socket servers before exiting.
This makes the program more stable, and ensures that the connection is established every time we start.
This commit is contained in:
@@ -19,12 +19,12 @@ public class Main
|
|||||||
{
|
{
|
||||||
private static final Logger logger = LoggerFactory.getLogger(Main.class);
|
private static final Logger logger = LoggerFactory.getLogger(Main.class);
|
||||||
|
|
||||||
public static void main(String[] args) throws IOException, InterruptedException
|
public static void main(String[] args) throws IOException
|
||||||
{
|
{
|
||||||
MessageHandler interfaceLink;
|
MessageHandler interfaceLink;
|
||||||
BrowserLink browserLink;
|
BrowserLink browserLink;
|
||||||
Thread interfaceThread, browserThread;
|
Thread interfaceThread, browserThread;
|
||||||
Socket socket;
|
Socket socket = null;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
logger.debug("Connecting to browser");
|
logger.debug("Connecting to browser");
|
||||||
@@ -35,17 +35,37 @@ public class Main
|
|||||||
socket = new Socket(BrowserConstants.IP,BrowserConstants.PORT);
|
socket = new Socket(BrowserConstants.IP,BrowserConstants.PORT);
|
||||||
logger.debug("Connection established");
|
logger.debug("Connection established");
|
||||||
|
|
||||||
interfaceLink = new MessageHandler("InterfaceHandler", socket.getInputStream(), socket.getOutputStream()) {
|
Socket finalSocket = socket;
|
||||||
|
interfaceLink = new MessageHandler("InterfaceHandler", finalSocket.getInputStream(), finalSocket.getOutputStream()) {
|
||||||
@Override
|
@Override
|
||||||
protected boolean onRun()
|
protected boolean onRun()
|
||||||
{
|
{
|
||||||
if (!socket.isConnected() || socket.isClosed() || socket.isInputShutdown() || socket.isOutputShutdown())
|
if (!finalSocket.isConnected() || finalSocket.isClosed() || finalSocket.isInputShutdown() || finalSocket.isOutputShutdown())
|
||||||
{
|
{
|
||||||
logger.debug("Socket closed, shutting down");
|
logger.debug("Interface socket closed, shutting down");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* Make sure that it is active.
|
||||||
|
*/
|
||||||
|
this.sendUpdate("ping");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onClose()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
logger.debug("Closing interface socket.");
|
||||||
|
finalSocket.close();
|
||||||
|
browserLink.sendObject("quit");
|
||||||
|
}
|
||||||
|
catch (IOException e)
|
||||||
|
{
|
||||||
|
logger.error("Could not close socket", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
logger.debug("Connection received");
|
logger.debug("Connection received");
|
||||||
/*
|
/*
|
||||||
@@ -70,14 +90,28 @@ public class Main
|
|||||||
browserThread.start();
|
browserThread.start();
|
||||||
interfaceThread.start();
|
interfaceThread.start();
|
||||||
logger.debug("Joining threads.");
|
logger.debug("Joining threads.");
|
||||||
browserThread.join();
|
try
|
||||||
interfaceThread.join();
|
{
|
||||||
|
browserThread.join();
|
||||||
|
interfaceThread.join();
|
||||||
|
}
|
||||||
|
catch (InterruptedException e)
|
||||||
|
{
|
||||||
|
logger.error("Could not wait for threads", e);
|
||||||
|
}
|
||||||
logger.debug("Threads completed.");
|
logger.debug("Threads completed.");
|
||||||
}
|
}
|
||||||
catch (IOException e)
|
catch (IOException e)
|
||||||
{
|
{
|
||||||
logger.error("Could not initialize socket", e);
|
logger.error("Could not initialize socket", e);
|
||||||
browserLink.sendObject("quit");
|
try
|
||||||
|
{
|
||||||
|
browserLink.sendObject("quit");
|
||||||
|
}
|
||||||
|
catch (IOException ex)
|
||||||
|
{
|
||||||
|
logger.error("Could not quit socket", ex);
|
||||||
|
}
|
||||||
throw e;
|
throw e;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -89,6 +123,17 @@ public class Main
|
|||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
logger.debug("Shutting down interface link");
|
logger.debug("Shutting down interface link");
|
||||||
|
if (socket != null)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
socket.close();
|
||||||
|
}
|
||||||
|
catch (IOException e)
|
||||||
|
{
|
||||||
|
logger.error("Could not close socket", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -17,10 +17,5 @@
|
|||||||
<Root level="debug">
|
<Root level="debug">
|
||||||
<AppenderRef ref="File"/>
|
<AppenderRef ref="File"/>
|
||||||
</Root>
|
</Root>
|
||||||
<Logger name="edu.regis.universeplayer.browserCommands.MessageRunner" level="trace"/>
|
|
||||||
<Logger name="edu.regis.universeplayer.browserCommands.MessageHandler" level="trace"/>
|
|
||||||
<Logger name="edu.regis.universeplayer.browserCommands.memoryMapping.MemoryRunner" level="trace"/>
|
|
||||||
<Logger name="edu.regis.universeplayer.browserCommands.memoryMapping.MemoryHandler" level="trace"/>
|
|
||||||
<Logger name="BrowserLink" level="trace"/>
|
|
||||||
</Loggers>
|
</Loggers>
|
||||||
</Configuration>
|
</Configuration>
|
||||||
@@ -76,13 +76,14 @@ public class MessageHandler implements Runnable, MessageSerializer
|
|||||||
Future<Object> messageResponse;
|
Future<Object> messageResponse;
|
||||||
ByteBuffer numBuffer = ByteBuffer.allocate(4);
|
ByteBuffer numBuffer = ByteBuffer.allocate(4);
|
||||||
HashSet<Integer> toRemove = new HashSet<>();
|
HashSet<Integer> toRemove = new HashSet<>();
|
||||||
|
boolean running = true;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
browserIn = new BufferedInputStream(this.input);
|
browserIn = new BufferedInputStream(this.input);
|
||||||
browserOut = new BufferedOutputStream(this.output);
|
browserOut = new BufferedOutputStream(this.output);
|
||||||
|
|
||||||
while (!this.onRun())
|
while (!this.onRun() && running)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -111,6 +112,7 @@ public class MessageHandler implements Runnable, MessageSerializer
|
|||||||
catch (IOException | ClassNotFoundException e)
|
catch (IOException | ClassNotFoundException e)
|
||||||
{
|
{
|
||||||
logger.error("Could not retrieve message", e);
|
logger.error("Could not retrieve message", e);
|
||||||
|
running = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -134,6 +136,7 @@ public class MessageHandler implements Runnable, MessageSerializer
|
|||||||
catch (IOException e)
|
catch (IOException e)
|
||||||
{
|
{
|
||||||
logger.error("Could not send response message for " + responses.getKey(), e);
|
logger.error("Could not send response message for " + responses.getKey(), e);
|
||||||
|
running = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
toRemove.forEach(this.messageResponses::remove);
|
toRemove.forEach(this.messageResponses::remove);
|
||||||
@@ -158,7 +161,8 @@ public class MessageHandler implements Runnable, MessageSerializer
|
|||||||
}
|
}
|
||||||
catch (IOException e)
|
catch (IOException e)
|
||||||
{
|
{
|
||||||
logger.error("Could not send response message for " + update, e);
|
logger.error("Could not send response message for" + update, e);
|
||||||
|
running = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -176,11 +180,13 @@ public class MessageHandler implements Runnable, MessageSerializer
|
|||||||
*/
|
*/
|
||||||
synchronized (this.messageResponses)
|
synchronized (this.messageResponses)
|
||||||
{
|
{
|
||||||
|
logger.debug("Releasing {} dangling messages", this.messageResponses.size());
|
||||||
this.messageResponses.values().forEach(future -> future.cancel(false));
|
this.messageResponses.values().forEach(future -> future.cancel(false));
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* Close the streams.
|
* Close the streams.
|
||||||
*/
|
*/
|
||||||
|
logger.debug("Closing streams");
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (browserIn != null)
|
if (browserIn != null)
|
||||||
@@ -205,10 +211,21 @@ public class MessageHandler implements Runnable, MessageSerializer
|
|||||||
{
|
{
|
||||||
logger.error("Could not close browser output", e1);
|
logger.error("Could not close browser output", e1);
|
||||||
}
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
this.onClose();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback for when closing the application.
|
||||||
|
*/
|
||||||
|
protected void onClose()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Triggers the message listeners.
|
* Triggers the message listeners.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -187,6 +187,7 @@ public abstract class MessageRunner implements Runnable, MessageSerializer
|
|||||||
*/
|
*/
|
||||||
synchronized (this.sendQueue)
|
synchronized (this.sendQueue)
|
||||||
{
|
{
|
||||||
|
logger.debug("Clearing up {} messages", this.sendQueue.size());
|
||||||
while (this.sendQueue.size() > 0)
|
while (this.sendQueue.size() > 0)
|
||||||
{
|
{
|
||||||
packet = this.sendQueue.poll();
|
packet = this.sendQueue.poll();
|
||||||
@@ -200,6 +201,7 @@ public abstract class MessageRunner implements Runnable, MessageSerializer
|
|||||||
/*
|
/*
|
||||||
* Close the streams.
|
* Close the streams.
|
||||||
*/
|
*/
|
||||||
|
logger.debug("Closing streams.");
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (browserIn != null)
|
if (browserIn != null)
|
||||||
@@ -224,10 +226,21 @@ public abstract class MessageRunner implements Runnable, MessageSerializer
|
|||||||
{
|
{
|
||||||
logger.error("Could not close browser output", e1);
|
logger.error("Could not close browser output", e1);
|
||||||
}
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
this.onClose();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback for when closing the application.
|
||||||
|
*/
|
||||||
|
protected void onClose()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sends an object to the remote.
|
* Sends an object to the remote.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -32,11 +32,13 @@ public class Browser extends MessageRunner implements Player<InternetSong>
|
|||||||
{
|
{
|
||||||
private static final Logger logger = LoggerFactory.getLogger(Browser.class);
|
private static final Logger logger = LoggerFactory.getLogger(Browser.class);
|
||||||
private final Process process;
|
private final Process process;
|
||||||
|
private final ServerSocket server;
|
||||||
private final Socket socket;
|
private final Socket socket;
|
||||||
|
|
||||||
private final LinkedList<PlaybackListener> listeners = new LinkedList<>();
|
private final LinkedList<PlaybackListener> listeners = new LinkedList<>();
|
||||||
|
|
||||||
private InternetSong currentSong;
|
private InternetSong currentSong;
|
||||||
|
private boolean running = true;
|
||||||
|
|
||||||
public static Browser createBrowser() throws IOException, InterruptedException
|
public static Browser createBrowser() throws IOException, InterruptedException
|
||||||
{
|
{
|
||||||
@@ -91,14 +93,15 @@ public class Browser extends MessageRunner implements Player<InternetSong>
|
|||||||
{
|
{
|
||||||
logger.debug("Connection established.");
|
logger.debug("Connection established.");
|
||||||
}
|
}
|
||||||
browser = new Browser(socket, browserProcess);
|
browser = new Browser(socket, server, browserProcess);
|
||||||
return browser;
|
return browser;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Browser(Socket socket, Process process) throws IOException
|
private Browser(Socket socket, ServerSocket server, Process process) throws IOException
|
||||||
{
|
{
|
||||||
super("BrowserRunner", socket.getInputStream(), socket.getOutputStream());
|
super("BrowserRunner", socket.getInputStream(), socket.getOutputStream());
|
||||||
this.socket = socket;
|
this.socket = socket;
|
||||||
|
this.server = server;
|
||||||
this.process = process;
|
this.process = process;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -110,7 +113,33 @@ public class Browser extends MessageRunner implements Player<InternetSong>
|
|||||||
logger.debug("Socket closed, shutting down");
|
logger.debug("Socket closed, shutting down");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return !this.running;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onClose()
|
||||||
|
{
|
||||||
|
logger.debug("Closing socket");
|
||||||
|
try
|
||||||
|
{
|
||||||
|
this.socket.close();
|
||||||
|
}
|
||||||
|
catch (IOException e)
|
||||||
|
{
|
||||||
|
logger.error("Could not close socket", e);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
logger.debug("Closing server");
|
||||||
|
try
|
||||||
|
{
|
||||||
|
this.server.close();
|
||||||
|
}
|
||||||
|
catch (IOException e)
|
||||||
|
{
|
||||||
|
logger.error("Could not close server", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -193,6 +222,7 @@ public class Browser extends MessageRunner implements Player<InternetSong>
|
|||||||
@Override
|
@Override
|
||||||
public QueryFuture<Void> close()
|
public QueryFuture<Void> close()
|
||||||
{
|
{
|
||||||
|
this.running = false;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
QueryFuture<Void> future = new ForwardedFuture(this.sendObject(new CommandQuit()));
|
QueryFuture<Void> future = new ForwardedFuture(this.sendObject(new CommandQuit()));
|
||||||
|
|||||||
@@ -17,16 +17,5 @@
|
|||||||
<Root level="debug">
|
<Root level="debug">
|
||||||
<AppenderRef ref="File"/>
|
<AppenderRef ref="File"/>
|
||||||
</Root>
|
</Root>
|
||||||
<Logger name="edu.regis.universeplayer.data.LocalSongProvider" level="debug">
|
|
||||||
<AppenderRef ref="Console"/>
|
|
||||||
</Logger>
|
|
||||||
<Logger name="edu.regis.universeplayer.browserCommands.memoryMapping.MemoryRunner" level="trace"/>
|
|
||||||
<Logger name="edu.regis.universeplayer.browserCommands.memoryMapping.MemoryHandler" level="trace"/>
|
|
||||||
<!-- <Logger name="edu.regis.universeplayer.localPlayer.LocalPlayer" level="debug">-->
|
|
||||||
<!-- <AppenderRef ref="Console"/>-->
|
|
||||||
<!-- </Logger>-->
|
|
||||||
<!-- <Logger name="edu.regis.universeplayer.player.Interface" level="debug">-->
|
|
||||||
<!-- <AppenderRef ref="Console"/>-->
|
|
||||||
<!-- </Logger>-->
|
|
||||||
</Loggers>
|
</Loggers>
|
||||||
</Configuration>
|
</Configuration>
|
||||||
Reference in New Issue
Block a user