基于Jitsi的网页视频通话项目

Jitsi-meet.js如下:

(function e(t, n, r) {
    function s(o, u) {
        if (!n[o]) {
            if (!t[o]) {
                var a = typeof require == "function" && require;
                if (!u && a)
                    return a(o, !0);
                if (i)
                    return i(o, !0);
                var f = new Error("Cannot find module '" + o + "'");
                throw f.code = "MODULE_NOT_FOUND", f
            }
            var l = n[o] = {
                exports : {}
            };
            t[o][0].call(l.exports, function(e) {
                var n = t[o][1][e];
                return s(n ? n : e)
            }, l, l.exports, e, t, n, r)
        }
        return n[o].exports
    }
    var i = typeof require == "function" && require;
    for (var o = 0; o < r.length; o++)
        s(r[o]);
    return s
})
        (
                {
                    1 : [
                            function(require, module, exports) {
                                'use strict';
                                var _createClass = function() {
                                    function defineProperties(target, props) {
                                        for (var i = 0; i < props.length; i++) {
                                            var descriptor = props[i];
                                            descriptor.enumerable = descriptor.enumerable || false;
                                            descriptor.configurable = true;
                                            if ("value" in descriptor)
                                                descriptor.writable = true;
                                            Object.defineProperty(target,descriptor.key, descriptor);
                                        }
                                    }
                                    return function(Constructor, protoProps,staticProps) {
                                        if (protoProps)
                                            defineProperties(Constructor.prototype,protoProps);
                                        if (staticProps)
                                            defineProperties(Constructor,staticProps);
                                        return Constructor;
                                    };
                                }();

                                function _classCallCheck(instance, Constructor) {
                                    if (!(instance instanceof Constructor)) {
                                        throw new TypeError("Cannot call a class as a function");
                                    }
                                }

                                function _possibleConstructorReturn(self, call) {
                                if (!self) {
                                    throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
                                    }
                                    return call&& (typeof call === "object" || typeof call === "function")?call:self;
                                }

                                function _inherits(subClass, superClass) {
                                    if (typeof superClass !== "function"&& superClass !== null) {
                                        throw new TypeError(
                        "Super expression must either be null or a function, not "+typeof superClass);
                                    }
                                    subClass.prototype = Object.create(
                                            superClass && superClass.prototype,
                                            {
                                                constructor : {
                                                    value : subClass,
                                                    enumerable : false,
                                                    writable : true,
                                                    configurable : true
                                                }
                                            });
                        if (superClass)
                         Object.setPrototypeOf?Object.setPrototypeOf(subClass,superClass):subClass.__proto__ = superClass;
                                }

                                var EventEmitter = require('events').EventEmitter;
                                var loadScript = require('load-script2');

                                var JitsiMeet = function(_EventEmitter) {
                                    _inherits(JitsiMeet, _EventEmitter);

                                    function JitsiMeet(baseUrl) {
                                        _classCallCheck(this, JitsiMeet);

                                        var _this = _possibleConstructorReturn(
                                        this,(JitsiMeet.__proto__ || Object.getPrototypeOf(JitsiMeet)).call(this));

                                        _this._baseUrl = new window.URL(baseUrl);
                                        _this._ready = false;

                                        setTimeout(function() {
                                            return _this._loadApi();
                                        });
                                        return _this;
                                    }

                                    _createClass(
                                            JitsiMeet,
                                            [
                                                {
                                                  key : '_loadApi',
                                                    value : function _loadApi() {
                                                    var _this2 = this;
                                                    if (window.JitsiMeetExternalAPI) {
                                                                // Already
                                                                // loaded
                                                        this._ready = true;
                                                        this.emit('ready');
                                                        return;
                                                            }
                                            var apiUrl = this._baseUrl.href+ 'external_api.js';
                                                loadScript(
                                                    apiUrl,
                                                        function(err) {
                                                            if (err) {
                                             console.error('Error loading external API from '+ apiUrl);
                                                        _this2.emit('initError');}
                                                      else {
                                                            _this2._ready = true;
                                                          _this2.emit('ready');
                                                                        }
                                                                    });
                                                        }
                                                    },
                                                    {
                                                key : 'join',
                                                value : function join(room, selector,options) {
                                                    if (!this._ready) {
                                                        throw new Error('The library is not ready yet!');
                                                        }
                                            return new JitsiMeetConference(
                                                    this._baseUrl,'' + room,selector,options);
                                                        }
                                                    }, {
                                                        key : 'ready',
                                                        get : function get() {
                                                            return this._ready;
                                                        }
                                                    } ]);
                                    return JitsiMeet;
                                }(EventEmitter);

                                var JitsiMeetConference = function(_EventEmitter2) {
                                    _inherits(JitsiMeetConference,_EventEmitter2);
                                    function JitsiMeetConference(baseUrl, room,selector, options) {
                                        _classCallCheck(this,JitsiMeetConference);
                                        var _this3 = _possibleConstructorReturn(
                    this,(JitsiMeetConference.__proto__ || Object.getPrototypeOf(JitsiMeetConference)).call(this));
                                        _this3._roomUrl = '' + baseUrl.href+ room;
                    _this3._node = typeof selector === 'string' ? document.querySelector(selector): selector;
                                        // XXX Fixup config overrides
                                    var config = Object.assign({},options.config);
                                    config.startAudioMuted = 9999; // make sure we always start unmuted
                                    config.startVideoMuted = 9999; 
                                    config.enableRecording = false; // fix bug when customizing toolbars
                                    fixupConfigObject(config);
                                    var interfaceConfig = Object.assign({},options.interfaceConfig);
                                    fixupConfigObject(interfaceConfig);
                                        _this3._api = new window.JitsiMeetExternalAPI(
                                          baseUrl.host, // domain
                                          room, undefined, undefined, _this3._node, // HTML DOM element
                                                config, interfaceConfig,
                                                baseUrl.protocol !== 'https:' // No SSL?
                                        );
                                        // XXX workarounds
                                        //_this3._api.iframeHolder.style.height = '100%';
                                        //_this3._api.iframeHolder.style.width = '100%';
                                        //_this3._api.frame.style.border = 0;
                                        _this3._avatarUrl = '';
                                        _this3._displayName = '';
                                        _this3._email = '';
                                        _this3._audioMuted = false;
                                        _this3._videoMuted = false;
                                        _this3._shareScreen = false;
                                        // Setup event listeners
                                        _this3._api.addEventListeners({
                                            videoConferenceJoined : _this3._onVideoConferenceJoined.bind(_this3),
                                            videoConferenceLeft : _this3._onVideoConferenceLeft.bind(_this3),
                                            readyToClose : _this3._onReadyToClose.bind(_this3)
                                                });
                                        return _this3;
                                    }

                                    _createClass(
                                            JitsiMeetConference,
                                            [
                                                {
                                                  key : 'hangup',
                                                    value : function hangup() {
                                                        this._api.hangup();
                                                        }
                                                    },
                                                    {
                                                        key : 'dispose',
                                                        value : function dispose() {
                                                            if (this._api !== null) {
                                                                this._api.dispose();
                                                                this._api = null;
                                                            }
                                                        }
                                                    },
                                                    {
                                                        key : '_onVideoConferenceJoined',
                                                        value : function _onVideoConferenceJoined() {
                                                            this.emit('joined');
                                                        }
                                                    },
                                                    {
                                                        key : '_onVideoConferenceLeft',
                                                        value : function _onVideoConferenceLeft() {
                                                            this.emit('left');
                                                        }
                                                    },
                                                    {
                                                        key : '_onReadyToClose',
                                                        value : function _onReadyToClose() {
                                                            this.dispose();
                                                        }
                                                    },
                                                    {
                                                        key : 'avatarUrl',
                                                        get : function get() {
                                                            return this._avatarUrl;
                                                        },
                                                        set : function set(value) {
                                                            this._avatarUrl = value;
                                                            this._api.executeCommand('avatarUrl',value);
                                                        }
                                                    },
                                                    {
                                                        key : 'displayName',
                                                        get : function get() {
                                                            return this._displayName;
                                                        },
                                                    set : function set(value) {
                                                    this._displayName = value;
                                                    this._api.executeCommand('displayName',value);
                                                        }
                                                    },
                                                    {
                                                        key : 'email',
                                                        get : function get() {
                                                            return this._email;
                                                        },
                                                        set : function set(
                                                                value) {
                                                            this._email = value;
                                                            this._api.executeCommand('email',value);
                                                        }
                                                    },
                                                    {
                                                        key : 'roomUrl',
                                                        get : function get() {
                                                            return this._roomUrl;
                                                        }
                                                    },
                                                    {
                                                        key : 'audioMuted',
                                                        get : function get() {
                                                            return this._audioMuted;
                                                        },
                                                        set : function set(
                                                                muted) {
                                                            if (this._audioMuted === muted) {
                                                                return;
                                                            }

                                                            this._audioMuted = muted;
                                                            this._api.executeCommand('toggleAudio');
                                                        }
                                                    },
                                                    {
                                                        key : 'videoMuted',
                                                        get : function get() {
                                                            return this._videoMuted;
                                                        },
                                                        set : function set(
                                                                muted) {
                                                            if (this._videoMuted === muted) {
                                                                return;
                                                            }

                                                            this._videoMuted = muted;
                                                            this._api.executeCommand('toggleVideo');
                                                        }
                                                    },
                                                    {
                                                        key : 'shareScreen',
                                                        get : function get() {
                                                            return this._shareScreen;
                                                        },
                                                        set : function set(
                                                                share) {
                                                            if (this._shareScreen === share) {
                                                                return;
                                                            }
                                                            this._shareScreen = share;
                                                            this._api.executeCommand('toggleShareScreen');
                                                        }
                                                    } ]);
                                    return JitsiMeetConference;
                                }(EventEmitter);

                                function fixupConfigObject(config) {
                                    for ( var key in config) {
                                        if (typeof key !== 'string') {
                                            continue;
                                        }
                                        try {
                                            config[key] = encodeURIComponent(JSON
                                                    .stringify(config[key]));
                                        } catch (e) {
                                            console.warn('Error encoding '+ key + ': ' + e);
                                            delete config[key];
                                        }
                                    }
                                }
                                module.exports = JitsiMeet;

                                // Export also to the window object if running
                                // in a browser.
                                if (typeof window !== 'undefined') {
                                    window.JitsiMeet = JitsiMeet;
                                }
                            }, {
                                "events" : 2,
                                "load-script2" : 3
                            } ],2:[
                            function(require, module, exports) {
                                function EventEmitter() {
                                    this._events = this._events || {};
                                    this._maxListeners = this._maxListeners|| undefined;
                                }
                                module.exports = EventEmitter;
                                // Backwards-compat with node 0.10.x
                                EventEmitter.EventEmitter = EventEmitter;
                                EventEmitter.prototype._events = undefined;
                                EventEmitter.prototype._maxListeners = undefined;
                                // By default EventEmitters will print a warning
                                // if more than 10 listeners are
                                // added to it. This is a useful default which
                                // helps finding memory leaks.
                                EventEmitter.defaultMaxListeners = 10;
                                // Obviously not all Emitters should be limited
                                // to 10. This function allows
                                // that to be increased. Set to zero for
                                // unlimited.
                                EventEmitter.prototype.setMaxListeners = function(
                                        n) {
                                    if (!isNumber(n) || n < 0 || isNaN(n))
                                        throw TypeError('n must be a positive number');
                                    this._maxListeners = n;
                                    return this;
                                };
                                EventEmitter.prototype.emit = function(type) {
                                    var er, handler, len, args, i, listeners;
                                    if (!this._events)
                                        this._events = {};
                                    // If there is no 'error' event listener
                                    // then throw.
                                    if (type === 'error') {
                                        if (!this._events.error|| (isObject(this._events.error) && !this._events.error.length)) {
                                            er = arguments[1];
                                            if (er instanceof Error) {
                                                throw er; // Unhandled 'error'
                                                            // event
                                            } else {
                                                // At least give some kind of
                                                // context to the user
                                var err = new Error('Uncaught, unspecified "error" event. ('+ er + ')');
                                        err.context = er;
                                        throw err;
                                            }
                                        }
                                    }
                                    handler = this._events[type];
                                    if (isUndefined(handler))
                                        return false;
                                    if (isFunction(handler)) {
                                        switch (arguments.length) {
                                        // fast cases
                                        case 1:
                                            handler.call(this);
                                            break;
                                        case 2:
                                            handler.call(this, arguments[1]);
                                            break;
                                        case 3:
                                            handler.call(this, arguments[1],
                                                    arguments[2]);
                                            break;
                                        // slower
                                        default:
                                            args = Array.prototype.slice.call(arguments, 1);
                                            handler.apply(this, args);
                                        }
                                    } else if (isObject(handler)) {
                                        args = Array.prototype.slice.call(arguments, 1);
                                        listeners = handler.slice();
                                        len = listeners.length;
                                        for (i = 0; i < len; i++)
                                            listeners[i].apply(this, args);
                                    }
                                    return true;
                                };
                                EventEmitter.prototype.addListener = function(type, listener) {
                                    var m;
                                    if (!isFunction(listener))
                                        throw TypeError('listener must be a function');
                                    if (!this._events)
                                        this._events = {};
                                    // To avoid recursion in the case that type
                                    // === "newListener"! Before
                                    // adding it to the listeners, first emit
                                    // "newListener".
                                    if (this._events.newListener)
                                        this.emit('newListener',type,isFunction(listener.listener) ? listener.listener: listener);
                                    if (!this._events[type])
                                        // Optimize the case of one listener.
                                        // Don't need the extra array object.
                                        this._events[type] = listener;
                                    else if (isObject(this._events[type]))
                                        // If we've already got an array, just
                                        // append.
                                        this._events[type].push(listener);
                                    else
                                        // Adding the second element, need to
                                        // change to array.
                                    this._events[type] = [this._events[type], listener ];
                                    // Check for listener leak
                                    if (isObject(this._events[type])&& !this._events[type].warned) {
                                        if (!isUndefined(this._maxListeners)) {
                                            m = this._maxListeners;
                                        } else {
                                            m = EventEmitter.defaultMaxListeners;
                                        }
                                        if (m&& m > 0&& this._events[type].length > m) {
                                            this._events[type].warned = true;
                                            console.error(
  '(node) warning: possible EventEmitter memory '+ 'leak detected. %d listeners added. '+ 'Use emitter.setMaxListeners() to increase limit.',
                                            this._events[type].length);
                                            if (typeof console.trace === 'function') {
                                                // not supported in IE 10
                                                console.trace();
                                            }
                                        }
                                    }
                                    return this;
                                };
                                EventEmitter.prototype.on = EventEmitter.prototype.addListener;
                                EventEmitter.prototype.once = function(type,
                                        listener) {
                                    if (!isFunction(listener))
                                        throw TypeError('listener must be a function');
                                    var fired = false;
                                    function g() {
                                        this.removeListener(type, g);
                                        if (!fired) {
                                            fired = true;
                                            listener.apply(this, arguments);
                                        }
                                    }
                                    g.listener = listener;
                                    this.on(type, g);
                                    return this;
                                };
                                // emits a 'removeListener' event iff the listener was removed
                                EventEmitter.prototype.removeListener = function(type, listener) {
                                    var list, position, length, i;
                                    if (!isFunction(listener))
                                        throw TypeError('listener must be a function');
                                    if (!this._events || !this._events[type])
                                        return this;
                                    list = this._events[type];
                                    length = list.length;
                                    position = -1;
                                    if (list === listener
                                            || (isFunction(list.listener) && list.listener === listener)) {
                                        delete this._events[type];
                                        if (this._events.removeListener)
                                            this.emit('removeListener', type,listener);
                                    } else if (isObject(list)) {
                                        for (i = length; i-- > 0;) {
                                            if (list[i] === listener
                                                    || (list[i].listener && list[i].listener === listener)) {
                                                position = i;
                                                break;
                                            }
                                        }
                                        if (position < 0)
                                            return this;
                                        if (list.length === 1) {
                                            list.length = 0;
                                            delete this._events[type];
                                        } else {
                                            list.splice(position, 1);
                                        }
                                        if (this._events.removeListener)
                                            this.emit('removeListener', type,
                                                    listener);
                                    }
                                    return this;
                                };
                                EventEmitter.prototype.removeAllListeners = function(type) {
                                    var key, listeners;
                                    if (!this._events)
                                        return this;
                                    // not listening for removeListener, no need to emit
                                    if (!this._events.removeListener) {
                                        if (arguments.length === 0)
                                            this._events = {};
                                        else if (this._events[type])
                                            delete this._events[type];
                                        return this;
                                    }
                                    // emit removeListener for all listeners on all events
                                    if (arguments.length === 0) {
                                        for (key in this._events) {
                                            if (key === 'removeListener')
                                                continue;
                                            this.removeAllListeners(key);
                                        }
                                        this
                                                .removeAllListeners('removeListener');
                                        this._events = {};
                                        return this;
                                    }

                                    listeners = this._events[type];

                                    if (isFunction(listeners)) {
                                        this.removeListener(type, listeners);
                                    } else if (listeners) {
                                        // LIFO order
                                        while (listeners.length)
                                            this.removeListener(
                                            type,listeners[listeners.length - 1]);
                                    }
                                    delete this._events[type];
                                    return this;
                                };
                                EventEmitter.prototype.listeners = function(
                                        type) {
                                    var ret;
                                    if (!this._events || !this._events[type])
                                        ret = [];
                                    else if (isFunction(this._events[type]))
                                        ret = [ this._events[type] ];
                                    else
                                        ret = this._events[type].slice();
                                    return ret;
                                };
                                EventEmitter.prototype.listenerCount = function(
                                        type) {
                                    if (this._events) {
                                        var evlistener = this._events[type];

                                        if (isFunction(evlistener))
                                            return 1;
                                        else if (evlistener)
                                            return evlistener.length;
                                    }
                                    return 0;
                                };
                                EventEmitter.listenerCount = function(emitter,type) {
                                    return emitter.listenerCount(type);
                                };
                                function isFunction(arg) {
                                    return typeof arg === 'function';
                                }
                                function isNumber(arg) {
                                    return typeof arg === 'number';
                                }
                                function isObject(arg) {
                                    return typeof arg === 'object'
                                            && arg !== null;
                                }
                                function isUndefined(arg) {
                                    return arg === void 0;
                                }
                            }, {} ],3 : [
                            function(require, module, exports) {
                                module.exports = load
                                function load(src, cb) {
                                    var head = document.head || document.getElementsByTagName('head')[0]
                                    var script = document.createElement('script')
                                    script.type = 'text/javascript'
                                    script.async = true
                                    script.src = src
                                    if (cb) {
                                        script.onload = function() {
                                            script.onerror = script.onload = null
                                            cb(null, script)
                                        }
                                        script.onerror = function() {
                                            script.onerror = script.onload = null
                                            cb(new Error('Failed to load '+ src), script)
                                        }
                                    }
                                    head.appendChild(script)
                                }
                            }, {} ]
                }, {}, [ 1 ]);

