在线等,能否请大神帮我看看WSS连接的一个问题,困惑2天了

我们服务器已经配置好了SSL证书,HTTPS也可以访问了,然后尝试用wss连接,通过html页面那种方式连接成功。

但是在Java代码中main()方法去测试无法成功,由于我们的客户端的连接是使用Java代码去连接,不使用html,能否请各位大神帮我分析一下?

我上代码:

服务端代码:

package com.fxh.test.websocket;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;

import org.apache.log4j.Logger;

@ServerEndpoint("/chat/{type}/{bookCaseId}/{timeStamp}/{token}")
public class MyWebSocketController {
	private static final Logger logger = Logger.getLogger(MyWebSocketController.class);
	public static Map<String, Session> clients = new ConcurrentHashMap<String, Session>();
	private static int onlineCount = 0;

	/**
	 * 连接建立成功调用的方法
	 * 
	 * @param session 可选的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据
	 */
	@OnOpen
	public void onOpen(@PathParam("type") String type, @PathParam("bookCaseId") String bookCaseId,
			@PathParam("timeStamp") String timeStamp, @PathParam("token") String token, Session session) {
		clients.put(bookCaseId, session);
		addOnlineCount(); // 在线数加1
		logger.info("type=" + type + ",bookCaseId=" + bookCaseId + ",timeStamp=" + timeStamp + ",token=" + token);
		logger.info("有新连接加入!当前在线人数为" + getOnlineCount());
		System.out.println("type=" + type + ",bookCaseId=" + bookCaseId + ",timeStamp=" + timeStamp + ",token=" + token);
		System.out.println("有新连接加入!当前在线人数为" + getOnlineCount());
	}

	/**
	 * 连接关闭调用的方法
	 */
	@OnClose
	public void onClose(@PathParam("bookCaseId") String bookCaseId) {
		clients.remove(bookCaseId);
		logger.info("Websocket Close Connection:" + bookCaseId);
		subOnlineCount(); // 在线数减1
		logger.info("有一连接关闭!当前在线人数为" + getOnlineCount());
		System.out.println("有一连接关闭!当前在线人数为" + getOnlineCount());
	}

	/**
	 * 收到客户端消息后调用的方法
	 * 
	 * @param message
	 *            客户端发送过来的消息
	 * @param session
	 *            可选的参数
	 */
	@OnMessage
	public void onMessage(@PathParam("bookCaseId") String bookCaseId, String message) {
		logger.info("收到消息:" + bookCaseId + ":" + message);
	}

	/**
	 * 发生错误时调用
	 * 
	 * @param session
	 * @param error
	 */
	@OnError
	public void onError(@PathParam("bookCaseId") String bookCaseId,Throwable throwable) {
        logger.info("Websocket Connection Exception:" + bookCaseId);
        logger.info(throwable.getMessage(), throwable);
        clients.remove(bookCaseId);
	}

    /**
     * 将数据传回设备(异步的方式)
     * 
     * @param bookCaseId
     * @param message
     */
    public static void broadcast(@PathParam("bookCaseId") String bookCaseId, String message) {
        if (clients.containsKey(bookCaseId)) {
            clients.get(bookCaseId).getAsyncRemote().sendText(message);
        } else {
            throw new NullPointerException("[" + bookCaseId + "]Connection does not exist");
        }
    }

	public static synchronized int getOnlineCount() {
		return onlineCount;
	}

	public static synchronized void addOnlineCount() {
		MyWebSocketController.onlineCount++;
	}

	public static synchronized void subOnlineCount() {
		MyWebSocketController.onlineCount--;
	}
}


html代码:

