iOS學習之Socket

来源:http://www.cnblogs.com/gfxxbk/archive/2016/06/08/5571339.html
-Advertisement-
Play Games

Socket在百度百科的定義 網路上的兩個程式通過一個雙向的通信連接實現數據的交換,這個連接的一端稱為一個socket。 相關的描述 Socket的英文原義是“孔”或“插座”。作為BSD UNIX的進程通信機制,取後一種意思。通常也稱作"套接字",用於描述IP地址和埠,是一個通信鏈的句柄,可以用來 ...


 Socket在百度百科的定義

  網路上的兩個程式通過一個雙向的通信連接實現數據的交換,這個連接的一端稱為一個socket。

 相關的描述

  Socket的英文原義是“孔”或“插座”。作為BSD UNIX的進程通信機制,取後一種意思。通常也稱作"套接字",用於描述IP地址和埠,是一個通信鏈的句柄,可以用來實現不同虛擬機或不同電腦之間的通信。

  在Internet上的主機一 般運行了多個服務軟體,同時提供幾種服務。每種服務都打開一個Socket,並綁定到一個埠上,不同的埠對應於不同的服務。

  Socket正如其英文原意那樣,像一個多孔插座。一臺主機猶如佈滿各種插座的房間,每個插座有一個編號,有的插座提供220伏交流電, 有的提供110伏交流電,有的則提供有線電視節目。 客戶軟體將插頭插到不同編號的插座,就可以得到不同的服務。

 正如上述的介紹Socket一定包含了通信的雙發,即客戶端(Client)與服務端(server)。

  • 伺服器利用Socket監聽埠

  • 客戶端發起連接

  • 服務端返回信息,建立連接,開始通信

  • 客戶端,服務端斷開連接

Socket 第三方 GCDAsyncSocket 的下載地址:https://github.com/AlonerOwl/socket

 一、伺服器端:

  在伺服器端構建的時候,我們需要導入第三方框架和其他的一些C語言包

#import "GCDAsyncSocket.h"

#include <arpa/inet.h>
#include <net/if.h>
#include <ifaddrs.h>

  1、聲明一個 socket 併進行初始化 socket

/// 伺服器端socket,決定不能使用局部變數,不能被銷毀
@property (nonatomic, strong) GCDAsyncSocket *socket;

// 初始化socket
self.socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];

  2、綁定埠,監聽連接消息

   埠號設置:埠號大於1024,不能使用市面上已經被占用的斷開 eg.8080,8800,因此在綁定時,要進行一個安全判斷。

    NSError *error;
    // 綁定埠,監聽連接消息
    BOOL result = [self.socket acceptOnPort:[self.portTextField intValue] error:&error];

  3、監聽客戶端,獲取新的socket連接之後調用以下方法,併進行一些邏輯處理

// 參數1:當前伺服器的socket
// 參數2:接收到的客戶端的新socket
- (void)socket:(GCDAsyncSocket *)sock didAcceptNewSocket:(GCDAsyncSocket *)newSocket;

  4、讀取消息

   讀取方法是哪個socket調用就讀取哪個socket的攜帶消息(對應的是客戶端發送消息)

    // -1 不限定讀取時間,tag為一個標記值
    [newSocket readDataWithTimeout:-1 tag:0];

  5、寫數據

   寫給誰就用誰來調用

