Launcher/libLauncher/src/main/java/ru/gravit/utils/websocket/WebSocketClient.java
2018-09-17 16:47:01 +07:00

67 lines
2.1 KiB
Java

package ru.gravit.utils.websocket;
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.util.concurrent.*;
import jdk.nashorn.internal.ir.RuntimeNode;
import org.eclipse.jetty.websocket.api.Session;
import org.eclipse.jetty.websocket.api.StatusCode;
import org.eclipse.jetty.websocket.api.annotations.OnWebSocketClose;
import org.eclipse.jetty.websocket.api.annotations.OnWebSocketConnect;
import org.eclipse.jetty.websocket.api.annotations.OnWebSocketMessage;
import org.eclipse.jetty.websocket.api.annotations.WebSocket;
import ru.gravit.launcher.Launcher;
import ru.gravit.launcher.serialize.HInput;
import ru.gravit.launcher.serialize.HOutput;
import ru.gravit.utils.helper.IOHelper;
/**
* Basic Echo Client Socket
*/
@WebSocket(maxTextMessageSize = 64 * 1024)
public class WebSocketClient
{
private final CountDownLatch closeLatch;
@SuppressWarnings("unused")
private Session session;
private final MessageInterface adapter;
public WebSocketClient(MessageInterface adapter)
{
this.closeLatch = new CountDownLatch(1);
this.adapter = adapter;
}
public boolean awaitClose(int duration, TimeUnit unit) throws InterruptedException
{
return this.closeLatch.await(duration,unit);
}
@OnWebSocketClose
public void onClose(int statusCode, String reason)
{
System.out.printf("Connection closed: %d - %s%n",statusCode,reason);
this.session = null;
this.closeLatch.countDown(); // trigger latch
}
@OnWebSocketConnect
public void onConnect(Session session)
{
System.out.printf("Got connect: %s%n",session);
this.session = session;
}
public void request(ByteBuffer buffer) throws IOException {
session.getRemote().sendBytes(buffer);
}
@OnWebSocketMessage
public void onMessage(String msg) throws IOException {
byte[] bytes = msg.getBytes();
InputStream stream = new ByteArrayInputStream(bytes);
HInput input = new HInput(stream);
adapter.request(input);
}
}