Jitsi.html代码如下:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <meta http-equiv="content-type" content="text/html;charset=utf-8">
          <style type="text/css">
            #meet {
                position: absolute;
                bottom: 0;
                right: 0;
                width: 100%;
                height: 100%;
                overflow: hidden;
            } 
        </style><!-- 此处配置视频在整个页面的大小 -->
    </head>
    <body>
        <div id="meet"></div><!-- css与js要对这个div进行操作时就能通过id来找到这个div -->
        <script src="script/jitsi-meet.js"></script>
        <script>
            var meet = new JitsiMeet('https://meet.jit.si');
            meet.on('ready', function() {
                var interfaceConfig = { 
                    //filmStripOnly: true,
                    DEFAULT_REMOTE_DISPLAY_NAME: 'John Doe',
                };
                var options = {};
                options.interfaceConfig = interfaceConfig;
                var conference = meet.join('Test1234', '#meet', options);
                conference.on('joined', function() {
                    console.log('We are in!');
                });
            });
        </script>
    </body>
</html>

上面的两个文件是整个项目的所有文件。在eclipse上编译运行,在浏览器上可以用localhost访问,但是输入本机ip地址无法获取音频和视频:
图片说明
我尝试过在tomcat服务器上运行其他的.html文件,用localhost和ip地址都可以访问,请各位大佬帮忙看看,帮助我理解一下上面的.js文件,解决这个问题。先谢谢大家了!

