(三)即時通訊系列之UDPSocket

即時通訊系列之Socket簡介

轉(zhuǎn)自他人

1. UDP Socket編程

先講一講UDP
編程蚤霞,因為比TCP
要簡單多了。首先洒擦,我們需要明白UDP
是用戶數(shù)據(jù)報協(xié)議亚隅,英文名為User Datagram Protocol,它是面向無連接的倍奢。
注意:Socket
通信一定有要服務(wù)端和客戶端朴上。
1.1 UDP Socket客戶端
客戶端的工作流程:首先調(diào)用socket
函數(shù)創(chuàng)建一個Socket
,然后指定服務(wù)端的IP
地址和端口號卒煞,就可以調(diào)用sendto
將字符串傳送給服務(wù)器端痪宰,并可以調(diào)用recvfrom
接收服務(wù)器端返回的字符串,最后關(guān)閉該socket畔裕。
第一步:創(chuàng)建socket并配置socket衣撬,如服務(wù)端ip地址和端口號
第二步:調(diào)用sendto發(fā)送消息到服務(wù)器端
第三步:調(diào)用recvfrom接收來自服務(wù)器端的消息
第四步:調(diào)用close關(guān)閉socket

1.1.1 客戶端的代碼實現(xiàn):

- (void)udpClient {
  int clientSocketId;
  ssize_t len;
  socklen_t addrlen;
  struct sockaddr_in client_sockaddr;
  char buffer[256] = "Hello, server, how are you?";
  
  // 第一步:創(chuàng)建Socket
  clientSocketId = socket(AF_INET, SOCK_DGRAM, 0);
  if(clientSocketId < 0) {
    NSLog(@"creat client socket fail\n");
    return;
  }
  
  addrlen = sizeof(struct sockaddr_in);
  bzero(&client_sockaddr, addrlen);
  client_sockaddr.sin_family = AF_INET;
  client_sockaddr.sin_addr.s_addr = inet_addr("192.168.1.107");
  client_sockaddr.sin_port = htons(1024);
  
  int count = 10;
  do {
    bzero(buffer, sizeof(buffer));
    sprintf(buffer, "%s", "Hello, server, how are you?");
    
    // 第二步:發(fā)送消息到服務(wù)端
    // 注意:UDP是面向無連接的,因此不用調(diào)用connect()
    // 將字符串傳送給server端
   len = sendto(clientSocketId, buffer, sizeof(buffer), 0, (struct sockaddr *)&client_sockaddr, addrlen);
    
    if (len > 0) {
      NSLog(@"發(fā)送成功");
    } else {
      NSLog(@"發(fā)送失敗");
    }
    
    // 第三步:接收來自服務(wù)端返回的消息
    // 接收server端返回的字符串
    bzero(buffer, sizeof(buffer));
    len = recvfrom(clientSocketId, buffer, sizeof(buffer), 0, (struct sockaddr *)&client_sockaddr, &addrlen);
    NSLog(@"receive message from server: %s", buffer);
    
    count--;
  } while (count >= 0);

// 第四步:關(guān)閉socket
// 由于是面向無連接的柴钻,消息發(fā)出處就可以了淮韭,不用管它收不收得到,發(fā)完就可以關(guān)閉了
close(clientSocketId);
}

1.1.2 客戶端的打印日志

2015-12-06 15:38:36.095 iOS-Socket-C-Version-Client[9709:4234848] 發(fā)送成功
2015-12-06 15:38:36.286 iOS-Socket-C-Version-Client[9709:4234848] receive message from server: Hello, server, how are you?
2015-12-06 15:38:36.286 iOS-Socket-C-Version-Client[9709:4234848] 發(fā)送成功
2015-12-06 15:38:36.291 iOS-Socket-C-Version-Client[9709:4234848] receive message from server: Hello, server, how are you?
2015-12-06 15:38:36.291 iOS-Socket-C-Version-Client[9709:4234848] 發(fā)送成功
2015-12-06 15:38:36.296 iOS-Socket-C-Version-Client[9709:4234848] receive message from server: Hello, server, how are you?
2015-12-06 15:38:36.296 iOS-Socket-C-Version-Client[9709:4234848] 發(fā)送成功
2015-12-06 15:38:36.316 iOS-Socket-C-Version-Client[9709:4234848] receive message from server: Hello, server, how are you?
2015-12-06 15:38:36.317 iOS-Socket-C-Version-Client[9709:4234848] 發(fā)送成功
2015-12-06 15:38:36.324 iOS-Socket-C-Version-Client[9709:4234848] receive message from server: Hello, server, how are you?
2015-12-06 15:38:36.324 iOS-Socket-C-Version-Client[9709:4234848] 發(fā)送成功
2015-12-06 15:38:36.328 iOS-Socket-C-Version-Client[9709:4234848] receive message from server: Hello, server, how are you?
2015-12-06 15:38:36.329 iOS-Socket-C-Version-Client[9709:4234848] 發(fā)送成功
2015-12-06 15:38:36.339 iOS-Socket-C-Version-Client[9709:4234848] receive message from server: Hello, server, how are you?
2015-12-06 15:38:36.339 iOS-Socket-C-Version-Client[9709:4234848] 發(fā)送成功
2015-12-06 15:38:36.355 iOS-Socket-C-Version-Client[9709:4234848] receive message from server: Hello, server, how are you?
2015-12-06 15:38:36.356 iOS-Socket-C-Version-Client[9709:4234848] 發(fā)送成功
2015-12-06 15:38:36.366 iOS-Socket-C-Version-Client[9709:4234848] receive message from server: Hello, server, how are you?
2015-12-06 15:38:36.366 iOS-Socket-C-Version-Client[9709:4234848] 發(fā)送成功
2015-12-06 15:38:36.372 iOS-Socket-C-Version-Client[9709:4234848] receive message from server: Hello, server, how are you?
2015-12-06 15:38:36.373 iOS-Socket-C-Version-Client[9709:4234848] 發(fā)送成功
2015-12-06 15:38:36.392 iOS-Socket-C-Version-Client[9709:4234848] receive message from server: Hello, server, how are you?