<!DOCTYPE HTML>
<html>
  <head>
    <title>My WebSocket</title>
  </head>
   
  <body>
    Welcome<br/>
    <input id="text" type="text" /><button οnclick="send()">Send</button>    <button οnclick="closeWebSocket()">Close</button>
    <div id="message">
    </div>
  </body>
   
  <script type="text/javascript">
      var websocket = null;
       
      //判断当前浏览器是否支持WebSocket
      if('WebSocket' in window){
          websocket = new WebSocket("wss://xxx.cn/chat/bookcase/001/20180418085250/abcd");
      }
      else{
          alert('Not support websocket');
      }
       
      //连接发生错误的回调方法
      websocket.onerror = function(){
          setMessageInnerHTML("error");
      };
       
      //连接成功建立的回调方法
      websocket.onopen = function(event){
          setMessageInnerHTML("open");
      };
       
      //接收到消息的回调方法
      websocket.onmessage = function(){
          setMessageInnerHTML(event.data);
      };
       
      //连接关闭的回调方法
      websocket.onclose = function(){
          setMessageInnerHTML("close");
      };
       
      //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
      window.onbeforeunload = function(){
          websocket.close();
      };
       
      //将消息显示在网页上
      function setMessageInnerHTML(innerHTML){
          document.getElementById('message').innerHTML += innerHTML + '<br/>';
      }
       
      //关闭连接
      function closeWebSocket(){
          websocket.close();
      }
       
      //发送消息
      function send(){
          var message = document.getElementById('text').value;
          websocket.send(message);
      }
  </script>
</html>

这样直接访问是OK的,且服务器那边日志也有了该连接记录

页面连接成功如图:



下面是Java代码测试连接:

package com.fxh.test;

import java.net.URI;

import org.java_websocket.client.WebSocketClient;
import org.java_websocket.handshake.ServerHandshake;

public class WebSocketChatClient extends WebSocketClient {
    public WebSocketChatClient(URI serverUri) {
        super(serverUri);
    }

    @Override
    public void onOpen(ServerHandshake handshakedata) {
        System.out.println("Connected");

    }

    @Override
    public void onMessage(String message) {
        System.out.println("got: " + message);

    }

    @Override
    public void onClose(int code, String reason, boolean remote) {
        System.out.println("Disconnected");
        System.exit(0);
    }

    @Override
    public void onError(Exception ex) {
        ex.printStackTrace();
        System.out.println("连接已断开");
    }
}
package com.fxh.test;

import java.net.URI;

import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

import org.java_websocket.client.DefaultSSLWebSocketClientFactory;

public class WSSTest {
    public static void main(String[] args) {
        String url = "wss://xxx.cn/chat/bookcase/001/20180418085250/abcd";
        try {
            WebSocketChatClient wsc = new WebSocketChatClient(new URI(url));
            trustAllHosts(wsc);
            wsc.connectBlocking();
            
//            BufferedReader reader = new BufferedReader( new InputStreamReader( System.in ) );
//            while ( true ) {
//                String line = reader.readLine();
//                if( line.equals( "close" ) ) {
//                    wsc.close();
//                } else {
//                    wsc.send( line );
//                }
//            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void trustAllHosts(WebSocketChatClient wsc) {
        TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
            public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                return new java.security.cert.X509Certificate[] {};
            }

            @Override
            public void checkClientTrusted(
                    java.security.cert.X509Certificate[] arg0, String arg1)
                    throws java.security.cert.CertificateException {
            }

            @Override
            public void checkServerTrusted(
                    java.security.cert.X509Certificate[] arg0, String arg1)
                    throws java.security.cert.CertificateException {
            }
        } };
        
        try {
            SSLContext sc = SSLContext.getInstance("TLS");
            sc.init(null, trustAllCerts, new java.security.SecureRandom());
            wsc.setWebSocketFactory(new DefaultSSLWebSocketClientFactory(sc));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

使用了Java-WebSocket-1.3.0.jar的包。

这样测试始终是不能连通,服务器那边日志也没有任何连接记录,本地跑也是显示Disconnected。

想请教大神们,为什么不能连通呢?是哪里写的不对吗?


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值