1.应用背景
现在去京东、菜鸟等平台拿快递面单,需用运用他们云打印组件,发送WebSocket指令进行快递面单打印,如下就是对webSocket简单应用。
2.导入jar包
<dependency>
<groupId>org.java-websocket</groupId>
<artifactId>Java-WebSocket</artifactId>
<version>1.3.0</version>
</dependency>
3.进行webSocket工具类的编写
connectWS方法主要是进行webSocket链接,一般情况可以直接使用sendMsg方法进行连接和发送信息
@Slf4j
@Service
public class MyWSClientUtils {
@Value("${websocket.message.size}")
private Integer messageSize;
@Value("${websocket.connect.time}")
private Integer connectTime;
private static String HEARTBEAT="ping";
private static Cache<String, Session> wsCache = CacheBuilder.newBuilder()
.initialCapacity(3)
.expireAfterWrite(10, TimeUnit.HOURS) //10h 防止无用的session
.build();
/**
* @param uri "ws://192.168.18.51:7206/websocket/001/Sea/1"
*/
public synchronized Session connectWS(String uri){
Session sessionInCache = wsCache.getIfPresent(uri);
if(sessionInCache!=null&&sessionInCache.isOpen()){return sessionInCache;}
try{
if(sessionInCache!=null){sessionInCache.close();}
log.info("start connect ws : {}",uri);
WebSocketContainer container = ContainerProvider.getWebSocketContainer();
//设置消息大小最大为500KB
container.setDefaultMaxBinaryMessageBufferSize(messageSize);
container.setDefaultMaxTextMessageBufferSize(messageSize);
// 客户端,开启服务端websocket。
Session session = container.connectToServer(WSClientHandler.class,URI.create(uri));
session.setMaxIdleTimeout(connectTime);// 60S
session.getBasicRemote().sendText(HEARTBEAT);
wsCache.put(uri,session);
return session;
} catch (Exception ex) {
ex.printStackTrace();
log.warn("c出错了 connect ws:{} exp:{}",uri,ex);
}
return null;
}
/**
* @param msg
* @param uri : "ws://192.168.18.51:7206/ws/001/xx/1"
* @return
*/
public Boolean sendMsg(String msg,String uri) {
try
{
Session session = connectWS(uri);
session.getBasicRemote().sendText(msg);
return true;
}catch (Exception e){
log.error("send msg exp:{}",e);
return false;
}
}
}