Hi Hamish,
Using Pygmy web server, I could achieve two way communication between
client and server. There are two differences compared to conventional
TCP/IP communication.
1. You have to encode the binary data into string
2. The server push is asynchronous
code segment to establish websocket is given below. The code is in a
Handler in server side.
protected boolean handleBody(HttpRequest request, HttpResponse
response) throws IOException
{
response.addHeader("Upgrade", "WebSocket");
response.addHeader("Connection", "Upgrade");
response.addHeader("Sec-WebSocket-Origin",
request.getRequestHeader("Origin"));
response.addHeader("Sec-WebSocket-Location", "ws://" +
request.getRequestHeader("Host") + '/' );
response.addHeader("Sec-WebSocket-Protocol", "sample");
response.printOutHeaders();
byte[] eightByteA =
request.getInternetInputStream().readNBytes(8);
String key1S = request.getHeaders().get("Sec-WebSocket-Key1");
String key2S = request.getHeaders().get("Sec-WebSocket-Key2");
int key1i = getIntForSecurityKey(key1S);
System.out.println(" key1i " + key1i);
int key2i = getIntForSecurityKey(key2S);
if (key1i == -1 || key2i == -1 || eightByteA == null)
{
System.out.println("skipping key exchange ");
}
else
{
try
{
additionalDataForUpgrade_ = (makeResponseToken(key1i, key2i,
eightByteA));
response.addResponseData( this ) ;
} catch (NoSuchAlgorithmException ne)
{
System.out.println("NoSuchAlgorithmException " + ne);
}
}
return true;
}
protected int getIntForSecurityKey(String keyS)
{
int result = -1;
if (keyS == null || keyS.length() == 0)
{
//
} else
{
Integer spaces = new Integer(0);
Long number = new Long(0);
for (Character c : keyS.toCharArray())
{
if (c.equals(' '))
{
++spaces;
}
if (Character.isDigit(c))
{
number *= 10;
number += Character.digit(c, 10);
}
}
number /= spaces;
result = number.intValue();
}
return result;
}
protected byte[] makeResponseToken(int key1, int key2, byte[] token)
throws NoSuchAlgorithmException
{
MessageDigest md5digest = MessageDigest.getInstance("MD5");
for (Integer i = 0; i < 2; ++i)
{
byte[] asByte = new byte[4];
int key = (i == 0) ? key1 : key2;
asByte[0] = (byte) (key >> 24);
asByte[1] = (byte) ((key << 8) >> 24);
asByte[2] = (byte) ((key << 16) >> 24);
asByte[3] = (byte) ((key << 24) >> 24);
md5digest.update(asByte);
}
md5digest.update(token);
return md5digest.digest();
}
/// to be tweaked depending on the client agent
public static void sendMessage(String message, OutputStream out)
throws IOException
{
synchronized (out)
{
out.write(0x00);
out.write(message.getBytes());
out.write(0xFF);
out.flush();
}
}
Hope this helps.
J.Ganesan
www.DataStoreGwt.com
persistance engine for GWT.
On May 27, 9:37 pm, hamish tushar chandola <
hamish.tus...@gmail.com>
wrote:
> Hi Ganesan,
>
> Is there a way in GWT to push data from server to client.
> Right now i am using RPC asyncallback but for that client needs to make
> request to server and then it responds.
> So its more like pull mechanism .I wud need push .
>
> Thanks
> Hamish
>