首页 文章

WebRTC数据通道不会发送?

提问于
浏览
0

最近我一直在尝试在Haxe中实现WebRTC数据通道,但遇到了很多困难 . 我用的时候

dataChannel.send();

尽管数据通道应该被成功打开,但似乎没有任何效果 .

我正在使用的(极其低效和混乱)代码如下所示:

package arm;
import haxe.Json;
import js.html.rtc.*;
import js.html.Document;
import js.html.WebSocket;
import js.html.DataElement;
@:expose
class DataChannelManager extends iron.Trait {
    var user = "gobbledygook";
    var first = false;
    var initiator = true;
    public function new() {
        super();

        var document = new Document();

        var ws:js.html.WebSocket;

        var config = {"iceServers":[{"url":"stun:stun.l.google.com:19302"}]};//temporary arrangement

        //var optional:Array<Dynamic> = [{'DtlsSrtpKeyAgreement': true}, {'RtcDataChannels': true }];

        // var connection:Dynamic = {
        //  'optional'://try changing this to mandatory some time
        //      optional
        // };

        var peerConnection = new PeerConnection(config);

        var dataChannel:js.html.rtc.DataChannel;

        var ready = false;

        function sendNegotiation(type, sdp) {
            var json = {user:user/*, theloc:myloc*/, action: type, data: sdp};
            ws.send(Json.stringify(json));
            trace("Negotiation of type "+json.action);
        }

        var sdpConstraints = {
                offerToReceiveAudio: false,
                offerToReceiveVideo: false
        };
        var dcOpen=false;
        notifyOnInit(function() {
            var optionalStruct:Dynamic = {reliable: true}
            dataChannel = peerConnection.createDataChannel("datachannel", optionalStruct);
            dataChannel.onmessage = function(e){trace("DC message:" +e.data);};
            dataChannel.onopen = function(){trace("-DC OPENED");dcOpen=true;};
            dataChannel.onclose = function(){trace("-DC closed!");};
            dataChannel.onerror = function(){trace("DC ERROR");};
            trace("intialization!");
        });
        var firstfirst=true;
        notifyOnUpdate(function() {
            if (dcOpen) {
                dcOpen=false;
                trace("sending...");
                dataChannel.send("stuff!");
            }
            if (firstfirst&&object.properties['go']) {
                user=object.properties['string'];
                first=true;
                firstfirst=false;

                // if (initiator) {
                //  peerConnection.createOffer(sdpConstraints).then(function (sdp) {
                //      peerConnection.setLocalDescription(sdp);
                //      sendNegotiation("offer", sdp);
                //      trace("SEND OFFER");
                //  }, function (data) {
                //      trace("Offer creation failure,", data);
                //  });
                // } else {
                //  peerConnection.createAnswer(sdpConstraints).then(function (sdp) {
                //      trace("Answer made.");

                //      peerConnection.setLocalDescription(sdp);

                //      sendNegotiation("answer", sdp);
                //  });
                // }
            }
            if (first) {
                first=false;
                ws = new WebSocket("ws://----------/*yes, there's an ip here*/:8080");
                ws.onopen = function() {
                    trace("ws opened!");
                    peerConnection.onicecandidate = function(event) {
                        trace("ICE offer ready");
                        if (peerConnection==null || event ==null || event.candidate == null) return;
                        sendNegotiation("candidate", event.candidate);
                    }

                    if (initiator) {
                        trace("initiating");
                        // var optionalStruct:Dynamic = {reliable: true}
                        // dataChannel = peerConnection.createDataChannel("datachannel", optionalStruct);
                        // dataChannel.onmessage = function(e){trace("DC message:" +e.data);};
                        // dataChannel.onopen = function(){trace("-DC OPENED");dcOpen=true;};
                        // dataChannel.onclose = function(){trace("-DC closed!");};
                        // dataChannel.onerror = function(){trace("DC ERROR");};
                        peerConnection.createOffer(/*sdpConstraints*/).then(function (sdp) {
                            peerConnection.setLocalDescription(sdp);
                            sendNegotiation("offer", sdp);
                            trace("SEND OFFER");
                        }, function (data) {
                            trace("Offer creation failure,", data);
                        });
                    }
                    ws.onmessage = function (data) {
                        //var info=data.data.split()
                        if (data.data=="connected!") {return;}
                        var adata = Json.parse(data.data.substring(5));

                        if (adata.action=="offer") {
                            trace("Offer recieved.");
                            // var optionalStruct:Dynamic = {reliable: true}
                            // dataChannel = peerConnection.createDataChannel("datachannel", optionalStruct);
                            // dataChannel.onmessage = function(e){trace("DC message:" +e.data);};
                            // dataChannel.onopen = function(){trace("DC OPENED");dcOpen=true;};
                            // dataChannel.onclose = function(){trace("DC CLOSED");};
                            // dataChannel.onerror = function(){trace("DC ERROR");};
                            peerConnection.setRemoteDescription(/*try variations here*/ adata.data);


                            peerConnection.createAnswer(sdpConstraints).then(function (sdp) {
                                trace("Answer made.");

                                peerConnection.setLocalDescription(sdp);

                                sendNegotiation("answer", sdp);
                            });
                        }
                        if (adata.action=="answer") {
                            trace("Answer recieved.");

                            peerConnection.setRemoteDescription(/*try variations here*/ adata.data);
                        }
                        if (adata.action=="candidate") {
                            trace("ICE candidate recieved, looks like:",adata);
                            var soItDoesntComplain:Dynamic = adata.data;
                            peerConnection.addIceCandidate(soItDoesntComplain);
                        }
                    }
                }

            }
            if (ready) {
                trace("connected to net");
            }
        });

        // notifyOnRemove(function() {
        // });
    }
}

您会注意到大量的代码被注释掉了 - 我在移动dataChannel创建过程中失效了 .

为了更好地了解问题所在,这里分别是接收和发起客户端的控制台输出:

如果您想知道,notifyOnInit获取一个在开头执行一次的函数,notifyOnUpdate获取一个定期调用的函数 . 给定用户名时,object.properties ['go']由不同的类设置 .

JS api基本相同(据我所知,过去我根本没有使用过WebRTC),我还没有注意到任何差异,我很确定我的问题是我的错,而不是HAXE的 .

谢谢那些回答的人 .

1 回答

  • 0

    这不是答案 . 焦虑的一点 .

    peerCoonection.createOffer()
    peerCoonection.createAnswer()
    peerCoonection.setLocalDescription()
    peerCoonection.setRemoteDescription()
    peerCoonection.addIceCandidate()
    

    等待是必需的 .

相关问题