(三)即時通訊系列之UDPSocket

即時通訊系列之Socket簡介

轉(zhuǎn)自他人

1. UDP Socket編程

先講一講UDP
編程,因為比TCP
要簡單多了。首先,我們需要明白UDP
是用戶數(shù)據(jù)報協(xié)議,英文名為User Datagram Protocol,它是面向無連接的。
注意:Socket
通信一定有要服務端和客戶端。
1.1 UDP Socket客戶端
客戶端的工作流程:首先調(diào)用socket
函數(shù)創(chuàng)建一個Socket
,然后指定服務端的IP
地址和端口號,就可以調(diào)用sendto
將字符串傳送給服務器端,并可以調(diào)用recvfrom
接收服務器端返回的字符串,最后關(guān)閉該socket。
第一步:創(chuàng)建socket并配置socket,如服務端ip地址和端口號
第二步:調(diào)用sendto發(fā)送消息到服務器端
第三步:調(diào)用recvfrom接收來自服務器端的消息
第四步:調(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ā)送消息到服務端
    // 注意: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ā)送失敗");
    }
    
    // 第三步:接收來自服務端返回的消息
    // 接收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服務器端

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

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

1.2.1 服務器端代碼實現(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)絡地址
    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 服務器端的打印日志

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
注意:這里面有兩個工程,一個是客戶端,一個是服務器端。運行時,先運行服務器端,然后再選擇客戶端。另外,客戶端所指定的服務器端的ip地址一定要修改成您本機對應的ip,不然使用筆者這里的ip就會失敗。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容