2015-12-28 2 views
0

Мне нужно добавить возможности видеоконференций на свой веб-сайт, разработанный с использованием технологии J2EE и развернутый на сервере JBoss. После многих исследований я нашел WebRTC, но я хотел бы знать, как я могу использовать его с jboss, поскольку большинство примеров используют его с node.js . Простой пример кода был бы полезным. Спасибо.видеоконференции с webRTC в приложении J2EE

Редактировать
Я попытался WebRTC, но я получил некоторые вопросы по сигнализации части:
Я использую WebSocket и это мой код класса

package com.bean; 
import java.io.IOException; 
import java.util.Hashtable; 
import java.util.Map; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

import javax.faces.bean.ApplicationScoped; 
import javax.websocket.OnError; 
import javax.websocket.OnMessage; 

import javax.websocket.OnOpen; 

import javax.websocket.Session; 

import javax.websocket.server.ServerEndpoint; 

import org.json.JSONException; 

import org.json.JSONObject; 

@ApplicationScoped 
@ServerEndpoint("/webrtc") 
public class WebRTCSocket { 

    public static Map < String, Hashtable < String, Object[] >> sessionMap = new Hashtable < String, Hashtable < String, Object[] >>(); 

    @SuppressWarnings("unchecked") 
    @OnMessage 
    public void message(String message, Session session) { 
     System.out.println("entre a la methode"); 
     try { 

      JSONObject jsonObject = new JSONObject(message); 

      try { 

       Object isOpen = jsonObject.get("open"); 

       if (isOpen != null && (Boolean) isOpen == true) { 

        String channel = (String) jsonObject.get("channel"); 

        Object value = sessionMap.get(channel); 

        Hashtable < String, Object[] > sourceDestMap = null; 

        if (value == null) { 

         sourceDestMap = new Hashtable < String, Object[] >(); 

        } else sourceDestMap = (Hashtable < String, Object[] >) value; 

        sourceDestMap.put(session.getId(), new Object[] { 
         session 
        }); 

        sessionMap.put(channel, sourceDestMap); 

       } 

      } catch (JSONException je) { 

       je.printStackTrace(); 

      } 

      try { 

       Object dataObj = jsonObject.get("data"); 

       JSONObject dataMapObj = (JSONObject) dataObj; 

       //Object thisUserId = dataMapObj.get("userid"); 

       String channel = null; 

       try { 

        channel = (String) dataMapObj.get("sessionid"); 

       } catch (JSONException json) { 

        channel = (String) jsonObject.get("channel"); 

       } 

       /* 
       JSONObject dataMapObj = (JSONObject) dataObj; 

       Object thisUserId = dataMapObj.get("userid"); 

       String channel = (String) dataMapObj.get("sessionid"); 

       Hashtable < string, object > sourceDestMap = sessionMap.get(channel); 

       if (thisUserId != null && sourceDestMap.get((String) thisUserId) == null) { 

        sourceDestMap.put((String) thisUserId, new Object[] { 
         message, session 
        }); 

       } 

       for (String userId: sourceDestMap.keySet()) { 

        if (!userId.equals(thisUserId)) { 

         Session otherSession = (Session)((Object[]) sourceDestMap.get(userId))[1]; 

         otherSession.getBasicRemote().sendText(message); 

        } 

       } 
       */ 

       Hashtable < String, Object[] > sourceDestMap = sessionMap.get(channel); 

       if (sourceDestMap != null) 

       for (String id: sourceDestMap.keySet()) { 

        if (!id.equals(session.getId())) { 

         Session otherSession = (Session)((Object[]) sourceDestMap.get(id))[0]; 

         if (otherSession.isOpen()) 

         otherSession.getBasicRemote().sendText(dataMapObj.toString()); 

        } 

       } 

      } catch (JSONException je) { 

       je.printStackTrace(); 

      } 

     } catch (JSONException je) { 

      je.printStackTrace(); 

     } 
    catch (IOException je) { 

     je.printStackTrace(); 

    } 

     System.out.println("Message received:" + message); 

    } 

    @OnOpen 
    public void open(Session session) { 

     System.out.println("Channel opened"); 

    } 

