Android—webrtc—(一,websocket)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a924068818/article/details/77982260

websocket是webrtc开发过程中用来与服务器交换信令的方式.

这几天刚接到一个webRtc的视频通话的项目,毫无头绪,上 网搜了下教程,经过几天的摸索,终于有了一些成果,记录下来,希望对你们能有一些帮助。

webrtc是什么。这个不了解的自行去百度吧。
webrtc与服务通讯时使用的是websocket的方式
Android studio 开发工具需要在build.gradle文件中添加依赖:

compile "org.java-websocket:Java-WebSocket:1.3.4"

网上你可能也看到有人用1.3.0的。但是我在使用过程中除了一点状况,所以就改用这个了。

websocket通讯的地址一般为ws或者wss而我们用的,他们的区别就跟http和https的区别一样。

先说下开发过程中遇到的几个坑吧:

  1. 网络请求是不识别ws/wss开头的host地址。使用socket-io时,没有获取到socket的对象实例,报了一个空指针,继续追踪之后发现URI解析除了问题
    (websocket在线测试工具 连接局域网也可以测试本地)

    > java.net.URISyntaxException: Unknown protocol: wss:
    > wss://192.168.28.124:8445/call
    >     at com.github.nkzawa.socketio.client.IO.socket(IO.java:61)
    >     at com.github.nkzawa.socketio.client.IO.socket(IO.java:41)
    
    因为项目比较着急,就赶快换了框架,使用了org.java-websocket。 也就是上边的那个框架。
    

    2.这次能连接ws://121.40.165.18:8088的服务器了,代码如下:
    如果遇到websocket ios能连接上 但是Android却不能连接上,下边的代码应该也能帮你解决这个问题(很可能就是证书的问题,如果你的服务器端不是开放所有证书均可访问的话,那你还需要在本地加载证书,而Android需要的证书为BKS格式,但是服务器使用的确是JKS,可以去看我的这篇文章,JKS转BKS


    private void testWebwocket() {
        String uri = "ws://121.40.165.18:8088";
        WebSocketClient webSocketClient = null;
        try {
            webSocketClient = new WebSocketClient(new URI(uri)) {
                @Override
                public void onOpen(ServerHandshake handshakedata) {

                }

                @Override
                public void onMessage(String message) {

                }

                @Override
                public void onClose(int code, String reason, boolean remote) {

                }

                @Override
                public void onError(Exception ex) {

                }
            };
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }
            //wss的通讯需要设置证书,解开下边的注释就OK了
//        setSocket(webSocketClient);

        webSocketClient.connect();
    }

    private void setSocket(WebSocketClient webSocketClient) {
        SSLContext sslContext = null;
        //如果需要证书验证 解开这段注释  否则默认使用空的证书
//                        try {
//                            keyStore = KeyStore.getInstance("BKS");
//                            InputStream inputStream = getResources().openRawResource(R.raw.keystore);
//                            keyStore.load(inputStream, "mima".toCharArray());
//                            keyManagers = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm(), keyStore.getProvider()).getKeyManagers();
//                        } catch (KeyStoreException e) {
//                            e.printStackTrace();
//                        } catch (NoSuchAlgorithmException e) {
//                            e.printStackTrace();
//                        } catch (CertificateException e) {
//                            e.printStackTrace();
//                        } catch (IOException e) {
//                            e.printStackTrace();
//                        }
        try {
            sslContext = SSLContext.getInstance("TLS");
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        try {
            sslContext.init(null, new TrustManager[]{
                    new X509TrustManager() {

                        public void checkClientTrusted(X509Certificate[] certs, String authType) {
                            System.out.println("checkClientTrusted1");
                        }

                        @Override
                        public void checkClientTrusted(java.security.cert.X509Certificate[] arg0, String arg1)
                                throws CertificateException {
                            System.out.println("checkClientTrusted2");
                        }

                        public void checkServerTrusted(X509Certificate[] certs,
                                                       String authType) {
                            System.out.println("checkServerTrusted1");
                        }

                        @Override
                        public void checkServerTrusted(java.security.cert.X509Certificate[] arg0, String arg1)
                                throws CertificateException {
                            System.out.println("checkServerTrusted2");
                        }

                        @Override
                        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                            return null;
                        }
                    }
            }, new SecureRandom());
        } catch (KeyManagementException e) {
            e.printStackTrace();
        }
        SSLSocketFactory factory = sslContext.getSocketFactory();

        try {
            webSocketClient.setSocket(factory.createSocket());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

需要发送消息,直接调用webSocketClient.getConnection().sendMessage(“你想发送的信息”);
收到的消息就直接在onMessage(),因为每次请求时执行的动作不同,所以需要在onMessage()中根据不同的动作进行相应的处理

猜你喜欢

转载自blog.csdn.net/a924068818/article/details/77982260