網(wǎng)絡(luò)

Dream.png

https://github.com/starainDou 歡迎點(diǎn)星

AFNetWorking

  • 本段代碼為總結(jié)知識點(diǎn)
// AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; //推薦下面方式
AFHTTPSessionManager *manager =[[AFHTTPSessionManager alloc] initWithBaseURL:BaseURL];
// 設(shè)置請求頭
[manager.requestSerializer setValue:@"en" forHTTPHeaderField:@"locale"];
// 請求序列化
manager.requestSerializer = [AFJSONRequestSerializer serializer];
// 設(shè)置超時(shí)時(shí)間
manager.requestSerializer.timeoutInterval = 30.f;
// 響應(yīng)內(nèi)容序列化
manager.responseSerializer = [AFJSONResponseSerializer serializer];
// 支持的內(nèi)容類型
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects: @"application/json", @"text/json", @"text/plain",@"text/html", nil];
// 固定參數(shù)可這樣寫
NSDictionary *params = @{@"uid":userId,  @"token":token};
// 可選參數(shù)可這樣寫
NSMutableDictionary *params = [NSMutableDictionary dictionary];
if (userId) params[@"uid"] = userId;
if (token)  params[@"token"] = token;
// 網(wǎng)絡(luò)請求
[manager POST:url parameters:params constructingBodyWithBlock:^(id formData) {
            [formData appendPartWithFileData:UIImageJPEGRepresentation(image, 0.5)
                                        name:@"uploadfile"
                                    fileName: fileName
                                    mimeType:@"image/jpeg"];
        } progress:^(NSProgress *uploadProgress) {
            
        } success:^(NSURLSessionDataTask *task, id responseObject) {
            NSLog(@"success : %@", responseObject);
        } failure:^(NSURLSessionDataTask *task, NSError *error) {
            NSLog(@"error : %@",error.localizedDescription);
        }];

NSURLSession

  • NSURLSession 的優(yōu)勢

    • NSURLSession 支持 http2.0 協(xié)議
    • 在處理下載任務(wù)的時(shí)候可以直接把數(shù)據(jù)下載到磁盤
    • 支持后臺上傳/下載
    • 同一個(gè) session 發(fā)送多個(gè)請求托修,只需要建立一次連接(復(fù)用了TCP)
    • 提供了全局的 session 并且可以統(tǒng)一配置忘巧,使用更加方便
    • 下載的時(shí)候是多線程異步處理,效率更高
  • NSURLSessionTask 是一個(gè)抽象類睦刃,常用兩個(gè)子類

    • NSURLSessionDataTask: 處理一般的網(wǎng)絡(luò)請求砚嘴,其子類NSURLSessionUploadTask處理上傳請求
    • NSURLSessionDownloadTask,主要用于處理下載請求,有很大的優(yōu)勢
  • GET請求
    1.使用 NSURLSession 對象創(chuàng)建 Task
    2.執(zhí)行 Task

    //創(chuàng)建 NSURLSession 對象
    NSURLSession *session = [NSURLSession sharedSession];
    /**
     根據(jù)對象創(chuàng)建 Task 請求
     url  方法內(nèi)部會自動將 URL 包裝成一個(gè)請求對象(默認(rèn)是 GET 請求)
     completionHandler  完成之后的回調(diào)(成功或失斏尽)
     param data     返回的數(shù)據(jù)(響應(yīng)體)
     param response 響應(yīng)頭
     param error    錯誤信息
     */
    NSURLSessionDataTask *dataTask = [session dataTaskWithURL:url completionHandler:
                                      ^(NSData *data, NSURLResponse *response, NSError *error) {
                                          //解析服務(wù)器返回的數(shù)據(jù)
                                          NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
                                          //默認(rèn)在子線程中解析數(shù)據(jù)
                                          NSLog(@"%@", [NSThread currentThread]);
                                      }];
    //發(fā)送請求(執(zhí)行Task)
    [dataTask resume];
  • POST請求
    NSString *str = @"http://doudianyu.com/commetlist/";
    // 如果需要中文編碼
    NSString *urlPath = [str stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
    //確定請求路徑
    NSURL *url = [NSURL URLWithString:urlPath];
    //創(chuàng)建可變請求對象
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    //修改請求方法
    request.HTTPMethod = @"POST";
    // 設(shè)置請求頭
    [request setValue:@"en" forHTTPHeaderField:@"local"];
    //設(shè)置請求體
    request.HTTPBody = [@"page=0&size=50&type=JSON" dataUsingEncoding:NSUTF8StringEncoding];
    //創(chuàng)建會話對象
    NSURLSession *session = [NSURLSession sharedSession];
    // 遮罩
    [SVProgressHUD show];
    //創(chuàng)建請求 Task
    NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:
                                      ^(NSData *data, NSURLResponse *response, NSError *error) {
                                          //回到主線程更新UI -> 撤銷遮罩
                                          dispatch_async(dispatch_get_main_queue(), ^{
                                              [SVProgressHUD dismiss];
                                          });
                                          
                                          if (error) {
                                              NSLog(@"提示用戶請求失敗...error:%@",error);
                                          } else {
                                              // JSON解析 蘋果原生效率很高
                                              NSDictionary *result = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
                                              if ([[result objectForKey:@"message"] isEqualToString:@"success"]) {
                                                  //獲取數(shù)據(jù)->主線程更新UI
                                                  dispatch_async(dispatch_get_main_queue(), ^{
                                                      NSDictionary *data = [result objectForKey:@"data"];
                                                  });
                                              }else{
                                                  NSLog(@"未查到信息....");
                                              }
                                              NSLog(@"請求成功... %@",result);
                                          }
                                      }];
    //發(fā)送請求
    [dataTask resume];
  • NSURLSessionDataTask 設(shè)置代理發(fā)送請求
    1.創(chuàng)建 NSURLSession 對象設(shè)置代理
    2.使用 NSURLSession 對象創(chuàng)建 Task
    3.執(zhí)行 Task
