Я настроил базовое приложение для видеочата, используя API-интерфейсы WebRTC в Chrome вместе со сценарием WebSocket, который я написал сам в соответствии со спецификациями W3C и другими вопросами здесь, на SO.
Однако иногда, когда один компьютер отправляет информацию о кандидате ICE на другой компьютер через соединение WebSocket, к концу информации о кандидате в формате JSON прикрепляется куча искаженного текста. Однако эта проблема возникает только иногда и никогда не возникает с информацией SDP, отправляемой с помощью методов createOffer и createAnswer.
Пожалуйста, посмотрите следующую ссылку для примера того, о чем я говорю: http://s1290.beta.photobucket.com/user/HartleySan83/media/NGdata_zps0a7203e7.png.html?sort=3&o=0
Поскольку информация о кандидате в формате JSON всегда заканчивается на «}}», добавив условие if в сценарий сервера WebSocket, я смог обойти эту проблему и заставить приложение видеочата работать. К сожалению, это взлом, которого я хотел бы избежать. Кроме того, я хотел бы знать, почему это происходит в первую очередь.
Стоит отметить, что когда я либо предупреждаю, либо вывожу информацию о кандидате на консоль на стороне клиента, прежде чем она будет отправлена серверному сценарию WebSocket, никакого лишнего искаженного текста нет, поэтому я не уверен, почему он присутствует с кандидатом информация на стороне сервера и только иногда.
Ниже приведен фрагмент кода на стороне клиента, в котором информация о кандидате отправляется сценарию на стороне сервера:
function startPeerConnection() {
navigator.webkitGetUserMedia({ audio: true, video: true }, function (stream) {
document.getElementById('vid1').src = webkitURL.createObjectURL(stream);
pc = new webkitRTCPeerConnection(null);
pc.onicecandidate = function (evt) {
if (evt.candidate) {
socket.send(JSON.stringify({ candidate: evt.candidate }));
}
};
pc.onaddstream = function (evt) {
document.getElementById('vid2').src = webkitURL.createObjectURL(evt.stream);
};
pc.addStream(stream);
}, function () {});
}
И следующий код на стороне сервера, который демаскирует полученные данные WebSocket:
$len = ord($buffer[1]) & 127;
if ($len === 126) {
$masks_start = 4;
} else if ($len === 127) {
$masks_start = 10;
} else {
$masks_start = 2;
}
$masks = substr($buffer, $masks_start, 4);
$data = substr($buffer, $masks_start + 4);
$len = strlen($data);
$text = '';
for ($i = 0; $i < $len; $i++) {
$text .= $data[$i] ^ $masks[$i % 4];
}
if (($end = strpos($text, '}}')) !== false) {
// This if condition eliminates the garbled text.
// Without it, a "Could not decode a text frame as UTF-8"
// error is output to the Chrome console.
$text = substr($text, 0, $end + 2);
$len = strlen($text);
}
if ($len <= 125) {
$header = pack('C*', 129, $len);
} else if (($len > 125) && ($len < 65536)) {
$header = pack('C*', 129, 126, ($len >> 8) & 255, $len & 255);
} else if ($len >= 65536) {
$header = pack('C*', 129, 127, ($len >> 56) & 255, ($len >> 48) & 255, ($len >> 40) & 255, ($len >> 32) & 255, ($len >> 24) & 255, ($len >> 16) & 255, ($len >> 8) & 255, $len & 255);
}
$server_response = $header . $text;
foreach ($users as $user) {
if ($user !== $users[$user_idx]) {
@socket_write($user['socket'], $server_response, strlen($server_response));
}
}
Я искал в Интернете всех, у кого была такая же проблема, но я не могу найти никого или ничего в спецификациях, где говорится об этом, поэтому я предполагаю, что это какая-то проблема с моим кодом.
Любое руководство, которое кто-либо может предложить относительно источника проблемы, будет высоко оценено. Спасибо.