    // need to implement @OnClose too 
    @OnError 
    public void onError(Throwable error) { 
     Logger.getLogger(WebRTCSocket.class.getName()).log(Level.SEVERE, null, error); 
    } 
} 

это моя страница XHTML

<html> 
    <head> 

    </head> 

    <body> 

      <script > 

    var localVideo; 
    var remoteVideo; 
    var peerConnection; 
    var peerConnectionConfig = {'iceServers': [{'url': 'stun:stun.services.mozilla.com'}, {'url': 'stun:stun.l.google.com:19302'}]}; 

    navigator.getUserMedia = navigator.getUserMedia || navigator.mozGetUserMedia || navigator.webkitGetUserMedia; 
    window.RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection; 
    window.RTCIceCandidate = window.RTCIceCandidate || window.mozRTCIceCandidate || window.webkitRTCIceCandidate; 
    window.RTCSessionDescription = window.RTCSessionDescription || window.mozRTCSessionDescription || window.webkitRTCSessionDescription; 

    function pageReady() { 
     localVideo = document.getElementById('localVideo'); 
     remoteVideo = document.getElementById('remoteVideo'); 

     serverConnection = new WebSocket('ws://localhost:8080/jasper/webrtc'); 
     console.log('serverConnection' + serverConnection.url); 

     serverConnection.onmessage = gotMessageFromServer; 

     var constraints = { 
      video: true, 
      audio: true, 
     }; 

     if(navigator.getUserMedia) { 
      navigator.getUserMedia(constraints, getUserMediaSuccess, errorHandler); 
     } else { 
      alert('Your browser does not support getUserMedia API'); 
     } 
    } 

    function getUserMediaSuccess(stream) { 
     localStream = stream; 
     localVideo.src = window.URL.createObjectURL(stream); 
    } 

    function start(isCaller) { 
     peerConnection = new RTCPeerConnection(peerConnectionConfig); 
     peerConnection.onicecandidate = gotIceCandidate; 
     peerConnection.onaddstream = gotRemoteStream; 
     peerConnection.addStream(localStream); 

     if(isCaller) { 
      peerConnection.createOffer(gotDescription, errorHandler); 
     } 
    } 

    function gotMessageFromServer(event) { 
     console.log('gotMessageFromServer' + JSON.parse(event.data)); 
     if(!peerConnection) start(false); 

     var signal = JSON.parse(event.data); 
     if(signal.sdp) { 
      peerConnection.setRemoteDescription(new RTCSessionDescription(signal.sdp), function() { 
       peerConnection.createAnswer(gotDescription, errorHandler); 
      }, errorHandler); 
     } else if(signal.ice) { 
      peerConnection.addIceCandidate(new RTCIceCandidate(signal.ice)); 
     } 
    } 

    function gotIceCandidate(event) { 
     if(event.candidate != null) { 
      serverConnection.send(JSON.stringify({'ice': event.candidate})); 
     } 
    } 

    function gotDescription(description) { 
     console.log('got description'); 
     peerConnection.setLocalDescription(description, function() { 
      serverConnection.send(JSON.stringify({'sdp': description})); 
     }, function() {console.log('set description error')}); 
    } 

    function gotRemoteStream(event) { 
     console.log('got remote stream'); 
     remoteVideo.src = window.URL.createObjectURL(event.stream); 
    } 

    function errorHandler(error) { 
     console.log(error); 
    } 


    </script> 

    <video id="localVideo" autoplay="autoplay" style="width:40%;"></video> 
     <video id="remoteVideo" autoplay style="width:40%;"></video> 

     <br /> 

     <input type="button" id="start" onclick="start(true)" value="Start Video"></input> 

     <script type="text/javascript"> 
      pageReady(); 
     </script> 
    </body> 
</html> 

Я использую Jboss-as-7.1.0 final , поэтому я добавил эту зависимость

<dependency> 
    <groupId>org.jboss.spec.javax.websocket</groupId> 
    <artifactId>jboss-websocket-api_1.0_spec</artifactId> 
    <version>1.0.0.Final</version> 
    <scope>provided</scope> 