//確定請求路徑
 NSURL *url = [NSURL URLWithString:@"http://doudianyu.com/commetlist/"];
 //創(chuàng)建可變請求對象
 NSMutableURLRequest *requestM = [NSMutableURLRequest requestWithURL:url];
 //設(shè)置請求方法
 requestM.HTTPMethod = @"POST";
 //設(shè)置請求體
 requestM.HTTPBody = [@"page=0&size=50&type=JSON" dataUsingEncoding:NSUTF8StringEncoding];
 //創(chuàng)建會話對象也颤,設(shè)置代理
 /**
  第一個(gè)參數(shù):配置信息
  第二個(gè)參數(shù):設(shè)置代理
  第三個(gè)參數(shù):隊(duì)列竭沫,如果該參數(shù)傳遞nil 那么默認(rèn)在子線程中執(zhí)行
  */
 NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]
                              delegate:self delegateQueue:nil];
 //創(chuàng)建請求 Task
 NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:requestM];
 //發(fā)送請求
 [dataTask resume];

4.遵守協(xié)議谎势,實(shí)現(xiàn)代理方法(常用的有三種代理方法)

#pragma mark 接收到服務(wù)器響應(yīng)的時(shí)候調(diào)用
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler {
     NSLog(@"子線程中執(zhí)行 -- %@", [NSThread currentThread]);
     self.dataM = [NSMutableData data];
     // 默認(rèn)情況下不接收數(shù)據(jù),必須告訴系統(tǒng)是否接收服務(wù)器返回的數(shù)據(jù)
     completionHandler(NSURLSessionResponseAllow);
}
#pragma mark 接受到服務(wù)器返回?cái)?shù)據(jù)的時(shí)候調(diào)用,可能被調(diào)用多次
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data {
     //拼接服務(wù)器返回的數(shù)據(jù)
     [self.dataM appendData:data];
}
#pragma mark 請求完成或者是失敗的時(shí)候調(diào)用
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error {
     //解析服務(wù)器返回?cái)?shù)據(jù)
     NSLog(@"%@", [[NSString alloc] initWithData:self.dataM encoding:NSUTF8StringEncoding]);
}

5.設(shè)置代理之后的強(qiáng)引用問題

  • NSURLSession對象使用時(shí)若設(shè)置了代理掷伙,session會對代理對象保持一個(gè)強(qiáng)引用寒波,合適的時(shí)候應(yīng)主動釋放
  • dealloc中調(diào)用 invalidateAndCancel或finishTasksAndInvalidate方法釋放對代理對象的強(qiáng)引用
    1.invalidateAndCancel 方法直接取消請求然后釋放代理對象
    2.finishTasksAndInvalidate 方法等請求完成之后釋放代理對象
    [self.session finishTasksAndInvalidate];
-(void)dealloc
{
    //注意:在不用的時(shí)候一定要調(diào)用該方法來釋放,不然會出現(xiàn)內(nèi)存泄露問題
    //方法一:取消所有過去的會話和任務(wù)
    [self.session invalidateAndCancel];
    //方法二:可在釋放時(shí)做一些操作
    [self.session resetWithCompletionHandler:^{
         // 釋放時(shí)做的操作
    }];
}
  • NSURLSessionDataTask 簡單下載
