在项目中,需要用websocket和其他服务器进行通信,而websocket是长连接,建立连接后,监听消息,然后进行消息的处理。也就是消息的异步处理。
使用java websocket需要实现的接口如下
public abstract void onOpen( ServerHandshake handshakedata ); public abstract void onMessage( String message ); public abstract void onClose( int code, String reason, boolean remote ); public abstract void onError( Exception ex ); public void onMessage( ByteBuffer bytes ) { } public void onFragment( Framedata frame ) { }
对于习惯使用同步请求的java开发者来说,用起来还是不方便的。
参考网上资料,CountDownLatch把java的websocket请求从异步修改为同步,如下:
package cc.openwiki.model; import lombok.extern.slf4j.Slf4j; import org.java_websocket.client.WebSocketClient; import org.java_websocket.handshake.ServerHandshake; import java.net.URI; import java.nio.ByteBuffer; import java.util.concurrent.CountDownLatch; /** * Created by admin on 2017/6/6. */ @Slf4j public class WebSocketClientExt extends WebSocketClient { public WebSocketClientExt(URI serverURI){ super(serverURI); } private Object lock = new Object(); private Object result = null; private CountDownLatch downLatch = null; public Object sendOb(Object object){ synchronized (lock){ downLatch = new CountDownLatch(1); sendImpl(object); try { downLatch.await(); } catch (InterruptedException e) { e.printStackTrace(); }finally { return result; } } } public void sendImpl( Object object ){ if(object instanceof String){ super.send((String)object); }else if(object instanceof byte[]){ super.send((byte[])object); } } @Override public void onOpen(ServerHandshake handshakedata) { log.debug("open handshakedata。。。"); } @Override public void onMessage(String message) { log.debug("receive message。。。"); result = message; if(downLatch!=null){ downLatch.countDown(); } } public void onMessage( ByteBuffer bytes ) { log.debug("receive ByteBuffer message。。。"); result = bytes; if(downLatch!=null){ downLatch.countDown(); } } @Override public void onClose(int code, String reason, boolean remote) { log.debug("close websocket 。。"); } @Override public void onError(Exception ex) { log.debug("onError 。。"); } }
调用方式如下:
WebSocketClientExt webSocketClientExt = new WebSocketClientExt(uri); try { webSocketClientExt.connectBlocking(); } catch (InterruptedException e) { log.info("connect excepiont {}", e); } Object result = webSocketClientExt.sendOb(data.toByteArray());
用起来是不是熟悉了 :)
by sim