利用CocoaHttpServer搭建手機本地服務器

緣起

今天用暴風影音看視頻,然后發現它有個功能,wifi傳片,感覺挺有意思,然后就上網查了下相關內容。

原理

使用CocoaHTTPServer框架,在iOS端建立一個本地服務器,只要電腦和手機連入同一熱點或者說網絡,就可以實現通過電腦瀏覽器訪問iOS服務器的頁面,利用POST實現文件的上傳。

實現

1.下載CocoaHTTPServer

2.導入CocoaHTTPServer-master目錄下的Core文件夾

3.導入Samples/SimpleFileUploadServer目錄下的MyHTTPConnection類文件和web文件夾

導入web文件夾的時候,一定要使用真實的目錄,而不是xcode的虛擬目錄


web文件夾導入.png

4.導入Vendor目錄下的CocoaAsyncSocketCocoaLumberjack文件夾

5.打開MyHTTPConnection.m文件,根據標記 #pragma mark multipart form data parser delegate 跳轉或者直接找到139行的 *- (void) processStartOfPartWithHeader:(MultipartMessageHeader ) header 方法,把第151行的uploadDirPath改為

NSString *uploadDirPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];

這個路徑是上傳文件的存儲路徑

6.在適當的地方配置server啟動。這里以AppDelegate為例

#import "AppDelegate.h"
#import <ifaddrs.h>
#import <arpa/inet.h>
#import "HTTPServer.h"
#import "DDLog.h"
#import "DDTTYLogger.h"
#import "MyHTTPConnection.h"

@interface AppDelegate ()
@property (nonatomic, strong) HTTPServer * httpServer;
@end

@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    _httpServer = [[HTTPServer alloc] init];
    [_httpServer setPort:1234];
    [_httpServer setType:@"_http._tcp."];
    // webPath是server搜尋HTML等文件的路徑
    NSString * webPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"web"];
    [_httpServer setDocumentRoot:webPath];
    [_httpServer setConnectionClass:[MyHTTPConnection class]];
    NSError *err;
    if ([_httpServer start:&err]) {
        NSLog(@"port %hu",[_httpServer listeningPort]);
    }else{
        NSLog(@"%@",err);
    }
    NSString *ipStr = [self getIpAddresses];
    NSLog(@"ip地址 %@", ipStr);
    
    return YES;
}

- (NSString *)getIpAddresses{
    NSString *address = @"error";
    struct ifaddrs *interfaces = NULL;
    struct ifaddrs *temp_addr = NULL;
    int success = 0;
    // retrieve the current interfaces - returns 0 on success
    success = getifaddrs(&interfaces);
    if (success == 0)
    {
        // Loop through linked list of interfaces
        temp_addr = interfaces;
        while(temp_addr != NULL)
        {
            if(temp_addr->ifa_addr->sa_family == AF_INET)
            {
                // Check if interface is en0 which is the wifi connection on the iPhone
                if([[NSString stringWithUTF8String:temp_addr->ifa_name] isEqualToString:@"en0"])
                {
                    // Get NSString from C String
                    address = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr)];
                }
            }
            temp_addr = temp_addr->ifa_next;
        }
    }
    // Free memory
    freeifaddrs(interfaces);
    return address;
}

7.運行后,控制臺會打印出端口號和ip,在電腦端瀏覽器里輸入ip+端口號訪問即可,如果成功的話會看到如下界面:

訪問成功.png

8.如果上傳成功,網頁上會出現上傳的文件名,可以在沙盒里驗證文件是否上傳成功

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1、首先導入第三方目錄結構 然后導入你需要加載的html資源 2、在appdelegate中開啟服務,獲取端口號 ...
    c608閱讀 16,339評論 7 15
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,837評論 18 139
  • 名詞延伸 通俗的說,域名就相當于一個家庭的門牌號碼,別人通過這個號碼可以很容易的找到你。如果把IP地址比作一間房子...
    楊大蝦閱讀 20,622評論 2 56
  • Spring Boot 參考指南 介紹 轉載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,925評論 6 342
  • 剛步去社會的殿堂,擁有了自己人生中的第一份工作,和第一份收入,自己本身做銷售出生,自己也有些投資的想法,也會經常在...
    lucky秀_b07c閱讀 197評論 1 5