使用 jar 包 , 连接 websocket, 用域名的方式连接失败, 中间有通过 nginx 转发
<dependency>
<groupId>org.java-websocket</groupId>
<artifactId>Java-WebSocket</artifactId>
<version>1.5.3</version>
</dependency>
用浏览器的控制台 new Websocket(wss://域名) 已经成功
nginx 配置正常的 , 用于 websocket 的配置添加了
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_http_version 1.1;
使用 ws://域名 方式报 400 错误
用 wss://域名 方式 nginx 连请求都没收到
域名是买的, 是能通过验证的
使用 http 直接连接服务的方式是成功的
java 代码
ClientWs clientWs = new ClientWs(url);
clientWs.connect();
while (!clientWs.getReadyState().equals(ReadyState.OPEN)) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
System.out.println("Connecting...");
if (clientWs.getReadyState() == ReadyState.CLOSED){
System.out.println("连接失败");
System.exit(-1);
}
}
System.out.println("Connected.");
public class ClientWs extends WebSocketClient {
public ClientWs(URI serverUri) {
super(serverUri);
trustAllHosts(this);
}
public ClientWs(URI serverUri, Map<String, String> httpHeaders) {
super(serverUri, httpHeaders);
trustAllHosts(this);
}
@Override
public void onOpen(ServerHandshake serverHandshake) {
}
@Override
public void onMessage(String s) {
}
@Override
public void onClose(int i, String s, boolean b) {
}
@Override
public void onError(Exception e) {
}
static void trustAllHosts(ClientWs clientWs){
TrustManager[] trustAllCerts =new TrustManager[]{new X509TrustManager(){
@Override
public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
}
@Override
public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return new java.security.cert.X509Certificate[]{};
}
}};
try {
SSLContext ssl = SSLContext.getInstance("TLS");
ssl.init(null, trustAllCerts,new java.security.SecureRandom());
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (KeyManagementException e) {
e.printStackTrace();
}
}
}
你应该使用js来进行连接Websocket,或者使用工具,比如
http://www.jsons.cn/websocket/
或者新版的postman是能支持Websocket,浏览器直接访问ws是不行的