我需要在使用 J2EE 技术开发并部署在 JBoss 服务器中的网站中添加视频会议功能。经过多次研究,我找到了 WebRTC,但我想知道如何将它与 jboss 一起使用,因为大多数示例都将它与 node.js 一起使用,一个简单的代码示例会很有帮助。谢谢你。
编辑
我已经尝试过 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://localhost:8080/jasper/webrtc”失败:WebSocket 握手期间出错:意外响应代码:404
编辑 我发现 JBoss as 7.1.0 不支持 websocket