Java模拟WSS websocket ssl请求,Java WSS模拟请求代码示例
首先简单描述下,ws和wss的区别, websocket 是 ws
,然后带证书( SSL )的 websocket 请求就是wss
。就好比是 http 和 https 的区别。就是带证书请求,wss
相对ws
来说更为安全一些。
网上检索 Java 模拟 WSS
出来的结果较少,另外不太全面,故整理一下。
Maven 导入wss websocket jar包
<dependency>
<groupId>org.java-websocket</groupId>
<artifactId>Java-WebSocket</artifactId>
<version>1.4.0</version>
</dependency>
如果您 Maven 导入失败,请使用阿里云的镜像库:
<mirrors>
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
</mirror>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
<mirror>
<id>central</id>
<name>Maven Repository Switchboard</name>
<url>http://repo1.maven.org/maven2/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
WSS Websocket 客户端
主要是要忽略证书操作,只要对方不是强校验证书就没问题。
import java.net.URI;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.*;
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.drafts.Draft;
/**
* 构建 SSLWebSocket客户端,忽略证书
*/
public abstract class SSLWebSocketClient extends WebSocketClient {
//构造方法
public SSLWebSocketClient(URI serverURI,String message) {
super(serverURI);
if(serverURI.toString().contains("wss://")){
trustAllHosts(this);
this.send(message);
}
}
public SSLWebSocketClient(URI serverURI,Draft draft) {
super(serverURI,draft);
if(serverURI.toString().contains("wss://"))
trustAllHosts(this);
}
/**
* 忽略证书
* @param client
*/
static void trustAllHosts(SSLWebSocketClient client) {
TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return new java.security.cert.X509Certificate[]{};
}
@Override
public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
}
@Override
public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
}
}};
try {
SSLContext ssl = SSLContext.getInstance("TLS");
ssl.init(null, trustAllCerts, new java.security.SecureRandom());
} catch (Exception e) {
e.printStackTrace();
}
}
}
WSS Websocket 调用
然后直接调用即可。
import java.net.URI;
import java.net.URISyntaxException;
import org.java_websocket.handshake.ServerHandshake;
public class WssTest {
public static void main(String[] args) throws URISyntaxException {
new SSLWebSocketClient(new URI("wss://wssdemo.sojson.com/test"),"初始化消息") {
@Override
public void onClose(int arg0, String arg1, boolean arg2) {
System.out.println("onClose");
}
@Override
public void onError(Exception arg0) {
System.out.println("onError");
}
@Override
public void onMessage(String arg0) {
System.out.println("onMessage");
System.out.println(arg0);
this.send(arg0);
}
@Override
public void onOpen(ServerHandshake arg0) {
System.out.println("onOpen");
this.send("发送消息");
}}.connect();
}
}
我特意多加了一个参数,您可以在 new
这个wss
客户端的时候就可以传入初始化消息,这个时候您可以发送初始化成功后的第一条消息。
有的人会问那怎么通信,也就是这是调用其他的wss,然后和自己怎么通信,您可以初始化 SSLWebSocketClient
的时候就把您的对象带进去,不管是实例化一个对象还是这个对象提供了静态方法,都可以再 onmessage
里去调用。
这里要是是 JavaScript 就很好操作了,直接传callback
方法进去即可,但是思想还是可以用上的,传对象,调用对象里的方法。
代码来自:https://blog.csdn.net/viogs/article/details/88723262 的整理。
如果是直接请求 websocket ?如何?
其实本身就是支持的,或者直接把 SSLWebSocketClient
中的wss
判断直接去掉即可,不去掉也不影响,因为是判断如果是wss
忽略证书操作。
版权所属:SO JSON在线解析
原文地址:https://www.sojson.com/blog/353.html
转载时必须以链接形式注明原始出处及本声明。
如果本文对你有帮助,那么请你赞助我,让我更有激情的写下去,帮助更多的人。