[[[NSURLSession sharedSession] dataTaskWithURL:imgURL completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
     dispatch_async(dispatch_get_main_queue(), ^{
         self.imageView.image =  [UIImage imageWithData:data];
     });
 }] resume];
  • NSURLSessionDownloadTask 簡單下載
    1.使用 NSURLSession 對象創(chuàng)建下載請求
    2.在下載請求中移動文件到指定位置
    3.執(zhí)行請求
    4.代理方法監(jiān)聽下載進(jìn)度
 //優(yōu)點(diǎn):該方法內(nèi)部已經(jīng)完成了邊接收數(shù)據(jù)邊寫沙盒的操作,解決了內(nèi)存飆升的問題
 NSURLSessionDownloadTask *downTask = [session downloadTaskWithRequest:request completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {
     // 默認(rèn)存儲到臨時(shí)文件夾 tmp 中,需要剪切文件到 cache
     NSLog(@"目標(biāo)位置%@", location);
     NSString *fullPath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:response.suggestedFilename];
     // fileURLWithPath:有協(xié)議頭; URLWithString:無協(xié)議頭
     [[NSFileManager defaultManager] moveItemAtURL:location toURL:[NSURL fileURLWithPath:fullPath] error:nil];
 }];
 //發(fā)送請求
 [downTask resume];
  • NSURLSessionDataTask和NSURLSessionDownloadTask下載對比
  • DataTask可以實(shí)現(xiàn)離線斷點(diǎn)下載臭增,但是代碼相對復(fù)雜
  • DownloadTask可斷點(diǎn)下載但不能離線斷點(diǎn)下載拗窃,邊接收邊寫入沙盒解決下載大文件內(nèi)存飆升問題

NSURLConnection

  • first deprecated in iOS 9.0
  • 文件上傳

FileUpload.h

#import <Foundation/Foundation.h>

@interface FileUpload : NSObject

@end

FileUpload.m

// iOS post方式上傳文件

#import "FileUpload.h"

@implementation FileUpload

+ (void)uploadFiles:(NSArray *)files msgId:(NSString *)msgId obj:(id)obj userid:(NSString *)userid {
    // 分界線的標(biāo)識符
    for (NSMutableDictionary *filedic in files) {
        NSString *TWITTERFON_FORM_BOUNDARY = @"AaB03x";
        // 根據(jù)url初始化request
        NSString* URL = [NSString stringWithFormat:@"http://%@%@",NSLocalizedString(@"MQTT_IP", @""),NSLocalizedString(@"im_uploadfileURL", @"")];
        NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:URL]
                                                               cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
                                                           timeoutInterval:10];
        // 分界線 --AaB03x
        NSString *MPboundary=[[NSString alloc]initWithFormat:@"--%@",TWITTERFON_FORM_BOUNDARY];
        // 結(jié)束符 AaB03x--
        NSString *endMPboundary=[[NSString alloc]initWithFormat:@"%@--",MPboundary];
        // 要上傳的文件
        NSData *data = [NSData dataWithContentsOfFile:[filedic objectForKey:@"filepath"]];
        
        // http body的字符串
        NSMutableString *body=[[NSMutableString alloc]init];
        // 參數(shù)的集合普通的key-value參數(shù)
        
        body = [self setParamsKey:@"uptype" value:@"1" body:body];
        body = [self setParamsKey:@"sid" value:msgId body:body];
        body = [self setParamsKey:@"uid" value:userid body:body];
        
        // 添加分界線,換行
        [body appendFormat:@"%@\r\n",MPboundary];
        // 聲明文件字段,文件名
        [body appendFormat:@"Content-Disposition: form-data; name=\"upfile\"; filename=\"%@\"\r\n",[filedic objectForKey:@"serverfilename"]];
        // 聲明上傳文件的格式 
        [body appendFormat:@"Content-Type: %@\r\n\r\n",[self GetContentType:[filedic objectForKey:@"serverfilename"]]];
        
        // 聲明結(jié)束符:--AaB03x--
        NSString *end=[[NSString alloc]initWithFormat:@"\r\n%@",endMPboundary];
        // 聲明myRequestData妇萄,用來放入http body
        NSMutableData *myRequestData=[NSMutableData data];
        // 將body字符串轉(zhuǎn)化為UTF8格式的二進(jìn)制
        [myRequestData appendData:[body dataUsingEncoding:NSUTF8StringEncoding]];
        // 將file的data加入
        [myRequestData appendData:data];
        // 加入結(jié)束符--AaB03x--
        [myRequestData appendData:[end dataUsingEncoding:NSUTF8StringEncoding]];
        
        // 設(shè)置HTTPHeader中Content-Type的值
        NSString *content=[[NSString alloc]initWithFormat:@"multipart/form-data; boundary=%@",TWITTERFON_FORM_BOUNDARY];
        // 設(shè)置HTTPHeader
        [request setValue:content forHTTPHeaderField:@"Content-Type"];
        // 設(shè)置Content-Length
        [request setValue:[NSString stringWithFormat:@"%lu", [myRequestData length]] forHTTPHeaderField:@"Content-Length"];
        // 設(shè)置http body
        [request setHTTPBody:myRequestData];
        // http method
        [request setHTTPMethod:@"POST"];
        
        // 開線程下載
        dispatch_queue_t defaultQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        dispatch_async(defaultQueue, ^{
            // 另開線程
            NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
            NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];
            NSLog(@"上傳狀態(tài)返回值: %@", returnString);
            //                   if ([returnString isEqualToString:@"0"]) {
            //                       [self responseLoadFinish:files msgId:msgId upload:upload];
            //                } else {
            //                        [self responseLoadFail:files msgId:msgId upload:upload];
            //                    }
        });
    }
}

