Jack Jiang

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

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

          1、引言

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

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

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

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

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

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

          - 移動端IM開發(fā)入門文章:《新手入門一篇就夠:從零開發(fā)移動端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錄音及振幅動畫完整實(shí)現(xiàn) [源碼下載]

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

          5.1 完整源碼

          /**

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

           *

           * @param dt

           * @param pattern

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

           * @author 即時通訊網(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"";

                  }

          }


          /**

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

          * <p>

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

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

          *

          * @param srcDate 要處理的源日期時間對象

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

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

          * @author 即時通訊網(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);


                          // 要額外顯示的時間分鐘

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


                          // 當(dāng)年

                          if(currentYear == srcYear)

                          {

                                  longcurrentTimestamp = gcCurrent.getTimeInMillis();

                                  longsrcTimestamp = gcSrc.getTimeInMillis();


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

                                  longdelta = (currentTimestamp - srcTimestamp);


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

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

                                  {

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

                                          if(delta < 60* 1000)

                                                     ret = "剛剛";

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

                                          else

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

                                  }

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

                                  else

                                  {

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

                                          GregorianCalendar yesterdayDate = newGregorianCalendar();

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


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

                                          GregorianCalendar beforeYesterdayDate = newGregorianCalendar();

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


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

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

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

                                          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ù)

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


                                                      // 如果小于 7*24小時就顯示星期幾

                                                      if(deltaHour < 7*24)

                                                      {

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


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

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

                                                          ret = weedayDesc+timeExtraStr;

                                                      }

                                                      // 否則直接顯示完整日期時間

                                                      else

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

                                          }

                                  }

                      }

                      else

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

                  }

                  catch(Exception e)

                  {

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

                  }


                  returnret;

          }

          5.2 調(diào)用示例

          // 用于首頁“消息”界面時

          getTimeStringAutoShort2(newDate(), false);

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

          getTimeStringAutoShort2(newDate(), true);

          5.3 運(yùn)行效果

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

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

          6.1 完整源碼

          源文件TimeTool.h:

          #import <Foundation/Foundation.h>

          @interfaceTimeTool : NSObject

          /**

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

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

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

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

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

           * @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對象iOS時間戳(格式遵從ios的習(xí)慣,以秒為單位)。

           */

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


          /**

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

           */

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

          @end

          源文件TimeTool.m:

          #import "TimeTool.h"

          @implementationTimeTool

          // 仿照微信的邏輯,顯示一個人性化的時間字串

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

              NSString*ret = nil;

              NSCalendar*calendar = [NSCalendarcurrentCalendar];

              // 當(dāng)前時間

              NSDate*currentDate = [NSDatedate];

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

              NSIntegercurrentYear=[curComponents year];

              NSIntegercurrentMonth=[curComponents month];

              NSIntegercurrentDay=[curComponents day];

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

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

              NSIntegersrcYear=[srcComponents year];

              NSIntegersrcMonth=[srcComponents month];

              NSIntegersrcDay=[srcComponents day];

              // 要額外顯示的時間分鐘

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

              // 當(dāng)年

              if(currentYear == srcYear) {

                  longcurrentTimestamp = [TimeTool getIOSTimeStamp_l:currentDate];

                  longsrcTimestamp = [TimeTool getIOSTimeStamp_l:dt];

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

                  longdelta = currentTimestamp - srcTimestamp;

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

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

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

                      if(delta < 60)

                          ret = @"剛剛";

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

                      else

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

                  }

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

                  else{

                      // 昨天(以“現(xiàn)在”的時候?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)在”的時候?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ìn)行比較,是最為準(zhǔn)確的(如果用時間戳差值

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

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

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

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

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

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

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

                      else{

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

                          longdeltaHour = (delta/3600);


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

                          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];

                          }

                          // 否則直接顯示完整日期時間

                          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)用示例

          // 用于首頁“消息”界面時

          [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版源碼無非法貼上來,請從鏈接:http://www.52im.net/thread-2371-1-1.html,查看JavaScript版完整源碼!

          7.2 調(diào)用示例

          // 用于首頁“消息”界面時

          _getTimeStringAutoShort2(1550789954260, false);

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

          _getTimeStringAutoShort2(1550789954260, true);

          7.3 運(yùn)行效果

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

          附錄:更多精品資源下載

          [1] 精品源碼下載:

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

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

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

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

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

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

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

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

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

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

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

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

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

          開源libco庫:單機(jī)千萬連接、支撐微信8億用戶的后臺框架基石 [源碼下載]

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

          微信移動端應(yīng)對弱網(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
          交流:歡迎加入即時通訊開發(fā)交流群 215891622
          討論:http://www.52im.net/
          Jack Jiang同時是【原創(chuàng)Java Swing外觀工程BeautyEye】【輕量級移動端即時通訊框架MobileIMSDK】的作者,可前往下載交流。
          本博文 歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明出處(也可前往 我的52im.net 找到我)。


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


          網(wǎng)站導(dǎo)航:
           
          Jack Jiang的 Mail: jb2011@163.com, 聯(lián)系QQ: 413980957, 微信: hellojackjiang
          主站蜘蛛池模板: 西藏| 大悟县| 隆回县| 大连市| 克什克腾旗| 泰安市| 朝阳区| 灵山县| 临潭县| 惠东县| 景洪市| 潞西市| 宾川县| 中宁县| 平泉县| 凤城市| 鄂托克旗| 昔阳县| 互助| 托里县| 河源市| 河南省| 突泉县| 逊克县| 天峻县| 清水县| 鲁山县| 连南| 鄢陵县| 盐池县| 抚顺市| 广东省| 抚松县| 台江县| 镇江市| 长兴县| 永仁县| 水富县| 屯门区| 阳高县| 苍山县|