JAVASE 模拟WebSocket客户端
首先介绍下什么是WebSocket
WebSocket协议是html5的一种通信协议,兼容常用的浏览器。例如Chrome、 Firefox、IE等。它可以使客户端和服务端双向数据传输更加简单快捷,并且在TCP连接进行一次握手后,就可以持久性连接,同时允许服务端对客户端推送数据。外加传统模式的协议一般HTTP请求可能会包含较长的头部,但真正有效的可能只有小部分,从而就占用了很多资源和带宽。因此WebSocket协议不仅可以实时通讯,支持扩展;也可以压缩节省服务器资源和带宽。 WS协议和WSS协议两个均是WebSocket协议的SCHEM,两者一个是非安全的,一个是安全的。也是统一的资源标志符。就好比HTTP协议和HTTPS协议的差别。
百度WebSocket测试可以出现工具网站:
http://www.blue-zero.com/WebSocket/
http://coolaf.com/tool/chattest
可以先测试验证下自己的打算测试的连接的 ws:// 是否可以正常连接服务端
使用
由于爬虫使用分析html页面和js,要走在java中模拟调用webSocket协议的请求。于是寻找了下java有关的 webSocket clinet 发现现有比较方便易用的两个JAR包。
1. 使用 org.glassfish.tyrus.bundles.jar包
<dependency>
<groupId>org.glassfish.tyrus.bundles</groupId>
<artifactId>tyrus-standalone-client</artifactId>
<version>1.9</version>
</dependency>
package com.davinQI.test;
import javax.websocket.*;
import java.net.URI;
/**
*
*/
@ClientEndpoint
public class WsClient2 {
@OnOpen
public void onOpen(Session session) {
System.out.println("open ... ");
}
@OnMessage
public void onMessage(String message) {
System.out.println(" ==============返回消息了=================");
System.out.println(message);
System.out.println(" =========================================");
}
@OnError
public void onError(Throwable t) {
t.printStackTrace();
}
public static void main(String[] args) throws Exception {
WebSocketContainer container = ContainerProvider.getWebSocketContainer();
String uri = "ws://127.0.0.1:4044";
System.out.println("Connecting to :" + uri);
Session session = container.connectToServer(WsClient2.class, URI.create(uri));
session.getBasicRemote().sendText("{\"cookie\":\"_ \"}");
System.out.println(" ======================》发送命令");
Thread.sleep(1000);
session.close();
}
}
2. 使用 org.java-websocket jar包
<dependency>
<groupId>org.java-websocket</groupId>
<artifactId>Java-WebSocket</artifactId>
<version>1.3.8</version>
</dependency>
package com.davinQI.test
import org.java_websocket.WebSocket;
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.handshake.ServerHandshake;
import org.slf4j.LoggerFactory;
import java.net.URI;
/// import org.java_websocket.drafts.Draft_6455;
/**
*
*/
public class WsClient extends WebSocketClient {
private static final org.slf4j.Logger logger = LoggerFactory.getLogger(WsClient.class);
public WsClient(URI serverUri) {
super(serverUri);
}
@Override
public void onOpen(ServerHandshake serverHandshake) {
System.out.println(">>>>>>>>>onOpen " );
}
@Override
public void onMessage(String s) {
System.out.println(">>>>>>>>>onMessage:"+s);
}
@Override
public void onClose(int i, String s, boolean b) {
System.out.println(">>>>>>>>>onClose:"+s);
}
@Override
public void onError(Exception e) {
System.out.println(">>>>>>>>>onError " );
}
public static void main(String[] args) {
try {
WsClient client = new WsClient(new URI("ws://127.0.0.1:4044"));
client.connect();
logger.info(client.getDraft().toString());
int i = 0;
while (!client.getReadyState().equals(WebSocket.READYSTATE.OPEN)) {
// logger.info("正在连接...");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
i++;
if (i == 800) {
logger.info("重连...11111");
client.connect();
}
if (i > 5000) {
logger.info("我尽力了...");
break;
}
}
// boolean open3 = client.isOpen();
//连接成功,发送信息
client.send("我来了,链接下啊!");
System.out.println(">>>>>>>>>>>>>>>>");
} catch (Exception e) {
e.printStackTrace();
}
}
}
使用中第一种链接相应比较快,建议使用第一种方式。
转载请 标明地址。本文可能有错误或者不足 请大家指出。
-----------By DavinQi 。