+ (NSMutableString*)setParamsKey:(NSString*)key value:(NSString*)value body:(NSMutableString*)body {
    NSString *TWITTERFON_FORM_BOUNDARY = @"AaB03x";
    // 分界線 --AaB03x
    NSString *MPboundary=[[NSString alloc]initWithFormat:@"--%@",TWITTERFON_FORM_BOUNDARY];
    // 添加分界線丐重,換行
    [body appendFormat:@"%@\r\n",MPboundary];
    // 添加字段名稱崖蜜,換2行
    [body appendFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n",key];
    // 添加字段的值
    [body appendFormat:@"%@\r\n",value];
    return body;
}
+ (NSString*)GetContentType:(NSString*)filename {
    if ([filename hasSuffix:@".avi"]) {
        return @"video/avi";
    }  else if ([filename hasSuffix:@".bmp"]) {
        return @"application/x-bmp";
    } else if ([filename hasSuffix:@"jpeg"]) {
        return @"image/jpeg";
    } else if ([filename hasSuffix:@"jpg"]) {
        return @"image/jpeg";
    } else if ([filename hasSuffix:@"png"]) {
        // chrome/firefox 標(biāo)準(zhǔn)image/png,IE 標(biāo)準(zhǔn)image/x-png
        return @"image/png"; 
    } else if ([filename hasSuffix:@"mp3"]) {
        return @"audio/mp3";
    } else if ([filename hasSuffix:@"mp4"]) {
        return @"video/mpeg4";
    } else if ([filename hasSuffix:@"rmvb"]) {
        return @"application/vnd.rn-realmedia-vbr";
    } else if ([filename hasSuffix:@"txt"]) {
        return @"text/plain";
    } else if ([filename hasSuffix:@"xsl"]) {
        return @"application/x-xls";
    } else if ([filename hasSuffix:@"xslx"]) {
        return @"application/x-xls";
    } else if ([filename hasSuffix:@"xwd"]) {
        return @"application/x-xwd";
    } else if ([filename hasSuffix:@"doc"]) {
        return @"application/msword";
    } else if ([filename hasSuffix:@"docx"]) {
        return @"application/msword";
    } else if ([filename hasSuffix:@"ppt"]) {
        return @"application/x-ppt";
    } else if ([filename hasSuffix:@"pdf"]) {
        return @"application/pdf";
    }
    return nil;
}
@end

原生方式監(jiān)聽網(wǎng)絡(luò)狀態(tài)

方法一 :command + shift + 0打開 Documentation And API reference 搜索 Reachability
方法二:到網(wǎng)頁[下載]https://developer.apple.com/library/content/samplecode/Reachability/Introduction/Intro.html

  • 獲取當(dāng)前網(wǎng)絡(luò)狀態(tài)
//  [Reachability reachabilityForInternetConnection];只能判斷wifi是否可用,不能判斷是否連接以太網(wǎng)絡(luò)
Reachability *reachability = [Reachability reachabilityWithHostName:@"www.baidu.com"];
NetworkStatus netStatus = [reachability currentReachabilityStatus];
    switch (netStatus) {
        case NotReachable:
            break;
        case ReachableViaWiFi:
            networkStatus = 
            break;
        case ReachableViaWWAN:
            break;

        default:
            break;
    }
  • 監(jiān)聽網(wǎng)絡(luò)狀態(tài)
- (void) addNotifacation
{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:kReachabilityChangedNotification object:nil];
 [self.hostReachability startNotifier];
}

