JS和PHP
每个用户都发布并可以订阅不同的用户流这是一个单向订阅-订阅者看到的是发布者,而不是组中的其他成员。出版商没有看到订阅他的人。
我的逻辑:1.每个人都在发布-session.on-未被调用2.当订阅时-我更改sessionId和令牌-到用户订阅的频道(我能那样做吗?)那部分好像不起作用-我得到:"会话未定义"
我能像以前那样中途更改sessionId和token吗?
(每个用户通过PHP SDK为每个会话获得自己的令牌)
实际上不需要有多个会话。问题可以归结为这样一个事实,即每个客户端都应该发布一个流,并且每个客户端都可以从其他客户端选择并订阅任何一个流。从逻辑上讲,会话已经像一组流,所以不需要创建多个流。
我有一个解决方案的例子。在这个解决方案中,PHP SDK只需要为会话中的每个客户端创建一个令牌,并且在服务器端没有特殊的逻辑。目前,我已经将一个令牌硬编码到脚本中,只要在几个窗口/选项卡中打开同一个页面,它就会正常工作。每个流可以使用其CCD_ 1来选择。在您的应用程序中,您可能希望使用PHP SDK为每个客户端添加唯一的令牌数据,然后使用stream.connection.data
属性读取该令牌数据,以呈现每个流的更友好的标识符(我已经用TODO
注释标记了它在代码中的位置)。
示例:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>JS Bin</title>
<script src='//static.opentok.com/webrtc/v2.2/js/opentok.min.js'></script>
<script src="//code.jquery.com/jquery-2.1.1.min.js"></script>
</head>
<body>
<!-- Publisher placeholder -->
<div id="publisher"></div>
<!-- Stream selector interface -->
<div id="streams"></div>
<!-- Subscriber (only one) -->
<div id="subscriber"></div>
<script>
// This data is generated by the server
var sessionId = '2_MX44NTQ1MTF-fjE0MTU4ODc5NTE4ODV-SEN3dXBPYkFTbkFkZ3cwN3BDckJ1VDJNfn4',
apiKey = '854511',
token = 'T1==cGFydG5lcl9pZD04NTQ1MTEmc2lnPWE1YzBiOTA0ODcyZDQxNjRjNTc4YTI4MGUwZjI4ODNiYjU4N2Q3YmM6cm9sZT1wdWJsaXNoZXImc2Vzc2lvbl9pZD0yX01YNDROVFExTVRGLWZqRTBNVFU0T0RjNU5URTRPRFYtU0VOM2RYQlBZa0ZUYmtGa1ozY3dOM0JEY2tKMVZESk5mbjQmY3JlYXRlX3RpbWU9MTQxNTg4ODY4MSZub25jZT0wLjMwMTMwMjMxMzY2ODA4NzkmZXhwaXJlX3RpbWU9MTQxODQ3OTk0MA==';
</script>
<script>
var session = OT.initSession(apiKey, sessionId),
puslisher = OT.initPublisher('publisher'),
streams = {},
subscriber;
session.on({
'sessionConnected': function(event) {
// each client publishes
session.publish(publisher);
},
'streamCreated': function(event) {
// create a button to select the stream
// TODO: use connection data from token for a friendlier description of the stream
$('<button class="stream stream-'+event.stream.streamId+'">Stream'+event.stream.streamId+'</button>').appendTo('#streams');
// store the stream object for later use
streams[event.stream.streamId] = event.stream;
},
'streamDestroyed': function(event) {
// remove the button for the stream that was destroyed
$('#streams .stream-'+event.stream.streamId).remove();
// remove the stream object from the storage
delete streams[event.stream.streamId];
}
});
var streamSelected = function(event) {
// subscribe to the selected stream
var streamId = extractStreamId(event.target);
if (subscriber) {
session.unsubscribe(subscriber);
}
subscriber = session.subscribe(streams[streamId], 'subscriber');
subscriber.on('destroyed', function() { subscriber = false; });
// disable the button and enable all others
$('#streams button').prop('disabled', false);
$(event.target).prop('disabled', true);
};
var extractStreamId = function (element) {
var classes = element.className.split(' '),
streamId;
classes.forEach(function(classStr) {
if (classStr.indexOf('stream-') === 0) {
streamId = classStr.slice(7);
}
});
return streamId;
};
$(document).ready(function() {
$('#streams').on('click', '.stream', streamSelected);
session.connect(token);
});
</script>
</body>
</html>
JSBin上提供了此示例的实时页面:http://jsbin.com/duxowa/10/edit
注意:如果您在我的帖子之后查看此内容,则令牌可能会过期。从控制面板使用您自己的apiKey
、sessionId
和token
,如果是这样的话,可以使用服务器SDK。