1.2 UDP Socket服務(wù)器端

服務(wù)器端的工作流程:首先調(diào)用socket
函數(shù)創(chuàng)建一個套接字贴届,然后調(diào)用bind
函數(shù)將其與本機地址以及一個本地端口號綁定靠粪,接收到一個客戶端時,服務(wù)器顯示該客戶端的IP地址毫蚓,并將字串返回給客戶端占键。
筆者這里分成了五步:
第一步:創(chuàng)建socket
并配置socket

第二步:調(diào)用bind
綁定服務(wù)器本機ip及端口號
第三步:調(diào)用recvfrom
接收來自客戶端的消息
第四步:調(diào)用sendto
將接收到服務(wù)器端的信息返回給客戶端
第四步:調(diào)用close
關(guān)閉socket

1.2.1 服務(wù)器端代碼實現(xiàn)

- (void)udpServer {
  int serverSockerId = -1;
  ssize_t len = -1;
  socklen_t addrlen;
  char buff[1024];
  struct sockaddr_in ser_addr;
  
  // 第一步:創(chuàng)建socket
  // 注意,第二個參數(shù)是SOCK_DGRAM元潘,因為udp是數(shù)據(jù)報格式的
  serverSockerId = socket(AF_INET, SOCK_DGRAM, 0);
  
  if(serverSockerId < 0) {
    NSLog(@"Create server socket fail");
    return;
  }
  
  addrlen = sizeof(struct sockaddr_in);
  bzero(&ser_addr, addrlen);
  
  ser_addr.sin_family = AF_INET;
  ser_addr.sin_addr.s_addr = htonl(INADDR_ANY);
  ser_addr.sin_port = htons(1024);
  
  // 第二步:綁定端口號
  if(bind(serverSockerId, (struct sockaddr *)&ser_addr, addrlen) < 0) {
    NSLog(@"server connect socket fail");
    return;
  }
  
  do {
    bzero(buff, sizeof(buff));
    
    // 第三步:接收客戶端的消息
    len = recvfrom(serverSockerId, buff, sizeof(buff), 0, (struct sockaddr *)&ser_addr, &addrlen);
    // 顯示client端的網(wǎng)絡(luò)地址
    NSLog(@"receive from %s\n", inet_ntoa(ser_addr.sin_addr));
    // 顯示客戶端發(fā)來的字符串
    NSLog(@"recevce:%s", buff);
    
    // 第四步:將接收到的客戶端發(fā)來的消息畔乙,發(fā)回客戶端
    // 將字串返回給client端
    sendto(serverSockerId, buff, len, 0, (struct sockaddr *)&ser_addr, addrlen);
  } while (strcmp(buff, "exit") != 0);
  
  // 第五步:關(guān)閉socket
  close(serverSockerId);
}

1.2.2 服務(wù)器端的打印日志