- (void) reachabilityChanged:(NSNotification *)note
{
 Reachability* curReach = [note object];
 NSParameterAssert([curReach isKindOfClass:[Reachability class]]);
 NetworkStatus netStatus = [reachability currentReachabilityStatus];
}

AFNetworking 中封裝的監(jiān)聽網(wǎng)絡(luò)

// 1.獲得網(wǎng)絡(luò)監(jiān)控的管理者
AFNetworkReachabilityManager *mgr = [AFNetworkReachabilityManager sharedManager];
// 2.設(shè)置網(wǎng)絡(luò)狀態(tài)改變后的處理
[mgr setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
// 當(dāng)網(wǎng)絡(luò)狀態(tài)改變了, 就會調(diào)用這個(gè)block
switch(status) {
    case AFNetworkReachabilityStatusUnknown: // 未知網(wǎng)絡(luò)
              NSLog(@"未知網(wǎng)絡(luò)");
              break;
     case AFNetworkReachabilityStatusNotReachable: // 沒有網(wǎng)絡(luò)(斷網(wǎng))
              NSLog(@"沒有網(wǎng)絡(luò)(斷網(wǎng))");
              break;
    case AFNetworkReachabilityStatusReachableViaWWAN: // 手機(jī)自帶網(wǎng)絡(luò)
              NSLog(@"手機(jī)自帶網(wǎng)絡(luò)");
              break;
    case AFNetworkReachabilityStatusReachableViaWiFi: // WIFI
              NSLog(@"WIFI");
              break;
    }
}];
// 3.開始監(jiān)控
[mgr startMonitoring];

AFN和ASI有啥不同

1 AFN基于NSURL(NSURLSession&NSURLConnection)襟锐,ASI基于底層的CFNetwork框架,因此ASI的性能優(yōu)于AFN
2 AFN采取block的方式處理請求敲霍,ASI最初采取delegate的方式處理請求艘儒,后面也增加了block的方式
3 AFN只封裝了一些常用功能逾礁,滿足基本需求窒篱,直接忽略了很多擴(kuò)展功能,比如沒有封裝同步請求;ASI提供的功能較多婶溯,預(yù)留了各種接口和工具供開發(fā)者自行擴(kuò)展
4 AFN直接解析服務(wù)器返回的JSON信轿、XML等數(shù)據(jù),而ASI比較原始惠况,返回的是NSData二進(jìn)制數(shù)據(jù)
5 AFN在iOS9.0之后需要網(wǎng)絡(luò)權(quán)限攘蔽,而ASI不需要

在真正的開發(fā)中

  1. 如果是普通的GET&POST請求、小文件上傳醉途,強(qiáng)烈建議用AFN,因?yàn)锳FN簡單好用宝惰。

  2. 如果是下載強(qiáng)烈建議用ASI拐邪,因?yàn)樗峁┝撕軓?qiáng)大的功能惰赋。

附:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市鸵钝,隨后出現(xiàn)的幾起案子粟矿,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡叠聋,警方通過查閱死者的電腦和手機(jī)碌补,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人浪蹂,你說我怎么就攤上這事弯菊」芮” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵扫茅,是天一觀的道長蹋嵌。 經(jīng)常有香客問我,道長葫隙,這世上最難降的妖魔是什么栽烂? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮恋脚,結(jié)果婚禮上腺办,老公的妹妹穿的比我還像新娘。我一直安慰自己糟描,他們只是感情好怀喉,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著船响,像睡著了一般躬拢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上见间,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天聊闯,我揣著相機(jī)與錄音,去河邊找鬼米诉。 笑死菱蔬,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的史侣。 我是一名探鬼主播拴泌,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼惊橱!你這毒婦竟也來了蚪腐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤李皇,失蹤者是張志新(化名)和其女友劉穎削茁,沒想到半個(gè)月后宙枷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡茧跋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年慰丛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瘾杭。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡诅病,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出粥烁,到底是詐尸還是另有隱情贤笆,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布讨阻,位于F島的核電站芥永,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏钝吮。R本人自食惡果不足惜埋涧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望奇瘦。 院中可真熱鬧棘催,春花似錦、人聲如沸耳标。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽次坡。三九已至呼猪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間砸琅,已是汗流浹背郑叠。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留明棍,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓寇僧,卻偏偏與公主長得像摊腋,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子嘁傀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容