<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Jack Jiang

    我的最新工程MobileIMSDK:http://git.oschina.net/jackjiang/MobileIMSDK
    posts - 503, comments - 13, trackbacks - 0, articles - 1

    本文為原創(chuàng)分享,轉(zhuǎn)載請(qǐng)注明出處。

    1、引言

    即時(shí)通訊IM應(yīng)用中的聊天消息時(shí)間顯示是個(gè)再常見不過的需求,現(xiàn)在都講究用戶體驗(yàn),所以時(shí)間顯示再也不能像傳統(tǒng)軟件一樣簡(jiǎn)單粗地暴顯示成“年/月/日 時(shí):分:秒”這樣。所以,市面上幾乎所有的IM都會(huì)對(duì)聊天消息的時(shí)間顯示格化做人性化處理,從而提升用戶體驗(yàn)(使用感受會(huì)明顯友好)。

    這兩天正在繼續(xù)開發(fā)RainbowChat-Web產(chǎn)品,所以正需要這樣的代碼。但經(jīng)過在即時(shí)通訊網(wǎng)的論壇和技術(shù)交流群里詢問,以及網(wǎng)上的所謂仿微信例子,都不符合要求。這些例子要么簡(jiǎn)陋粗暴(有邏輯bug硬傷)、要么并不完整(可能只是隨手寫的練手代碼,并不適合放到產(chǎn)品中),所以本著做技術(shù)精益求精的態(tài)度,沒有現(xiàn)成的輪子可用,那就只能造輪子了。

    那么,按怎樣的顯示邏輯來實(shí)現(xiàn)呢?作為移動(dòng)端IM的王者,微信無疑處處是標(biāo)桿,所以本次的消息時(shí)間顯示格式,直接參照微信的實(shí)現(xiàn)邏輯準(zhǔn)沒錯(cuò)(隨大流雖然沒個(gè)性,但不至于非主流)。

    * 提示:本文中的代碼實(shí)現(xiàn),是從 RainbowChat 和 RainbowChat-Web 兩個(gè)IM產(chǎn)品中扒出來簡(jiǎn)化后的結(jié)果,是基于完全相同的算法邏輯分別用OC、Java和JavaScript實(shí)現(xiàn)的。如您覺得有用,可以改改直接用于您的產(chǎn)品,如您有更好的建議請(qǐng)直接回復(fù)和評(píng)論。代碼僅供參考,不足之外,還請(qǐng)見諒!

    學(xué)習(xí)交流:

    - 即時(shí)通訊/推送技術(shù)開發(fā)交流4群:101279154 [推薦]

    - 移動(dòng)端IM開發(fā)入門文章:《新手入門一篇就夠:從零開發(fā)移動(dòng)端IM

    (本文同步發(fā)布于:http://www.52im.net/thread-2371-1-1.html

    2、相關(guān)文章

    用于IM中圖片壓縮的Android工具類源碼,效果可媲美微信 [附件下載]

    高仿Android版手機(jī)QQ可拖拽未讀數(shù)小氣泡源碼 [附件下載]

    Android聊天界面源碼:實(shí)現(xiàn)了聊天氣泡、表情圖標(biāo)(可翻頁) [附件下載]

    高仿Android版手機(jī)QQ首頁側(cè)滑菜單源碼 [附件下載]

    分享java AMR音頻文件合并源碼,全網(wǎng)最全

    Android版高仿微信聊天界面源碼 [附件下載]

    高仿手機(jī)QQ的Android版鎖屏聊天消息提醒功能 [附件下載]

    高仿iOS版手機(jī)QQ錄音及振幅動(dòng)畫完整實(shí)現(xiàn) [源碼下載]

    Android端社交應(yīng)用中的評(píng)論和回復(fù)功能實(shí)戰(zhàn)分享[圖文+源碼]

    Android端IM應(yīng)用中的@人功能實(shí)現(xiàn):仿微博、QQ、微信,零入侵、高可擴(kuò)展[圖文+源碼]

    3、看看微信中聊天消息的時(shí)間顯示規(guī)則

    先來看看微信中聊天消息的時(shí)間顯示成什么樣:

    微信主頁“消息”界面
    聊天界面(注意聊天界面中默認(rèn)帶了“時(shí):分”的顯示)

    來自微信官方對(duì)聊天消息時(shí)間顯示的規(guī)則說明:

    ▲ 該規(guī)則的定義,主要是2、3條(本圖引用自微信官方FAQ文檔

    4、總結(jié)一下微信中聊天消息的時(shí)間顯示邏輯

    參見第3節(jié)中的截圖和微信官方的說明,我們可以總結(jié)出微信對(duì)于聊天消息時(shí)間顯示的規(guī)則。

    ① 微信對(duì)于聊天消息時(shí)間顯示的規(guī)則總結(jié)如下(首頁“消息”界面):

    1)當(dāng)聊天消息時(shí)間為一周之內(nèi)時(shí):當(dāng)天的消息顯示為“小時(shí):分鐘”形式,然后是“昨天”、“前天”,然后就是“星期幾”這個(gè)樣子;

    2)當(dāng)聊天消息的時(shí)間大于一周時(shí):直接顯示“年/月/日”的時(shí)間格式。

    ② 微信對(duì)于聊天消息時(shí)間顯示的規(guī)則總結(jié)如下(聊天內(nèi)容界面):

    1)當(dāng)聊天消息時(shí)間為一周之內(nèi)時(shí):當(dāng)天的消息顯示為“小時(shí):分鐘”形式,然后是“昨天 時(shí):分”、“前天 時(shí):分”,然后就是“星期幾  時(shí):分”這個(gè)樣子;

    2)當(dāng)聊天消息的時(shí)間大于一周時(shí):直接顯示“年/月/日 時(shí):分”的完整時(shí)間格式。

    注意:聊天內(nèi)容界面里的時(shí)間格式,實(shí)際上是首頁“消息”界面里的時(shí)間格式加上“時(shí):分”后的結(jié)果,所以代碼實(shí)現(xiàn)上這兩套代碼是可以重用的,無需兩份代碼。

    好了,規(guī)則已經(jīng)摸清,下面將直接上代碼。

    5、Android平臺(tái)上的代碼實(shí)現(xiàn)(標(biāo)準(zhǔn)Java)

    5.1 完整源碼

    /**

     * 返回指定pattern樣的日期時(shí)間字符串。

     *

     * @param dt

     * @param pattern

     * @return 如果時(shí)間轉(zhuǎn)換成功則返回結(jié)果,否則返回空字符串""

     * @author 即時(shí)通訊網(wǎng)([url=http://www.52im.net]http://www.52im.net[/url])

     */

    publicstaticString getTimeString(Date dt, String pattern)

    {

            try

            {

                    SimpleDateFormat sdf = newSimpleDateFormat(pattern);//"yyyy-MM-dd HH:mm:ss"

                    sdf.setTimeZone(TimeZone.getDefault());

                    returnsdf.format(dt);

            }

            catch(Exception e)

            {

                    return"";

            }

    }


    /**

    * 仿照微信中的消息時(shí)間顯示邏輯,將時(shí)間戳(單位:毫秒)轉(zhuǎn)換為友好的顯示格式.

    * <p>

    * 1)7天之內(nèi)的日期顯示邏輯是:今天、昨天(-1d)、前天(-2d)、星期?(只顯示總計(jì)7天之內(nèi)的星期數(shù),即<=-4d);<br>

    * 2)7天之外(即>7天)的邏輯:直接顯示完整日期時(shí)間。

    *

    * @param srcDate 要處理的源日期時(shí)間對(duì)象

    * @param mustIncludeTime true表示輸出的格式里一定會(huì)包含“時(shí)間:分鐘”,否則不包含(參考微信,不包含時(shí)分的情況,用于首頁“消息”中顯示時(shí))

    * @return 輸出格式形如:“10:30”、“昨天 12:04”、“前天 20:51”、“星期二”、“2019/2/21 12:09”等形式

    * @author 即時(shí)通訊網(wǎng)([url=http://www.52im.net]http://www.52im.net[/url])

    * @since 4.5

    */

    publicstaticString getTimeStringAutoShort2(Date srcDate, booleanmustIncludeTime)

    {

            String ret = "";


            try

            {

                    GregorianCalendar gcCurrent = newGregorianCalendar();

                    gcCurrent.setTime(newDate());

                    intcurrentYear = gcCurrent.get(GregorianCalendar.YEAR);

                    intcurrentMonth = gcCurrent.get(GregorianCalendar.MONTH)+1;

                    intcurrentDay = gcCurrent.get(GregorianCalendar.DAY_OF_MONTH);


                    GregorianCalendar gcSrc = newGregorianCalendar();

                    gcSrc.setTime(srcDate);

                    intsrcYear = gcSrc.get(GregorianCalendar.YEAR);

                    intsrcMonth = gcSrc.get(GregorianCalendar.MONTH)+1;

                    intsrcDay = gcSrc.get(GregorianCalendar.DAY_OF_MONTH);


                    // 要額外顯示的時(shí)間分鐘

                    String timeExtraStr = (mustIncludeTime?" "+getTimeString(srcDate, "HH:mm"):"");


                    // 當(dāng)年

                    if(currentYear == srcYear)

                    {

                            longcurrentTimestamp = gcCurrent.getTimeInMillis();

                            longsrcTimestamp = gcSrc.getTimeInMillis();


                            // 相差時(shí)間(單位:毫秒)

                            longdelta = (currentTimestamp - srcTimestamp);


                            // 當(dāng)天(月份和日期一致才是)

                            if(currentMonth == srcMonth && currentDay == srcDay)

                            {

                                    // 時(shí)間相差60秒以內(nèi)

                                    if(delta < 60* 1000)

                                               ret = "剛剛";

                                    // 否則當(dāng)天其它時(shí)間段的,直接顯示“時(shí):分”的形式

                                    else

                                                ret = getTimeString(srcDate, "HH:mm");

                            }

                            // 當(dāng)年 && 當(dāng)天之外的時(shí)間(即昨天及以前的時(shí)間)

                            else

                            {

                                    // 昨天(以“現(xiàn)在”的時(shí)候?yàn)榛鶞?zhǔn)-1天)

                                    GregorianCalendar yesterdayDate = newGregorianCalendar();

                                    yesterdayDate.add(GregorianCalendar.DAY_OF_MONTH, -1);


                                    // 前天(以“現(xiàn)在”的時(shí)候?yàn)榛鶞?zhǔn)-2天)

                                    GregorianCalendar beforeYesterdayDate = newGregorianCalendar();

                                    beforeYesterdayDate.add(GregorianCalendar.DAY_OF_MONTH, -2);


                                    // 用目標(biāo)日期的“月”和“天”跟上方計(jì)算出來的“昨天”進(jìn)行比較,是最為準(zhǔn)確的(如果用時(shí)間戳差值

                                    // 的形式,是不準(zhǔn)確的,比如:現(xiàn)在時(shí)刻是2019年02月22日1:00、而srcDate是2019年02月21日23:00,

                                    // 這兩者間只相差2小時(shí),直接用“delta/(3600 * 1000)” > 24小時(shí)來判斷是否昨天,就完全是扯蛋的邏輯了)

                                    if(srcMonth == (yesterdayDate.get(GregorianCalendar.MONTH)+1)

                                            && srcDay == yesterdayDate.get(GregorianCalendar.DAY_OF_MONTH))

                                    {

                                                ret = "昨天"+timeExtraStr;// -1d

                                    }

                                    // “前天”判斷邏輯同上

                                    elseif(srcMonth == (beforeYesterdayDate.get(GregorianCalendar.MONTH)+1)

                                            && srcDay == beforeYesterdayDate.get(GregorianCalendar.DAY_OF_MONTH))

                                    {

                                                ret = "前天"+timeExtraStr;// -2d

                                    }

                                    else

                                    {

                                                // 跟當(dāng)前時(shí)間相差的小時(shí)數(shù)

                                                longdeltaHour = (delta/(3600* 1000));


                                                // 如果小于 7*24小時(shí)就顯示星期幾

                                                if(deltaHour < 7*24)

                                                {

                                                    String[] weekday = {"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};


                                                    // 取出當(dāng)前是星期幾

                                                    String weedayDesc = weekday[gcSrc.get(GregorianCalendar.DAY_OF_WEEK)-1];

                                                    ret = weedayDesc+timeExtraStr;

                                                }

                                                // 否則直接顯示完整日期時(shí)間

                                                else

                                                    ret = getTimeString(srcDate, "yyyy/M/d")+timeExtraStr;

                                    }

                            }

                }

                else

                    ret = getTimeString(srcDate, "yyyy/M/d")+timeExtraStr;

            }

            catch(Exception e)

            {

                    System.err.println("【DEBUG-getTimeStringAutoShort】計(jì)算出錯(cuò):"+e.getMessage()+" 【NO】");

            }


            returnret;

    }

    5.2 調(diào)用示例

    // 用于首頁“消息”界面時(shí)

    getTimeStringAutoShort2(newDate(), false);

    // 用于聊天內(nèi)容界面時(shí)

    getTimeStringAutoShort2(newDate(), true);

    5.3 運(yùn)行效果

    ▲ 上述代碼在RainbowChat Android版上的運(yùn)行效果(首頁)
    ▲ 上述代碼在RainbowChat Android版上的運(yùn)行效果(聊天界面)

    6、iOS平臺(tái)上的代碼實(shí)現(xiàn)(Objective-C)

    6.1 完整源碼

    源文件TimeTool.h:

    #import <Foundation/Foundation.h>

    @interfaceTimeTool : NSObject

    /**

     * 仿照微信中的消息時(shí)間顯示邏輯,將時(shí)間戳(單位:毫秒)轉(zhuǎn)換為友好的顯示格式.

     * 1)7天之內(nèi)的日期顯示邏輯是:今天、昨天(-1d)、前天(-2d)、星期?(只顯示總計(jì)7天之內(nèi)的星期數(shù),即<=-4d);

     * 2)7天之外(即>7天)的邏輯:直接顯示完整日期時(shí)間。

     * @param dt 日期時(shí)間對(duì)象(本次被判斷對(duì)象)

     * @param includeTime YES表示輸出的格式里一定會(huì)包含“時(shí)間:分鐘”,否則不包含(參考微信,不包含時(shí)分的情況,用于首頁“消息”中顯示時(shí))

     * @return 輸出格式形如:“剛剛”、“10:30”、“昨天 12:04”、“前天 20:51”、“星期二”、“2019/2/21 12:09”等形式

     * @since 1.3

     */

    + (NSString*)getTimeStringAutoShort2:(NSDate*)dt mustIncludeTime:(BOOL)includeTime;

    + (NSString*)getTimeString:(NSDate*)dt format:(NSString*)fmt;

    /**

     * 獲得指定NSDate對(duì)象iOS時(shí)間戳(格式遵從ios的習(xí)慣,以秒為單位)。

     */

    + (NSTimeInterval) getIOSTimeStamp:(NSDate*)dat;


    /**

     * 獲得指定NSDate對(duì)象iOS時(shí)間戳的long形式(格式遵從ios的習(xí)慣,以秒為單位,形如:1485159493)。

     */

    + (long) getIOSTimeStamp_l:(NSDate*)dat;

    @end

    源文件TimeTool.m:

    #import "TimeTool.h"

    @implementationTimeTool

    // 仿照微信的邏輯,顯示一個(gè)人性化的時(shí)間字串

    + (NSString*)getTimeStringAutoShort2:(NSDate*)dt mustIncludeTime:(BOOL)includeTime{

        NSString*ret = nil;

        NSCalendar*calendar = [NSCalendarcurrentCalendar];

        // 當(dāng)前時(shí)間

        NSDate*currentDate = [NSDatedate];

        NSDateComponents*curComponents = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay|NSCalendarUnitWeekdayfromDate:currentDate];

        NSIntegercurrentYear=[curComponents year];

        NSIntegercurrentMonth=[curComponents month];

        NSIntegercurrentDay=[curComponents day];

        // 目標(biāo)判斷時(shí)間

        NSDateComponents*srcComponents = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay|NSCalendarUnitWeekdayfromDate:dt];

        NSIntegersrcYear=[srcComponents year];

        NSIntegersrcMonth=[srcComponents month];

        NSIntegersrcDay=[srcComponents day];

        // 要額外顯示的時(shí)間分鐘

        NSString*timeExtraStr = (includeTime?[TimeTool getTimeString:dt format:@" HH:mm"]:@"");

        // 當(dāng)年

        if(currentYear == srcYear) {

            longcurrentTimestamp = [TimeTool getIOSTimeStamp_l:currentDate];

            longsrcTimestamp = [TimeTool getIOSTimeStamp_l:dt];

            // 相差時(shí)間(單位:秒)

            longdelta = currentTimestamp - srcTimestamp;

            // 當(dāng)天(月份和日期一致才是)

            if(currentMonth == srcMonth && currentDay == srcDay) {

                // 時(shí)間相差60秒以內(nèi)

                if(delta < 60)

                    ret = @"剛剛";

                // 否則當(dāng)天其它時(shí)間段的,直接顯示“時(shí):分”的形式

                else

                    ret = [TimeTool getTimeString:dt format:@"HH:mm"];

            }

            // 當(dāng)年 && 當(dāng)天之外的時(shí)間(即昨天及以前的時(shí)間)

            else{

                // 昨天(以“現(xiàn)在”的時(shí)候?yàn)榛鶞?zhǔn)-1天)

                NSDate*yesterdayDate = [NSDatedate];

                yesterdayDate = [NSDatedateWithTimeInterval:-24*60*60 sinceDate:yesterdayDate];

                NSDateComponents*yesterdayComponents = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDayfromDate:yesterdayDate];

                NSIntegeryesterdayMonth=[yesterdayComponents month];

                NSIntegeryesterdayDay=[yesterdayComponents day];

                // 前天(以“現(xiàn)在”的時(shí)候?yàn)榛鶞?zhǔn)-2天)

                NSDate*beforeYesterdayDate = [NSDatedate];

                beforeYesterdayDate = [NSDatedateWithTimeInterval:-48*60*60 sinceDate:beforeYesterdayDate];

                NSDateComponents*beforeYesterdayComponents = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDayfromDate:beforeYesterdayDate];

                NSIntegerbeforeYesterdayMonth=[beforeYesterdayComponents month];

                NSIntegerbeforeYesterdayDay=[beforeYesterdayComponents day];

                // 用目標(biāo)日期的“月”和“天”跟上方計(jì)算出來的“昨天”進(jìn)行比較,是最為準(zhǔn)確的(如果用時(shí)間戳差值

                // 的形式,是不準(zhǔn)確的,比如:現(xiàn)在時(shí)刻是2019年02月22日1:00、而srcDate是2019年02月21日23:00,

                // 這兩者間只相差2小時(shí),直接用“delta/3600” > 24小時(shí)來判斷是否昨天,就完全是扯蛋的邏輯了)

                if(srcMonth == yesterdayMonth && srcDay == yesterdayDay)

                    ret = [NSStringstringWithFormat:@"昨天%@", timeExtraStr];// -1d

                // “前天”判斷邏輯同上

                elseif(srcMonth == beforeYesterdayMonth && srcDay == beforeYesterdayDay)

                    ret = [NSStringstringWithFormat:@"前天%@", timeExtraStr];// -2d

                else{

                    // 跟當(dāng)前時(shí)間相差的小時(shí)數(shù)

                    longdeltaHour = (delta/3600);


                    // 如果小于或等 7*24小時(shí)就顯示星期幾

                    if(deltaHour <= 7*24){

                        NSArray<NSString*> *weekdayAry = [NSArrayarrayWithObjects:@"星期日", @"星期一", @"星期二", @"星期三", @"星期四", @"星期五", @"星期六", nil];

                        // 取出的星期數(shù):1表示星期天,2表示星期一,3表示星期二。。。。 6表示星期五,7表示星期六

                        NSIntegersrcWeekday=[srcComponents weekday];

                        // 取出當(dāng)前是星期幾

                        NSString*weedayDesc = [weekdayAry objectAtIndex:(srcWeekday-1)];

                        ret = [NSStringstringWithFormat:@"%@%@", weedayDesc, timeExtraStr];

                    }

                    // 否則直接顯示完整日期時(shí)間

                    else

                        ret = [NSStringstringWithFormat:@"%@%@", [TimeTool getTimeString:dt format:@"yyyy/M/d"], timeExtraStr];

                }

            }

        }

        // 往年

        else{

            ret = [NSStringstringWithFormat:@"%@%@", [TimeTool getTimeString:dt format:@"yyyy/M/d"], timeExtraStr];

        }

        returnret;

    }

    + (NSString*)getTimeString:(NSDate*)dt format:(NSString*)fmt{

        NSDateFormatter* format = [[NSDateFormatteralloc] init];

        [format setDateFormat:fmt];

        return[format stringFromDate:(dt==nil?[TimeTool getIOSDefaultDate]:dt)];

    }

    + (NSTimeInterval) getIOSTimeStamp:(NSDate*)dat{

        NSTimeIntervala = [dat timeIntervalSince1970];

        returna;

    }

    + (long) getIOSTimeStamp_l:(NSDate*)dat{

        return[[NSNumbernumberWithDouble:[TimeTool getIOSTimeStamp:dat]] longValue];

    }

    @end

    6.2 調(diào)用示例

    // 用于首頁“消息”界面時(shí)

    [TimeTool getTimeStringAutoShort2:[NSDatedate] mustIncludeTime:NO];

    6.3 運(yùn)行效果

    ▲ 上述代碼在RainbowChat iOS版上的運(yùn)行效果(首頁)

    7、Web網(wǎng)頁端的代碼實(shí)現(xiàn)(JavaScript)

    7.1 完整源碼

    抱歉:因文章字?jǐn)?shù)限制,JavaScript版源碼無非法貼上來,請(qǐng)從鏈接:http://www.52im.net/thread-2371-1-1.html,查看JavaScript版完整源碼!

    7.2 調(diào)用示例

    // 用于首頁“消息”界面時(shí)

    _getTimeStringAutoShort2(1550789954260, false);

    // 用于聊天內(nèi)容界面時(shí)

    _getTimeStringAutoShort2(1550789954260, true);

    7.3 運(yùn)行效果

    ▲ 上述代碼在RainbowChat-Web產(chǎn)品上的運(yùn)行效果

    附錄:更多精品資源下載

    [1] 精品源碼下載:

    Java NIO基礎(chǔ)視頻教程、MINA視頻教程、Netty快速入門視頻 [有源碼]

    輕量級(jí)即時(shí)通訊框架MobileIMSDK的iOS源碼(開源版)[附件下載]

    開源IM工程“蘑菇街TeamTalk”2015年5月前未刪減版完整代碼 [附件下載]

    微信本地?cái)?shù)據(jù)庫(kù)破解版(含iOS、Android),僅供學(xué)習(xí)研究 [附件下載]

    NIO框架入門(四):Android與MINA2、Netty4的跨平臺(tái)UDP雙向通信實(shí)戰(zhàn) [附件下載]

    NIO框架入門(三):iOS與MINA2、Netty4的跨平臺(tái)UDP雙向通信實(shí)戰(zhàn) [附件下載]

    NIO框架入門(二):服務(wù)端基于MINA2的UDP雙向通信Demo演示 [附件下載]

    NIO框架入門(一):服務(wù)端基于Netty4的UDP雙向通信Demo演示 [附件下載]

    用于IM中圖片壓縮的Android工具類源碼,效果可媲美微信 [附件下載]

    高仿Android版手機(jī)QQ可拖拽未讀數(shù)小氣泡源碼 [附件下載]

    一個(gè)WebSocket實(shí)時(shí)聊天室Demo:基于node.js+socket.io [附件下載]

    Android聊天界面源碼:實(shí)現(xiàn)了聊天氣泡、表情圖標(biāo)(可翻頁) [附件下載]

    高仿Android版手機(jī)QQ首頁側(cè)滑菜單源碼 [附件下載]

    開源libco庫(kù):?jiǎn)螜C(jī)千萬連接、支撐微信8億用戶的后臺(tái)框架基石 [源碼下載]

    分享java AMR音頻文件合并源碼,全網(wǎng)最全

    微信團(tuán)隊(duì)原創(chuàng)Android資源混淆工具:AndResGuard [有源碼]

    一個(gè)基于MQTT通信協(xié)議的完整Android推送Demo [附件下載]

    Android版高仿微信聊天界面源碼 [附件下載]

    高仿手機(jī)QQ的Android版鎖屏聊天消息提醒功能 [附件下載]

    高仿iOS版手機(jī)QQ錄音及振幅動(dòng)畫完整實(shí)現(xiàn) [源碼下載]

    Android端社交應(yīng)用中的評(píng)論和回復(fù)功能實(shí)戰(zhàn)分享[圖文+源碼]

    Android端IM應(yīng)用中的@人功能實(shí)現(xiàn):仿微博、QQ、微信,零入侵、高可擴(kuò)展[圖文+源碼]

    仿微信的IM聊天時(shí)間顯示格式(含iOS/Android/Web實(shí)現(xiàn)源碼)[圖文+源碼]

    [2] 精品文檔和工具下載:

    計(jì)算機(jī)網(wǎng)絡(luò)通訊協(xié)議關(guān)系圖(中文珍藏版)[附件下載]

    史上最全即時(shí)通訊軟件簡(jiǎn)史(精編大圖版)[附件下載]

    重磅發(fā)布:《阿里巴巴Android開發(fā)手冊(cè)(規(guī)約)》[附件下載]

    阿里技術(shù)結(jié)晶:《阿里巴巴Java開發(fā)手冊(cè)(規(guī)約)-終極版》[附件下載]

    基于RTMP協(xié)議的流媒體技術(shù)的原理與應(yīng)用(技術(shù)論文)[附件下載]

    獨(dú)家發(fā)布《TCP/IP詳解 卷1:協(xié)議》CHM版 [附件下載]

    良心分享:WebRTC 零基礎(chǔ)開發(fā)者教程(中文)[附件下載]

    MQTT協(xié)議手冊(cè)(中文翻譯版)[附件下載]

    經(jīng)典書籍《UNIX網(wǎng)絡(luò)編程》最全下載(卷1+卷2、中文版+英文版)[附件下載]

    音視頻開發(fā)理論入門書籍之《視頻技術(shù)手冊(cè)(第5版)》[附件下載]

    國(guó)際電聯(lián)H.264視頻編碼標(biāo)準(zhǔn)官方技術(shù)手冊(cè)(中文版)[附件下載]

    Apache MINA2.0 開發(fā)指南(中文版)[附件下載]

    網(wǎng)絡(luò)通訊數(shù)據(jù)抓包和分析工具 Wireshark 使用教程(中文) [附件下載]

    最新收集NAT穿越(p2p打洞)免費(fèi)STUN服務(wù)器列表 [附件下載]

    高性能網(wǎng)絡(luò)編程經(jīng)典:《The C10K problem(英文)》[附件下載]

    即時(shí)通訊系統(tǒng)的原理、技術(shù)和應(yīng)用(技術(shù)論文)[附件下載]

    技術(shù)論文:微信對(duì)網(wǎng)絡(luò)影響的技術(shù)試驗(yàn)及分析[附件下載]

    華為內(nèi)部3G網(wǎng)絡(luò)資料: WCDMA系統(tǒng)原理培訓(xùn)手冊(cè)[附件下載]

    網(wǎng)絡(luò)測(cè)試:Android版多路ping命令工具EnterprisePing[附件下載]

    Android反編譯利器APKDB:沒有美工的日子里繼續(xù)堅(jiān)強(qiáng)的擼

    一款用于P2P開發(fā)的NAT類型檢測(cè)工具 [附件下載]

    兩款增強(qiáng)型Ping工具:持續(xù)統(tǒng)計(jì)、圖形化展式網(wǎng)絡(luò)狀況 [附件下載]

    [3] 精選視頻、演講PPT下載:

    美圖海量用戶的IM架構(gòu)零基礎(chǔ)演進(jìn)之路(PPT)[附件下載]

    開源實(shí)時(shí)音視頻工程WebRTC的架構(gòu)詳解與實(shí)踐總結(jié)(PPT+視頻)[附件下載]

    QQ空間百億級(jí)流量的社交廣告系統(tǒng)架構(gòu)實(shí)踐(視頻+PPT)[附件下載]

    海量實(shí)時(shí)消息的視頻直播系統(tǒng)架構(gòu)演進(jìn)之路(視頻+PPT)[附件下載]

    YY直播在移動(dòng)弱網(wǎng)環(huán)境下的深度優(yōu)化實(shí)踐分享(視頻+PPT)[附件下載]

    QQ空間移動(dòng)端10億級(jí)視頻播放技術(shù)優(yōu)化揭秘(視頻+PPT)[附件下載]

    RTC實(shí)時(shí)互聯(lián)網(wǎng)2017年度大會(huì)精選演講PPT [附件下載]

    微信分享開源IM網(wǎng)絡(luò)層組件庫(kù)Mars的技術(shù)實(shí)現(xiàn)(視頻+PPT)[附件下載]

    微服務(wù)理念在微信海量用戶后臺(tái)架構(gòu)中的實(shí)踐(視頻+PPT)[附件下載]

    移動(dòng)端IM開發(fā)和構(gòu)建中的技術(shù)難點(diǎn)實(shí)踐分享(視頻+PPT)[附件下載]

    網(wǎng)易云信的高品質(zhì)即時(shí)通訊技術(shù)實(shí)踐之路(視頻+PPT)[附件下載]

    騰訊音視頻實(shí)驗(yàn)室:直面音視頻質(zhì)量評(píng)估之痛(視頻+PPT)[附件下載]

    騰訊QQ1.4億在線用戶的技術(shù)挑戰(zhàn)和架構(gòu)演進(jìn)之路PPT[附件下載]

    微信朋友圈海量技術(shù)之道PPT[附件下載]

    手機(jī)淘寶消息推送系統(tǒng)的架構(gòu)與實(shí)踐(音頻+PPT)[附件下載]

    如何進(jìn)行實(shí)時(shí)音視頻的質(zhì)量評(píng)估與監(jiān)控(視頻+PPT)[附件下載]

    Go語言構(gòu)建高并發(fā)消息推送系統(tǒng)實(shí)踐PPT(來自360公司)[附件下載]

    網(wǎng)易IM云千萬級(jí)并發(fā)消息處理能力的架構(gòu)設(shè)計(jì)與實(shí)踐PPT [附件下載]

    手機(jī)QQ的海量用戶移動(dòng)化實(shí)踐分享(視頻+PPT)[附件下載]

    釘釘——基于IM技術(shù)的新一代企業(yè)OA平臺(tái)的技術(shù)挑戰(zhàn)(視頻+PPT)[附件下載]

    微信技術(shù)總監(jiān)談架構(gòu):微信之道——大道至簡(jiǎn)(PPT講稿)[附件下載]

    Netty的架構(gòu)剖析及應(yīng)用案例介紹(視頻+PPT)[附件下載]

    聲網(wǎng)架構(gòu)師談實(shí)時(shí)音視頻云的實(shí)現(xiàn)難點(diǎn)(視頻采訪)

    滴滴打車架構(gòu)演變及應(yīng)用實(shí)踐(PPT講稿)[附件下載]

    微信海量用戶背后的后臺(tái)系統(tǒng)存儲(chǔ)架構(gòu)(視頻+PPT)[附件下載]

    在線音視頻直播室服務(wù)端架構(gòu)最佳實(shí)踐(視頻+PPT)[附件下載]》 

    從0到1:萬人在線的實(shí)時(shí)音視頻直播技術(shù)實(shí)踐分享(視頻+PPT)[附件下載]

    微信移動(dòng)端應(yīng)對(duì)弱網(wǎng)絡(luò)情況的探索和實(shí)踐PPT[附件下載]

    Android版微信從300KB到30MB的技術(shù)演進(jìn)(PPT講稿)[附件下載]

    從零開始搭建瓜子二手車IM系統(tǒng)(PPT)[附件下載]

    極光分享:高并發(fā)海量消息推送系統(tǒng)架構(gòu)演進(jìn)(視頻+PPT)[附件下載]

    (本文同步發(fā)布于:http://www.52im.net/thread-2371-1-1.html



    作者:Jack Jiang (點(diǎn)擊作者姓名進(jìn)入Github)
    出處:http://www.52im.net/space-uid-1.html
    交流:歡迎加入即時(shí)通訊開發(fā)交流群 215891622
    討論:http://www.52im.net/
    Jack Jiang同時(shí)是【原創(chuàng)Java Swing外觀工程BeautyEye】【輕量級(jí)移動(dòng)端即時(shí)通訊框架MobileIMSDK】的作者,可前往下載交流。
    本博文 歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明出處(也可前往 我的52im.net 找到我)。


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    Jack Jiang的 Mail: jb2011@163.com, 聯(lián)系QQ: 413980957, 微信: hellojackjiang
    主站蜘蛛池模板: 在线看片v免费观看视频777| 一个人免费观看在线视频www| 无码av免费网站| 国产妇乱子伦视频免费| 精品亚洲成α人无码成α在线观看 | 亚洲精品偷拍视频免费观看| 国产精一品亚洲二区在线播放| 亚洲精品国产肉丝袜久久| 亚洲精品国产av成拍色拍| 一区二区三区免费看| 最近2019中文字幕免费直播| 日本高清色本免费现在观看| 亚洲精品无码久久久影院相关影片| 亚洲人成未满十八禁网站| 中文字幕免费在线看电影大全 | 一个人免费观看视频在线中文 | 又大又硬又爽又粗又快的视频免费| 风间由美在线亚洲一区| www成人免费观看网站| 最新猫咪www免费人成| 在线亚洲人成电影网站色www| 亚洲国产成人综合| 草久免费在线观看网站| 亚洲无砖砖区免费| 亚洲Av永久无码精品三区在线| 亚洲一区精品视频在线| 国产精品福利片免费看 | 久久精品免费一区二区喷潮| 亚洲一区二区高清| 亚洲黄网在线观看| 日本精品久久久久久久久免费| 18禁黄网站禁片免费观看不卡| 亚洲欧洲成人精品香蕉网| 亚洲字幕AV一区二区三区四区| 久久久精品视频免费观看| 欧美在线看片A免费观看| 久久精品国产亚洲av水果派| 一级美国片免费看| 国产精品久免费的黄网站| 亚洲日本国产精华液| 99久久成人国产精品免费|