// string 變數就是我們要寫入的消息,它需要轉為Data
// -1 和讀取消息時的意思一樣,表示不限定時間
// tag 為標記值,一般置為0
[newSocket writeData:[string dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:0];

  6、讀取到 socket 的消息,在 readDataWithTimeout 後執行

   主要用於對接收到消息的處理和將消息轉發給另一個接收的客戶端,這樣就起到兩個客戶端的通信,具體數據格式和邏輯根據個人需求自行處理。以下方法和readDataWithTimeout 方法配套執行,只要有 readDataWithTimeout 方法,就會有下麵的方法

// 參數1:伺服器的socket 
// 參數2:伺服器讀取的數據
// 參數3:標記
- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag;

  7、關閉伺服器

  將伺服器的 socket 斷開連接後置為nil

#pragma mark - 關閉服務
- (IBAction)stopService:(NSButton *)sender
{
    if (self.socket) {
#warning 關閉
        [self.socket disconnect];
        self.socket = nil;
        [self addInfoString:@"關閉服務"];
    } else {
        [self addInfoString:@"已經關閉,無需重覆"];
    }
}

  8、監聽連接的斷開

  當伺服器斷開連接後調用,主要用於處理socket存儲列表。

// 已經斷開連接時調用,監聽連接的斷開,並且處理socket存儲列表
- (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err
{
//    [self addInfoString:[NSString stringWithFormat:@"已經斷開連接 %@", err]];
    [self addInfoString:[NSString stringWithFormat:@"已經斷開連接"]];
    
    if ([self.clients allKeysForObject:sock].count > 0) {
        // 當客戶端斷開時,進行一些刪除socket的操作
        [self.clients removeObjectForKey:[self.clients allKeysForObject:sock][0]];
        NSLog(@"%@", self.clients);
    } else {
        // 當伺服器socket斷開時,處理客戶端socket列表
        [self.clients removeAllObjects];
        NSLog(@"%@", self.clients);
    }
}

二、客戶端

  在構建客戶器端的時候,需要導入第三方的類

#import "GCDAsyncSocket.h"

  1、聲明和初始化客戶端socket(和伺服器端類似)

@interface ViewController () <GCDAsyncSocketDelegate>
{
    // client端socket
    GCDAsyncSocket *_clientSocket;
}

@end

_clientSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];

  2、連接伺服器

// 參數1:伺服器的IP地址 
// 參數2:伺服器的埠號(伺服器綁定的埠號)
// 參數3:錯誤信息
- (BOOL)connectToHost:(NSString*)host onPort:(uint16_t)port error:(NSError **)errPtr

  3、連接到伺服器後執行的代理方法

   主要用於從伺服器中讀取數據

// 連接到伺服器
- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port
{
    NSLog(@"連接到伺服器");
    _serverSocket = sock;
    // 讀數據
    [_serverSocket readDataWithTimeout:-1 tag:0];
}

  4、讀到伺服器反饋的數據

   方法和伺服器第6步的方法一樣,對伺服器反饋的數據進行處理和利用

  5、讀寫消息的方法後伺服器端是一樣的,在這裡我就不再重覆介紹了,大家可以參照伺服器的讀寫消息的方法

三、下麵是自己學習的一個簡易版的Demo,有興趣的朋友可以下載看看

 下載地址:https://github.com/AlonerOwl/Socket-

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 介紹 最近用淘寶客戶端的時候,編輯地址的時候有個地區選擇的功能。看上面的效果覺得挺酷,滾動的時候,是最後一個從下麵飛上來挨著前一個。就自己鼓搗一個出來玩玩。 說了效果可能不太直觀,下麵上兩張圖看看效果 淘寶地區選擇效果 再來一張自己的效果 gif的效果可能不太好,大家自己用Android手機打開淘寶 ...
  • 前言 斷斷續續的已經學習 一年多了, 從 到現在的 , 一直在語法之間徘徊, 學一段時間, 工作一忙, 再撿起來隔段時間又忘了.思來想去, 趁著這兩個月加班不是特別多, 就決定用 仿寫一個完整項目. 花田小憩:是一個植物美學生活平臺, 以自然生活為主導, 提倡植物學生活方法, 倡導美學標準的生活態度 ...
  • 一、簡介 NSSet到底什麼類型,其實它和NSArray功能性質一樣,用於存儲對象,屬於集合; NSSet , NSMutableSet類聲明編程介面對象,無序的集合,在記憶體中存儲方式是不連續的,不像NSArray(是有序的集合)類聲明編程介面對象是有序集合,在記憶體中存儲位置是連續的; NSSet和 ...
  • BadgeValueView 效果 源碼 https://github.com/YouXianMing/UI-Component-Collection 中的 BadgeValueView ...
  • 【版權所有,轉載請註明出處。出處:http://www.cnblogs.com/joey-hua/p/5570691.html 】 Linux內核從啟動到初始化也看了好些個源碼文件了,這次看到kernel文件夾下的system_call.s,這個文件主要就是系統調用的過程。但說到系統調用,不只是這一 ...
  • iOS多圖片下載、在cell裡面下載圖片、做了緩存優化。 ...
  • 側滑欄效果的實現 效果 源碼 https://github.com/YouXianMing/iOS-Project-Examples 中的 SideViewController 細節 ...
  • 因為一些大家都知道的原因,Android很多官方出品的優秀開發資源在國內無法訪問。 國內的同行們對此也做出了很多努力,有很多朋友通過各種手段把很多優秀的資源搬運到了國內,為國內android開發者提供了巨大方便。 那麼現在有哪些優秀的android官方資源在國內是可以獲取的呢,本文僅列出本人知道的一 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...