2个回答

谢谢大家哈,我找到原因了:浏览器不支持http协议的ip地址访问,把项目配置成hhtps访问就可以啦!

题主可以搜索下 navigator.getusermedia 获取摄像头 和话筒权限, 需要localhost 或者域名是https的

qq_39088036
eat_Cookie 感谢!
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
LibJitsi如何通过java程序启动?

最近在研究一个基于sip协议的网络语音通话,服务端已经搭好,可以正常注册通话。还需要做一个java版的客户端,使用的开源项目jitsi。直接安装版的我试过,并且能够正常通话。 当我使用jitsi的核心包libjitsi打算进行二次开发,无法正常启动。 知道怎么解决的大牛们请留下宝贵意见~ 附上我的操作流程: 1.检出libjitsi: https://github.com/jitsi/libjitsi.git 2.执行官方提供的使用案例:AVReceive2、AVTransmit2 3.运行结果: Exception in thread "main" java.lang.NullPointerException at org.jitsi.impl.neomedia.MediaStreamImpl.addDynamicRTPPayloadType(MediaStreamImpl.java:467) at org.jitsi.examples.AVReceive2.initialize(AVReceive2.java:180) at org.jitsi.examples.AVReceive2.main(AVReceive2.java:349) ps: 我尝试着解决空指针异常,但是一些相关的参数无从下手,不知如何配置。

