版权声明:本文为博主原创文章,未经博主允许不得转载。 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的区别一样。
先说下开发过程中遇到的几个坑吧:
网络请求是不识别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()中根据不同的动作进行相应的处理