package net;
import gui.Driver;
import gui.PlayGamePanel;
import gui.PlayNetGamePanel;
import java.io.EOFException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import javax.swing.JOptionPane;
import logic.Result;
import models.Game;
import utility.GuiUtility;
import ai.FakeMove;
/**
*
* Class to create the network host
*
* @author Drew Hannay & Andrew Wolfe & John McCormick
*
*/
public class NetworkServer
{
/**
* Method to create the host to wait for a client and to set up the new game
*
* @param png the game that is going to be played
* @throws Exception socket or end of file exception
*/
public void host(PlayNetGamePanel png) throws Exception
{
ServerSocket serverSocket = null;
Socket clientSocket = null;
serverSocket = new ServerSocket(27335);
serverSocket.setSoTimeout(1000);
Game g = PlayGamePanel.getGame();
while (clientSocket == null)
{
try
{
GuiUtility.getChessCrafter().getPlayGameScreen(g).resetTimers();
clientSocket = serverSocket.accept();
}
catch (Exception e)
{
// if (NewGameMenu.mIsCancelled)
// return;
}
}
AnimatedLabel.m_isFinished = true;
ObjectOutputStream out = new ObjectOutputStream(clientSocket.getOutputStream());
ObjectInputStream in = new ObjectInputStream(clientSocket.getInputStream());
Object fromUser;
Object fromServer;
fromServer = g;
if (fromServer != null)
out.writeObject(fromServer);
GuiUtility.getChessCrafter().getPlayGameScreen(g).resetTimers();
Driver.getInstance().pushPanel(png);
try
{
while (g.isBlackMove() == false)
{
while (PlayNetGamePanel.mNetMove == null)
Thread.sleep(0);
fromServer = PlayNetGamePanel.mNetMove;
PlayNetGamePanel.mNetMove = null;
out.writeObject(fromServer);
out.flush();
}
while (PlayNetGamePanel.mIsRunning)
{
while (g.isBlackMove() == true && PlayNetGamePanel.mIsRunning)
{
fromUser = in.readObject();
FakeMove toMove = (FakeMove) fromUser;
if (toMove.mOriginColumn == -1)
{
int surrender = JOptionPane.showConfirmDialog(null, Messages.getString("NetworkServer.otherRequestedDraw"), //$NON-NLS-1$
Messages.getString("NetworkServer.draw"), JOptionPane.YES_NO_OPTION); //$NON-NLS-1$
if (surrender == 0)
{ // If this player also accepts the Draw.
out.writeObject(new FakeMove(-2, -2, -2, -2, -2, null)); // Write
// out
// a
// new
// object
// which
// shows
// you
// accepted
// the
// Draw.
Result result = Result.DRAW;
result.setGuiText(Messages.getString("NetworkServer.endedInDraw")); //$NON-NLS-1$
g.getLastMove().setResult(result);
GuiUtility.getChessCrafter().getPlayGameScreen(g).endOfGame(result);
throw new Exception();
}
else
{
out.writeObject(new FakeMove(-3, -3, -3, -3, -3, null));// Else,
// write
// out
// an
// object
// which
// shows
// you
// did
// NOT
// accept
// the
// Draw.
continue;
}
}
else
{
g.playMove(g.fakeToRealMove((FakeMove) fromUser));
if (g.getLastMove().getResult() != null)
continue;
}
}
while (g.isBlackMove() == false && PlayNetGamePanel.mIsRunning)
{
while (PlayNetGamePanel.mNetMove == null && !png.mDrawRequested && PlayNetGamePanel.mIsRunning)
Thread.sleep(0);
if (png.mDrawRequested)
{
fromUser = in.readObject();
FakeMove toMove = (FakeMove) fromUser;
if (toMove.mOriginColumn == -2)
{
Result result = Result.DRAW;
result.setGuiText(Messages.getString("NetworkServer.endedInDraw")); //$NON-NLS-1$
g.getLastMove().setResult(result);
GuiUtility.getChessCrafter().getPlayGameScreen(g).endOfGame(result);
png.mDrawRequested = false;
throw new Exception();
}
else if (toMove.mOriginColumn == -3)
{ // If the response is an unaccepted Draw request, do
// not perform the Move.
JOptionPane.showMessageDialog(null, Messages.getString("NetworkServer.requestDenied"), //$NON-NLS-1$
Messages.getString("NetworkServer.denied"), JOptionPane.PLAIN_MESSAGE); //$NON-NLS-1$
png.mDrawRequested = false;
continue;
}
}
fromServer = PlayNetGamePanel.mNetMove;
PlayNetGamePanel.mNetMove = null;
if (((FakeMove) fromServer).mOriginColumn == -1)
png.mDrawRequested = true;
out.writeObject(fromServer);
out.flush();
if (g.getLastMove().getResult() != null)
break;
}
}
}
catch (SocketException e)
{
e.printStackTrace();
JOptionPane
.showMessageDialog(
null,
Messages.getString("NetworkServer.opponentClosed"), Messages.getString("NetworkServer.oops"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ //$NON-NLS-2$
Driver.getInstance().setFileMenuVisibility(true);
Driver.getInstance().setOptionsMenuVisibility(false);
Driver.getInstance().revertToMainPanel();
serverSocket.close();
return;
}
catch (EOFException e)
{
e.printStackTrace();
if (g.getHistory().size() != 0 && g.getHistory().get(g.getHistory().size() - 1).getResult() != null)
return;
JOptionPane
.showMessageDialog(
null,
Messages.getString("NetworkServer.opponentClosed"), Messages.getString("NetworkServer.oops"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ //$NON-NLS-2$
g.getBlackTimer().stopTimer();
g.getWhiteTimer().stopTimer();
Driver.getInstance().setFileMenuVisibility(true);
Driver.getInstance().setOptionsMenuVisibility(false);
Driver.getInstance().revertToMainPanel();
serverSocket.close();
return;
}
catch (Exception e)
{
e.printStackTrace();
}
out.close();
in.close();
clientSocket.close();
serverSocket.close();
}
}