JAVASE 模拟WebSocket客户端

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 。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值