2015-12-06 15:38:36.268 iOS-Socket-C-Version-Server[39130:2473780] receive from 192.168.1.100
2015-12-06 15:38:36.269 iOS-Socket-C-Version-Server[39130:2473780] recevce:Hello, server, how are you?
2015-12-06 15:38:36.372 iOS-Socket-C-Version-Server[39130:2473780] receive from 192.168.1.100
2015-12-06 15:38:36.372 iOS-Socket-C-Version-Server[39130:2473780] recevce:Hello, server, how are you?
2015-12-06 15:38:36.377 iOS-Socket-C-Version-Server[39130:2473780] receive from 192.168.1.100
2015-12-06 15:38:36.377 iOS-Socket-C-Version-Server[39130:2473780] recevce:Hello, server, how are you?
2015-12-06 15:38:36.382 iOS-Socket-C-Version-Server[39130:2473780] receive from 192.168.1.100
2015-12-06 15:38:36.382 iOS-Socket-C-Version-Server[39130:2473780] recevce:Hello, server, how are you?
2015-12-06 15:38:36.405 iOS-Socket-C-Version-Server[39130:2473780] receive from 192.168.1.100
2015-12-06 15:38:36.405 iOS-Socket-C-Version-Server[39130:2473780] recevce:Hello, server, how are you?
2015-12-06 15:38:36.409 iOS-Socket-C-Version-Server[39130:2473780] receive from 192.168.1.100
2015-12-06 15:38:36.410 iOS-Socket-C-Version-Server[39130:2473780] recevce:Hello, server, how are you?
2015-12-06 15:38:36.414 iOS-Socket-C-Version-Server[39130:2473780] receive from 192.168.1.100
2015-12-06 15:38:36.415 iOS-Socket-C-Version-Server[39130:2473780] recevce:Hello, server, how are you?
2015-12-06 15:38:36.425 iOS-Socket-C-Version-Server[39130:2473780] receive from 192.168.1.100
2015-12-06 15:38:36.426 iOS-Socket-C-Version-Server[39130:2473780] recevce:Hello, server, how are you?
2015-12-06 15:38:36.441 iOS-Socket-C-Version-Server[39130:2473780] receive from 192.168.1.100
2015-12-06 15:38:36.441 iOS-Socket-C-Version-Server[39130:2473780] recevce:Hello, server, how are you?
2015-12-06 15:38:36.452 iOS-Socket-C-Version-Server[39130:2473780] receive from 192.168.1.100
2015-12-06 15:38:36.452 iOS-Socket-C-Version-Server[39130:2473780] recevce:Hello, server, how are you?
2015-12-06 15:38:36.472 iOS-Socket-C-Version-Server[39130:2473780] receive from 192.168.1.100
2015-12-06 15:38:36.473 iOS-Socket-C-Version-Server[39130:2473780] recevce:Hello, server, how are you?

我們這里打印出了客戶端發(fā)來的消息,由于上面實現(xiàn)的代碼中翩概,只發(fā)10次牲距,所以這里只有10條返咱。
源代碼小伙伴們,可以到github下載了:https://github.com/CoderJackyHuang/iOS-Socket-C-Version
注意:這里面有兩個工程牍鞠,一個是客戶端咖摹,一個是服務(wù)器端。運行時难述,先運行服務(wù)器端萤晴,然后再選擇客戶端。另外胁后,客戶端所指定的服務(wù)器端的ip地址一定要修改成您本機對應(yīng)的ip店读,不然使用筆者這里的ip就會失敗。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末攀芯,一起剝皮案震驚了整個濱河市屯断,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌敲才,老刑警劉巖裹纳,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異紧武,居然都是意外死亡,警方通過查閱死者的電腦和手機敏储,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門阻星,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人已添,你說我怎么就攤上這事妥箕。” “怎么了更舞?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵畦幢,是天一觀的道長。 經(jīng)常有香客問我缆蝉,道長宇葱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任刊头,我火速辦了婚禮黍瞧,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘原杂。我一直安慰自己印颤,他們只是感情好,可當我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布穿肄。 她就那樣靜靜地躺著年局,像睡著了一般际看。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上矢否,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天仲闽,我揣著相機與錄音,去河邊找鬼兴喂。 笑死蔼囊,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的衣迷。 我是一名探鬼主播畏鼓,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼壶谒!你這毒婦竟也來了云矫?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤汗菜,失蹤者是張志新(化名)和其女友劉穎让禀,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體陨界,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡巡揍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了菌瘪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片腮敌。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖俏扩,靈堂內(nèi)的尸體忽然破棺而出糜工,到底是詐尸還是另有隱情,我是刑警寧澤录淡,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布捌木,位于F島的核電站,受9級特大地震影響嫉戚,放射性物質(zhì)發(fā)生泄漏刨裆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一彼水、第九天 我趴在偏房一處隱蔽的房頂上張望崔拥。 院中可真熱鬧,春花似錦凤覆、人聲如沸链瓦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽慈俯。三九已至渤刃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間贴膘,已是汗流浹背卖子。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留刑峡,地道東北人洋闽。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像突梦,于是被迫代替她去往敵國和親诫舅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,086評論 2 355

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

  • 最近在學(xué)習Python看了一篇文章寫得不錯宫患,是在腳本之家里的刊懈,原文如下,很有幫助: 一娃闲、網(wǎng)絡(luò)知識的一些介紹 soc...
    qtruip閱讀 2,717評論 0 6
  • 即時通訊系列之Socket簡介 一虚汛、Socket連接 1.連接過程 建立Socket連接至少需要一對套接字,其中一...
    音符上的碼字員閱讀 1,100評論 0 5
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理皇帮,服務(wù)發(fā)現(xiàn)卷哩,斷路器,智...
    卡卡羅2017閱讀 134,672評論 18 139
  • 29.1 引言 本章中我們要討論另一個常用的應(yīng)用程序:NFS(網(wǎng)絡(luò)文件系統(tǒng))属拾,它為客戶程序提供透明的文件訪問殉疼。NF...
    張芳濤閱讀 982評論 0 4
  • 佚名 取一抹七色云霞 和一曲霓裳舞罷 驚鴻初見,若曾相識引思遐 ...
    13號男生閱讀 250評論 0 0