上一篇是说浏览器与服务器建立WebSocket通信,而这篇来通过WebSocket-api提供的接口来实现客户端的功能。
客户端主要也是通过注解的方式来实现,但是创建的方式会用到其他类,注解为@ClientEndpoint,其他注解一样,WebSocketClient.java具体代码如下:
@ClientEndpoint
public class WebSocketClient {
private Logger logger = Logger.getLogger(WebSocketServer.class);
private Session session;
@OnOpen
public void open(Session session){
logger.info("Client WebSocket is opening...");
this.session = session;
}
@OnMessage
public void onMessage(String message){
logger.info("Server send message: " + message);
}
@OnClose
public void onClose(){
logger.info("Websocket closed");
}
@OnError
public void onError(Session session, Throwable t) {
t.printStackTrace();
}
public void send(String message){
this.session.getAsyncRemote().sendText(message);
}
public void close() throws IOException{
if(this.session.isOpen()){
this.session.close();
}
}
}
另外添加两个方法send
和close
,可以主动发送消息和关闭连接。只要可以获取到建立连接的session
,就可以进行相关的操作,如消息发送、状态判断等等。
以上为客户端的简单实现,接下来,来看看@ClientEndpoint
注解的代码:
@Retention(RetentionPolicy.RUNTIME)
@Target({java.lang.annotation.ElementType.TYPE})
public @interface ClientEndpoint
{
String[] subprotocols() default {};
Class<? extends Decoder>[] decoders() default {};
Class<? extends Encoder>[] encoders() default {};
Class<? extends ClientEndpointConfig.Configurator> configurator() default ClientEndpointConfig.Configurator.class;
}
可以看见,有四个配置参数,接下来分别对这些配置进行实现:
subprotocols: 为字符串数组,表示支持的子协议名称列表
无特别
Decoder的实现:
public class SampleDecoder implements Decoder.Text<String>{
public void init(EndpointConfig paramEndpointConfig) {
// Auto-generated method stub
}
public void destroy() {
// Auto-generated method stub
}
public String decode(String paramString) throws DecodeException {
// Auto-generated method stub
return paramString.toLowerCase();
}
public boolean willDecode(String paramString) {
// Auto-generated method stub
return true;
}
}
Encoder实现
public class SimpleEncoder implements javax.websocket.Encoder.Text<String> {
public void init(EndpointConfig paramEndpointConfig) {
//Auto-generated method stub
System.out.println("Encoder init: " + paramEndpointConfig.getUserProperties());
}
public void destroy<