IE7/IE8上网页视频的播放格式问题

发现在IE7、IE6上使用flash播放视频,AVI/MP4格式的视频都无法播放,只有SWF格式的可以,这是为啥?是不是IE6/7只支持SWF格式?我已经把flash插件更新到20版本了,应该不是flash插件的问题吧?求回答。。。

jitsi meet源码中,在登录界面提交登录信息的代码处理

登录jitsimeet,在登录界面填写用户名和密码后,压下OK键,进入jitsimeet。 如下代码为压下OK按键的代码: <pre> _onLogin() { const { _conference: conference, dispatch } = this.props; const { password, username } = this.state; const jid = toJid(username, this.props._configHosts); let r; // If there's a conference it means that the connection has succeeded, // but authentication is required in order to join the room. if (conference) { r = dispatch(authenticateAndUpgradeRole(jid, password, conference)); } else { r = dispatch(connect(jid, password)); } return r; } </pre> <pre> export function authenticateAndUpgradeRole( id: string, password: string, conference: Object) { return (dispatch: Dispatch, getState: Function) => { const { password: roomPassword } = getState()['features/base/conference']; const process = conference.authenticateAndUpgradeRole({ id, password, roomPassword, onLoginSuccessful() { // When the login succeeds, the process has completed half // of its job (i.e. 0.5). return dispatch(_upgradeRoleFinished(process, 0.5)); } }); dispatch(_upgradeRoleStarted(process)); process.then( /* onFulfilled */ () => dispatch(_upgradeRoleFinished(process, 1)), /* onRejected */ error => { // The lack of an error signals a cancellation. if (error.authenticationError || error.connectionError) { logger.error('authenticateAndUpgradeRole failed', error); } dispatch(_upgradeRoleFinished(process, error)); }); return process; }; } </pre> 在authenticateAndUpgradeRole函数中,如下代码段 <pre> const process = conference.authenticateAndUpgradeRole({ id, password, roomPassword, onLoginSuccessful() { // When the login succeeds, the process has completed half // of its job (i.e. 0.5). return dispatch(_upgradeRoleFinished(process, 0.5)); } }); </pre> 其中的conference.authenticateAndUpgradeRole应该实现的是用户名和密码的验证功能,但是我在源码工程中没有找到该接口的定义,请大神指教上述代码段的功能,以及如何能够找到提交登录信息后,是如何验证用户名和密码的?

知道网址和登录该网址的用户名密码,怎么实现直接登录?

知道网站网址(jitsi meet),登录该网站的用户名和密码,怎么使用java语言实现点击某app(spark)的按钮,使用本机默认浏览器打开登陆过的网站页面? 目前使用HttpURLConnection的GET方法发送了用户名和密码,然后再打开该网址,显示的还是未登录的网站页面。

这边有个prosody关于启动的问题不知道哪位大神,知道如何解决?感谢了

``` Dec 25 15:30:08 startup info Hello and welcome to Prosody version 0.11.3 Dec 25 15:30:08 startup info Prosody is using the select backend for connection handling Dec 25 15:30:08 portmanager info Activated service 'component' on [127.0.0.1]:5347, [::1]:5347 Dec 25 15:30:08 portmanager info Activated service 's2s' on [::]:5269, [*]:5269 Dec 25 15:30:08 portmanager info Activated service 'http' on [::]:5280, [*]:5280 Dec 25 15:30:08 portmanager error Error binding encrypted port for https: No certificate present in SSL/TLS configuration for https port 5281 Dec 25 15:30:08 portmanager error Error binding encrypted port for https: No certificate present in SSL/TLS configuration for https port 5281 Dec 25 15:30:08 portmanager info Activated service 'https' on no ports Dec 25 15:30:08 portmanager info Activated service 'c2s' on [::]:5222, [*]:5222 Dec 25 15:30:08 portmanager info Activated service ' ' on no ports Dec 25 15:30:08 mod_posix info Prosody is about to detach from the console, disabling further console output Dec 25 15:30:08 mod_posix info Successfully daemonized to PID 9750 Dec 25 15:30:19 jcp164f750 info Incoming Jabber component connection Dec 25 15:30:19 jitsi-videobridge.xxxx.xxxx.xx.xxxx:component info External component successfully authenticated**** ```

尝试使用TLS连接到LDAP时出错“ LDAP结果代码201“ ErrorNetwork”:无效的数据包格式”

<div class="post-text" itemprop="text"> <p>I'm trying make an authentication service with LDAP and TLS using <a href="http://www.github.com/mavricknz/ldap" rel="nofollow">http://www.github.com/mavricknz/ldap</a> When I use only basic authentication using the following code, everything works just fine.</p> <pre><code>conn := ldap.NewLDAPConnection(ldapHost, ldapPort) conn.NetworkConnectTimeout = time.Duration(ldapConnTimeout) * time.Millisecond conn.ReadTimeout = time.Duration(ldapReadTimeout) * time.Millisecond if err := conn.Connect(); err != nil { log.Println(err) resp.WriteHeader(http.StatusInternalServerError) return } defer conn.Close() // bind to ldap if err := conn.Bind(username, password); err != nil { ldaperr := err.(*ldap.LDAPError) if ldaperr.ResultCode == ldap.LDAPResultInvalidCredentials { resp.Header().Set("WWW-Authenticate", `Basic realm="Item Codes Database"`) resp.WriteHeader(http.StatusUnauthorized) } else { log.Println(err) resp.WriteHeader(http.StatusInternalServerError) } return } </code></pre> <p>but when I try to applying TLS to my code by changing</p> <pre><code>conn := ldap.NewLDAPConnection(ldapHost, ldapPort) </code></pre> <p>to</p> <pre><code>ldap.NewLDAPTLSConnection(ldapHost, ldapPort, &amp;tls.Config{}) </code></pre> <p>It gives me an error <code>LDAP Result Code 201 "ErrorNetwork": Invalid packet format</code>. That error comes from method <code>conn.Connect()</code> which when I dig into it, it didn't even reach the point where the TLS config or TLS flag has been used.</p> </div>

大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了

大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...

在中国程序员是青春饭吗?

今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...

程序员请照顾好自己,周末病魔差点一套带走我。

程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。

技术大佬:我去,你写的 switch 语句也太老土了吧

昨天早上通过远程的方式 review 了两名新来同事的代码,大部分代码都写得很漂亮,严谨的同时注释也很到位,这令我非常满意。但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:“我擦,小王,你丫写的 switch 语句也太老土了吧!” 来看看小王写的代码吧,看完不要骂我装逼啊。 private static String createPlayer(PlayerTypes p...

和黑客斗争的 6 天!

互联网公司工作,很难避免不和黑客们打交道,我呆过的两家互联网公司,几乎每月每天每分钟都有黑客在公司网站上扫描。有的是寻找 Sql 注入的缺口,有的是寻找线上服务器可能存在的漏洞,大部分都...

点沙成金:英特尔芯片制造全过程揭密

“亚马逊丛林里的蝴蝶扇动几下翅膀就可能引起两周后美国德州的一次飓风……” 这句人人皆知的话最初用来描述非线性系统中微小参数的变化所引起的系统极大变化。 而在更长的时间尺度内,我们所生活的这个世界就是这样一个异常复杂的非线性系统…… 水泥、穹顶、透视——关于时间与技艺的蝴蝶效应 公元前3000年,古埃及人将尼罗河中挖出的泥浆与纳特龙盐湖中的矿物盐混合,再掺入煅烧石灰石制成的石灰,由此得来了人...

讲一个程序员如何副业月赚三万的真实故事

loonggg读完需要3分钟速读仅需 1 分钟大家好,我是你们的校长。我之前讲过,这年头,只要肯动脑,肯行动,程序员凭借自己的技术,赚钱的方式还是有很多种的。仅仅靠在公司出卖自己的劳动时...

上班一个月,后悔当初着急入职的选择了

最近有个老铁,告诉我说,上班一个月,后悔当初着急入职现在公司了。他之前在美图做手机研发,今年美图那边今年也有一波组织优化调整,他是其中一个,在协商离职后,当时捉急找工作上班,因为有房贷供着,不能没有收入来源。所以匆忙选了一家公司,实际上是一个大型外包公司,主要派遣给其他手机厂商做外包项目。**当时承诺待遇还不错,所以就立马入职去上班了。但是后面入职后,发现薪酬待遇这块并不是HR所说那样,那个HR自...

女程序员,为什么比男程序员少???

昨天看到一档综艺节目,讨论了两个话题:(1)中国学生的数学成绩,平均下来看,会比国外好?为什么?(2)男生的数学成绩,平均下来看,会比女生好?为什么?同时,我又联想到了一个技术圈经常讨...

副业收入是我做程序媛的3倍,工作外的B面人生是怎样的?

提到“程序员”,多数人脑海里首先想到的大约是:为人木讷、薪水超高、工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是简单的爱好,还是正经的副业,他们都干得同样出色。偶尔,还能和程序员的特质结合,产生奇妙的“化学反应”。 @Charlotte:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

MySQL数据库面试题(2020最新版)

文章目录数据库基础知识为什么要使用数据库什么是SQL?什么是MySQL?数据库三大范式是什么mysql有关权限的表都有哪几个MySQL的binlog有有几种录入格式?分别有什么区别?数据类型mysql有哪些数据类型引擎MySQL存储引擎MyISAM与InnoDB区别MyISAM索引与InnoDB索引的区别?InnoDB引擎的4大特性存储引擎选择索引什么是索引?索引有哪些优缺点?索引使用场景(重点)...

如果你是老板,你会不会踢了这样的员工?

有个好朋友ZS,是技术总监,昨天问我:“有一个老下属,跟了我很多年,做事勤勤恳恳,主动性也很好。但随着公司的发展,他的进步速度,跟不上团队的步伐了,有点...

我入职阿里后,才知道原来简历这么写

私下里,有不少读者问我:“二哥,如何才能写出一份专业的技术简历呢?我总感觉自己写的简历太烂了,所以投了无数份,都石沉大海了。”说实话,我自己好多年没有写过简历了,但我认识的一个同行,他在阿里,给我说了一些他当年写简历的方法论,我感觉太牛逼了,实在是忍不住,就分享了出来,希望能够帮助到你。 01、简历的本质 作为简历的撰写者,你必须要搞清楚一点,简历的本质是什么,它就是为了来销售你的价值主张的。往深...

我说我不会算法,阿里把我挂了。

不说了,字节跳动也反手把我挂了。

优雅的替换if-else语句

场景 日常开发,if-else语句写的不少吧??当逻辑分支非常多的时候,if-else套了一层又一层,虽然业务功能倒是实现了,但是看起来是真的很不优雅,尤其是对于我这种有强迫症的程序"猿",看到这么多if-else,脑袋瓜子就嗡嗡的,总想着解锁新姿势:干掉过多的if-else!!!本文将介绍三板斧手段: 优先判断条件,条件不满足的,逻辑及时中断返回; 采用策略模式+工厂模式; 结合注解,锦...

离职半年了,老东家又发 offer,回不回?

有小伙伴问松哥这个问题,他在上海某公司,在离职了几个月后,前公司的领导联系到他,希望他能够返聘回去,他很纠结要不要回去? 俗话说好马不吃回头草,但是这个小伙伴既然感到纠结了,我觉得至少说明了两个问题:1.曾经的公司还不错;2.现在的日子也不是很如意。否则应该就不会纠结了。 老实说,松哥之前也有过类似的经历,今天就来和小伙伴们聊聊回头草到底吃不吃。 首先一个基本观点,就是离职了也没必要和老东家弄的苦...

为什么你不想学习?只想玩?人是如何一步一步废掉的

不知道是不是只有我这样子,还是你们也有过类似的经历。 上学的时候总有很多光辉历史,学年名列前茅,或者单科目大佬,但是虽然慢慢地长大了,你开始懈怠了,开始废掉了。。。 什么?你说不知道具体的情况是怎么样的? 我来告诉你: 你常常潜意识里或者心理觉得,自己真正的生活或者奋斗还没有开始。总是幻想着自己还拥有大把时间,还有无限的可能,自己还能逆风翻盘,只不是自己还没开始罢了,自己以后肯定会变得特别厉害...

男生更看重女生的身材脸蛋,还是思想?

往往,我们看不进去大段大段的逻辑。深刻的哲理,往往短而精悍,一阵见血。问:产品经理挺漂亮的,有点心动,但不知道合不合得来。男生更看重女生的身材脸蛋,还是...

为什么程序员做外包会被瞧不起?

二哥,有个事想询问下您的意见,您觉得应届生值得去外包吗?公司虽然挺大的,中xx,但待遇感觉挺低,马上要报到,挺纠结的。

当HR压你价,说你只值7K,你该怎么回答?

当HR压你价,说你只值7K时,你可以流畅地回答,记住,是流畅,不能犹豫。 礼貌地说:“7K是吗?了解了。嗯~其实我对贵司的面试官印象很好。只不过,现在我的手头上已经有一份11K的offer。来面试,主要也是自己对贵司挺有兴趣的,所以过来看看……”(未完) 这段话主要是陪HR互诈的同时,从公司兴趣,公司职员印象上,都给予对方正面的肯定,既能提升HR的好感度,又能让谈判气氛融洽,为后面的发挥留足空间。...

面试:第十六章:Java中级开发(16k)

HashMap底层实现原理,红黑树,B+树,B树的结构原理 Spring的AOP和IOC是什么?它们常见的使用场景有哪些?Spring事务,事务的属性,传播行为,数据库隔离级别 Spring和SpringMVC,MyBatis以及SpringBoot的注解分别有哪些?SpringMVC的工作原理,SpringBoot框架的优点,MyBatis框架的优点 SpringCould组件有哪些,他们...

面试阿里p7,被按在地上摩擦,鬼知道我经历了什么?

面试阿里p7被问到的问题(当时我只知道第一个):@Conditional是做什么的?@Conditional多个条件是什么逻辑关系?条件判断在什么时候执...

你打算用Java 8一辈子都不打算升级到Java 14,真香

我们程序员应该抱着尝鲜、猎奇的心态,否则就容易固步自封,技术停滞不前。

无代码时代来临,程序员如何保住饭碗?

编程语言层出不穷,从最初的机器语言到如今2500种以上的高级语言,程序员们大呼“学到头秃”。程序员一边面临编程语言不断推陈出新,一边面临由于许多代码已存在,程序员编写新应用程序时存在重复“搬砖”的现象。 无代码/低代码编程应运而生。无代码/低代码是一种创建应用的方法,它可以让开发者使用最少的编码知识来快速开发应用程序。开发者通过图形界面中,可视化建模来组装和配置应用程序。这样一来,开发者直...

面试了一个 31 岁程序员,让我有所触动,30岁以上的程序员该何去何从?

最近面试了一个31岁8年经验的程序猿,让我有点感慨,大龄程序猿该何去何从。

大三实习生,字节跳动面经分享,已拿Offer

说实话,自己的算法,我一个不会,太难了吧

程序员垃圾简历长什么样?

已经连续五年参加大厂校招、社招的技术面试工作,简历看的不下于万份 这篇文章会用实例告诉你,什么是差的程序员简历! 疫情快要结束了,各个公司也都开始春招了,作为即将红遍大江南北的新晋UP主,那当然要为小伙伴们做点事(手动狗头)。 就在公众号里公开征简历,义务帮大家看,并一一点评。《启舰:春招在即,义务帮大家看看简历吧》 一石激起千层浪,三天收到两百多封简历。 花光了两个星期的所有空闲时...

《经典算法案例》01-08:如何使用质数设计扫雷(Minesweeper)游戏

我们都玩过Windows操作系统中的经典游戏扫雷(Minesweeper),如果把质数当作一颗雷,那么,表格中红色的数字哪些是雷(质数)?您能找出多少个呢?文中用列表的方式罗列了10000以内的自然数、质数(素数),6的倍数等,方便大家观察质数的分布规律及特性,以便对算法求解有指导意义。另外,判断质数是初学算法,理解算法重要性的一个非常好的案例。

《Oracle Java SE编程自学与面试指南》最佳学习路线图(2020最新版)

正确选择比瞎努力更重要!

一文带你入门Java Stream流,太强了

两个星期以前,就有读者强烈要求我写一篇 Java Stream 流的文章,我说市面上不是已经有很多了吗,结果你猜他怎么说:“就想看你写的啊!”你看你看,多么苍白的喜欢啊。那就“勉为其难”写一篇吧,嘻嘻。 单从“Stream”这个单词上来看,它似乎和 java.io 包下的 InputStream 和 OutputStream 有些关系。实际上呢,没毛关系。Java 8 新增的 Stream 是为...

都前后端分离了,咱就别做页面跳转了!统统 JSON 交互

文章目录1. 无状态登录1.1 什么是有状态1.2 什么是无状态1.3 如何实现无状态1.4 各自优缺点2. 登录交互2.1 前后端分离的数据交互2.2 登录成功2.3 登录失败3. 未认证处理方案4. 注销登录 这是本系列的第四篇,有小伙伴找不到之前文章,松哥给大家列一个索引出来: 挖一个大坑,Spring Security 开搞! 松哥手把手带你入门 Spring Security,别再问密...

面试官:你连SSO都不懂,就别来面试了

大厂竟然要考我SSO,卧槽。

终于,月薪过5万了!

来看几个问题想不想月薪超过5万?想不想进入公司架构组?想不想成为项目组的负责人?想不想成为spring的高手,超越99%的对手?那么本文内容是你必须要掌握的。本文主要详解bean的生命...

我说我懂多线程,面试官立马给我发了offer

不小心拿了几个offer,有点烦

自从喜欢上了B站这12个UP主,我越来越觉得自己是个废柴了!

不怕告诉你,我自从喜欢上了这12个UP主,哔哩哔哩成为了我手机上最耗电的软件,几乎每天都会看,可是吧,看的越多,我就越觉得自己是个废柴,唉,老天不公啊,不信你看看…… 间接性踌躇满志,持续性混吃等死,都是因为你们……但是,自己的学习力在慢慢变强,这是不容忽视的,推荐给你们! 都说B站是个宝,可是有人不会挖啊,没事,今天咱挖好的送你一箩筐,首先啊,我在B站上最喜欢看这个家伙的视频了,为啥 ,咱撇...

代码注释如此沙雕,会玩还是你们程序员!

某站后端代码被“开源”,同时刷遍全网的,还有代码里的那些神注释。 我们这才知道,原来程序员个个都是段子手;这么多年来,我们也走过了他们的无数套路… 首先,产品经理,是永远永远吐槽不完的!网友的评论也非常扎心,说看这些代码就像在阅读程序员的日记,每一页都写满了对产品经理的恨。 然后,也要发出直击灵魂的质问:你是尊贵的付费大会员吗? 这不禁让人想起之前某音乐app的穷逼Vip,果然,穷逼在哪里都是...

2020春招面试了10多家大厂,我把问烂了的数据库事务知识点总结了一下

2020年截止目前,我面试了阿里巴巴、腾讯、美团、拼多多、京东、快手等互联网大厂。我发现数据库事务在面试中出现的次数非常多。

爬虫(101)爬点重口味的

小弟最近在学校无聊的很哪,浏览网页突然看到一张图片,都快流鼻血。。。然后小弟冥思苦想,得干一点有趣的事情python 爬虫库安装https://s.taobao.com/api?_ks...

在拼多多上班,是一种什么样的体验?我心态崩了呀!

之前有很多读者咨询我:武哥,在拼多多上班是一种什么样的体验?由于一直很忙,没抽出时间来和大家分享。上周末特地花点时间来写了一篇文章,跟大家分享一下拼多多的日常。 1. 倒时差的作息 可能很多小伙伴都听说了,拼多多加班很严重。这怎么说呢?作息上确实和其他公司有点区别,大家知道 996,那么自然也就能理解拼多多的“11 11 6”了。 所以当很多小伙伴早上出门时,他们是这样的: 我们是这样的: 当...

应聘3万的职位,有必要这么刁难我么。。。沙雕。。。

又一次被面试官带到坑里面了。面试官:springmvc用过么?我:用过啊,经常用呢面试官:springmvc中为什么需要用父子容器?我:嗯。。。没听明白你说的什么。面试官:就是contr...

太狠了,疫情期间面试,一个问题砍了我5000!

疫情期间找工作确实有点难度,想拿到满意的薪资,确实要点实力啊!面试官:Spring中的@Value用过么,介绍一下我:@Value可以标注在字段上面,可以将外部配置文件中的数据,比如可以...

自学编程的 6 个致命误区

嗨,小伙伴们大家好,我是沉默王二。本篇文章来和大家聊聊自学编程中的一些误区——这是我在 B 站上看了羊哥的一期视频后有感而发的文章。因为确实有很多读者也曾私信问过我这些方面的问题,很有代表性,所以我就结合自己的亲身体会来谈一谈,希望对小伙伴们有所启发。 01、追求时髦 所谓基础不牢,地动山摇啊。可很多小伙伴压根就没注意过这个问题,市面上出什么新鲜的技术就想去尝试,结果把自己学的乱七八糟,心灰意冷...

安卓App太能乱来了!被曝一天扫你后台1.3万次:小米系统更新,一不小心扯出惊人真相...

晓查 乾明 发自 凹非寺量子位 报道 | 公众号 QbitAI安卓乱象,所有人都是知道的。但你知道到底有多乱么?现在,我们这些普通用户,也能定量分析检测了。真相,可能比想象中还严重。来看...

立即提问
相关内容推荐