package com.jlcm.prototipo.client;
import com.google.gwt.core.client.JavaScriptException;
import net.zschech.gwt.websockets.client.CloseHandler;
import net.zschech.gwt.websockets.client.ErrorHandler;
import net.zschech.gwt.websockets.client.MessageEvent;
import net.zschech.gwt.websockets.client.MessageHandler;
import net.zschech.gwt.websockets.client.OpenHandler;
import net.zschech.gwt.websockets.client.WebSocket;
public class GWTClient implements ComClient
{
//private static int DEFAULT_SERVER_PORT = 80;
private int port;
private WebSocket wsc; //Websocket to connect to a remote server
private boolean connected;
//For the Client side only
private int myID;
private ClientMSG c;
//For Bidirectional Communication mode
public GWTClient (String ip, int port, ClientMSG c)
{
this.port = port;
this.connected = false;
this.connectClient(ip);
myID = -1;
this.c = c; //To call the methods of the the upper level class
}
public void connectClient (String ip)
{
if (!ip.isEmpty())
{
//We create the URI in String format
String url = null; //URI (url address of the server)
url = new String("ws://"+ ip +":"+ port);
try
{
wsc = WebSocket.create(url); //"ws://echo.websocket.org" //For the echo testing server
//Handler methods override the original methods for the webSocket functionality
wsc.setOnOpen(new OpenHandler()
{
@Override
public void onOpen(WebSocket webSocket)
{
connected = true;
requestID();
}
});
wsc.setOnMessage(new MessageHandler()
{
@Override
public void onMessage(WebSocket webSocket, MessageEvent event)
{
String message = event.getData(); //Different implementation respect WSClient
//Low level control of Messages received from server
//SERVER CLOSES MY WS CONNECTION.
if (message.equals("MSG_CLOSE_WS"))
{
wsc.close();
}
//SERVER SEND MY CLIENT ID.
else if (message.startsWith("MSG_SEND_ID"))
{
String [] values = message.split("\\s+"); //splitter with the " " separator
myID = Integer.valueOf(values[1]);
}
//High level Message, send to the ClientMSG class
else
{
c.onMessage(message);
}
}
});
wsc.setOnError(new ErrorHandler()
{
@Override
public void onError(WebSocket webSocket)
{
System.out.println("GWTClient Error.");
}
});
wsc.setOnClose(new CloseHandler()
{
@Override
public void onClose(WebSocket webSocket)
{
connected = false;
}
});
}
catch (JavaScriptException e) { }
}
}
private void requestID()
{
sendMsg("MSG_REQUEST_ID");
}
public boolean sendMsg(String msg)
{
if (connected)
{
wsc.send(msg);
return true;
}
else return false;
}
public boolean isConnected()
{
return connected;
}
public int getId()
{
return myID;
}
public void close()
{
wsc.close();
connected = false;
}
}