</dependency> 

в консоли я получил эту ошибку:

WebSocket подключения к 'WS: // локальный: 8080/Яшма/WebRTC' не удалось: Ошибка при WebSocket рукопожатия: Неожиданный код ответа: 404

EDIT я обнаружил, что JBoss, как 7.1.0 не поддерживает WebSocket

+0

Вы смотрели на проект https://github.com/kurento? –

+0

, если вы внимательно посмотрите на примеры, которые вы заметили бы, основная часть кода находится на стороне клиента, сервер просто будет использоваться для сигнализации ... – mido

+0

Если вы хотите получить точный ответ, вы должны улучшить свой вопрос. Действительно, www.kurento.org - это вариант, но все зависит от функций, которые вы хотите. Вам нужны двухточечные видеозвонки?, Это групповые звонки? вам нужна запись? вам нужно взаимодействовать с другими механизмами RTC? Вся эта информация необходима, чтобы выяснить, какой у вас лучший вариант. – lulop

ответ

0

ява код

package org.acode; 

import java.util.Hashtable; 
import java.util.Map; 
import javax.websocket.OnMessage; 
import javax.websocket.OnOpen; 
import javax.websocket.Session; 
import javax.websocket.server.ServerEndpoint; 
import org.json.JSONException; 
import org.json.JSONObject; 

@ServerEndpoint("/webrtc") 
public class WebRTCSocket { 

    public static Map<String, Hashtable<String, Object[]>> sessionMap = new Hashtable<>(); 

    @OnMessage 
    public void message(String message, Session session) { 
     try { 
      System.out.println("receive message: " + message); 
      JSONObject jsonObject = new JSONObject(message); 
      String channel = null; 
      JSONObject dataMapObj = null; 

      Hashtable<String, Object[]> sourceDestMap = null; 

      try { 
       boolean isOpen = jsonObject.optBoolean("open"); 
       channel = (String) jsonObject.get("channel"); 
       sourceDestMap = (Hashtable<String, Object[]>) sessionMap.get(channel); 
       if (sourceDestMap == null) { 
        sourceDestMap = new Hashtable<String, Object[]>(); 
       } 
       if (isOpen) { 
        /* Открытие канала */ 
        sourceDestMap.put(session.getId(), new Object[]{session}); 
        sessionMap.put(channel, sourceDestMap); 
       } else { 
        /*Остальные переговоры*/ 
        dataMapObj = jsonObject.optJSONObject("data"); 
        if (dataMapObj != null) { 
         sourceDestMap = sessionMap.get(channel); 
         for (String id : sourceDestMap.keySet()) { 
          if (!id.equals(session.getId())) { 
           Session otherSession = (Session) ((Object[]) sourceDestMap.get(id))[0]; 
           if (otherSession.isOpen()) { 
            otherSession.getBasicRemote().sendText(dataMapObj.toString()); 
           } 
          } 
         } 
        } 
       } 
      } catch (Exception je) { 
       je.printStackTrace(); 
      } 
     } catch (JSONException je) { 
      je.printStackTrace(); 
     } 
    } 

    @OnOpen 
    public void open(Session session 
    ) { 
     System.out.println("Channel opened"); 
    } 

    // need to implement @OnClose too 
} 

JS openSignallingChannel

var SIGNALING_SERVER = "ws://192.168.1.46:8080/webrtc"; 
    connection.openSignalingChannel = function (config) { 
     config.channel = config.channel || this.channel; 
     var websocket = new WebSocket(SIGNALING_SERVER); 
     websocket.channel = config.channel; 
     websocket.onopen = function() { 
      websocket.push(JSON.stringify({ 
       open: true, 
       channel: config.channel 
      })); 
      if (config.callback) 
       config.callback(websocket); 
     }; 
     websocket.onmessage = function (event) { 
      config.onmessage(JSON.parse(event.data)); 
     }; 
     websocket.push = websocket.send; 
     websocket.send = function (data) { 
      websocket.push(JSON.stringify({ 
       data: data, 
       channel: config.channel 
      })); 
     }; 
    }; 
Смежные вопросы