Socket网络编程入门
Socket:专业术语:套接字;通俗的解释:两孔插座(一个孔:IP地址,一个孔:端口号).使用场景:通信,如QQ好友交谈,如浏览器的进程怎么与web服务器通信等.
Socket来历:
socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。
其中,这些socket函数的介绍请看这里:吴秦(Tyler)Socket编程
在组网领域的首次使用是在1970年2月12日发布的文献IETF RFC33中发现的,撰写者为Stephen Carr、Steve Crocker和Vint Cerf。根据美国计算机历史博物馆的记载,Croker写道:"命名空间的元素都可称为套接字接口。一个套接字接口构成一个连接的一端,而一个连接可完全由一对套接字接口规定。”计算机历史博物馆补充道:"这比BSD的套接字接口定义早了大约12年。
通过上面,我们知道了socket(套接字)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元,多个TCP连接或多个应用程序进程可能需要通过同一个TCP协议端口传输数据。为了区别不同的应用程序进程和连接,计算机操作系统为应用程序与TCP/IP协议交互提供了套接字(Socket)接口。应用层可以和传输层通过Socket接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket,另一个运行于服务器端,称为ServerSocket。套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。Socket可以支持不同的传输层协议(TCP或UDP),当使用TCP协议进行连接时,该Socket连接就是一个TCP连接,UDP连接同理。
网络七层协议:
网络七层协议由下往上分别为物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。其中物理层、数据链路层和网络层通常被称作媒体层,是网络工程师所研究的对象;传输层、会话层、表示层和应用层则被称作主机层,是用户所面向和关心的内容。
HTTP协议对应于应用层,TCP协议对应于传输层,IP协议对应于网络层,HTTP协议是基于TCP连接的,三者本质上没有可比性。 TCP/IP是传输层协议,主要解决数据如何在网络中传输;而HTTP是应用层协议,主要解决如何包装数据。Socket是应用层与TCP/IP协议族通信的中间软件抽象层,是它的一组接口。
其图示如下:

而其中TCP,UDP协议的区别如下:

而,建立TCP连接需要经过"三次握手",断开连接需要"四次握手".这就是当初大学天天背诵而不知干嘛的"三次握手,四次分手"原则(至今也才懵懵懂懂).
  
Socket通信就是依靠这完成的,其中通讯示意图如:

以上就是一些基本的知识点,下面写一个小demo演示下:
//
// ViewController.m
// Socket入门
//
// Created by Shaoting Zhou on 2017/4/17.
// Copyright © 2017年 Shaoting Zhou. All rights reserved.
// nc -lk 12345 监听12345端口 #import "ViewController.h"
#import <sys/socket.h>
#import <netinet/in.h>
#import <arpa/inet.h> @interface ViewController () @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
[self socketDemo];
} //MARK : Socket演练
- (void)socketDemo {
//1.创建Socket
/**
参数 domain: 协议域,AF_INET --> IPV4
type: Socket 类型,SOCK_STREAM(TCP)/SOCK_DGRAM(UDP)
protocol: IPPROTO_TCP, 如果传入0,会自动更具第二个参数,选择合适的协议 返回值
socket
*/
int clientSocket = socket(AF_INET, SOCK_STREAM, 0);
//2.连接到服务器
/**
参数
1> 客户端socket
2> 指向数据结构体sockaddr的指针,其中包括目的端口和IP地址
3> 结构体数据长度
返回值
0 成功/其他 错误代号
*/
//结构体 sockaddr
struct sockaddr_in serverAddr;
//协议域
serverAddr.sin_family = AF_INET;
//端口号
serverAddr.sin_port = htons(12345); //定义一个端口号演示
//IP地址
serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); int connResult = connect(clientSocket, (const struct sockaddr *)&serverAddr , sizeof(serverAddr));
//3.发送数据给服务器
/** C语言里面 Void * 代表指向任意类型
参数
1> 客户端socket
2> 发送内容地址(指针)
3> 发送内容长度
4> 发送方式标志,一般为0
返回值
如果成功,则返回发送的字节数,失败则返回SOCKET_ERROR
*/
NSString * sendMsg = @"shaoting"; //随意定义一个字符串演示 ssize_t sendLen = send(clientSocket, sendMsg.UTF8String, strlen(sendMsg.UTF8String), 0);
NSLog(@"发送了 %ld 个字节",sendLen); //4.从服务器接收数据
/**
参数
1> 客户端socket
2> 接收内容缓冲区地址(指针)
3> 接收内容缓存区长度
4> 接收方式,0表示阻塞,必须等待服务器返回数据
返回值
如果成功,则返回读入的字节数,失败则返回SOCKET_ERROR
*/
uint8_t buffer[1024];//空间准备出来 ssize_t recvLen = recv(clientSocket, buffer, sizeof(buffer), 0);
NSLog(@"接收到了 %ld 个字节",recvLen); //获取服务器返回的数据,从缓冲区读取recvLen个字节!!!
NSData * data = [NSData dataWithBytes:buffer length:recvLen];
//二进制转字符串
NSString * str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",str); //5.关闭
close(clientSocket); } @end
首先在终端运行 nc -lk 12345,监听着端口12345,启动Xcode项目,这时会连上本地服务器127.0.0.1,然后就会发送刚才准备的字符串(shaoting),然后还可以从服务器发个消息到客户端.演示效果如:

本文demo地址:https://github.com/pheromone/iOS-Scoket-
当然,大家应该还听说过XMPP协议,这个就是在Scoket基础上得来的.这个是当初学习XMPP的demo地址:https://github.com/pheromone/iOS-XMPPDemo
在此,感谢大神博客 吴白
腾讯课堂某公开课
Socket网络编程入门的更多相关文章
- Linux学习 : Socket 网络编程入门
		
一.socket()函数 int socket(int domain, int type, int protocol); domain:即协议域,又称为协议族(family).常用的协议族有,AF_I ...
 - 脑残式网络编程入门(二):我们在读写Socket时,究竟在读写什么?
		
1.引言 本文接上篇<脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手>,继续脑残式的网络编程知识学习 ^_^. 套接字socket是大多数程序员都非常熟悉的概念,它是计算机 ...
 - [转帖]脑残式网络编程入门(二):我们在读写Socket时,究竟在读写什么?
		
脑残式网络编程入门(二):我们在读写Socket时,究竟在读写什么? http://www.52im.net/thread-1732-1-1.html 1.引言 本文接上篇<脑残式网 ...
 - socket 网络编程高速入门(一)教你编写基于UDP/TCP的服务(client)通信
		
由于UNIX和Win的socket大同小异,为了方便和大众化,这里先介绍Winsock编程. socket 网络编程的难点在入门的时候就是对基本函数的了解和使用,由于这些函数的结构往往比較复杂,參数大 ...
 - Linux Socket 网络编程
		
Linux下的网络编程指的是socket套接字编程,入门比较简单.在学校里学过一些皮毛,平时就是自学玩,没有见识过真正的socket编程大程序,比较遗憾.总感觉每次看的时候都有收获,但是每次看完了之后 ...
 - 脑残式网络编程入门(六):什么是公网IP和内网IP?NAT转换又是什么鬼?
		
本文引用了“帅地”发表于公众号苦逼的码农的技术分享. 1.引言 搞网络通信应用开发的程序员,可能会经常听到外网IP(即互联网IP地址)和内网IP(即局域网IP地址),但他们的区别是什么?又有什么关系呢 ...
 - 脑残式网络编程入门(五):每天都在用的Ping命令,它到底是什么?
		
本文引用了公众号纯洁的微笑作者奎哥的技术文章,感谢原作者的分享. 1.前言 老于网络编程熟手来说,在测试和部署网络通信应用(比如IM聊天.实时音视频等)时,如果发现网络连接超时,第一时间想到的就是 ...
 - 脑残式网络编程入门(四):快速理解HTTP/2的服务器推送(Server Push)
		
本文原作者阮一峰,作者博客:ruanyifeng.com. 1.前言 新一代HTTP/2 协议的主要目的是为了提高网页性能(有关HTTP/2的介绍,请见<从HTTP/0.9到HTTP/2:一文读 ...
 - 脑残式网络编程入门(三):HTTP协议必知必会的一些知识
		
本文原作者:“竹千代”,原文由“玉刚说”写作平台提供写作赞助,原文版权归“玉刚说”微信公众号所有,即时通讯网收录时有改动. 1.前言 无论是即时通讯应用还是传统的信息系统,Http协议都是我们最常打交 ...
 
随机推荐
- SSH服务理论+实践
			
1)远程管理服务知识介绍 SSH远程登录服务介绍说明 01. SSH-Secure Shell Protocol 安全加密shel协议 SSH远程登录服务功能作用 01. 提供类似telnet远程登录 ...
 - Docker Kubernetes 环境搭建
			
Docker Kubernetes 环境搭建 节点规划 版本 系统:Centos 7.4 x64 Docker版本:18.09.0 Kubernetes版本:v1.8 etcd存储版本:etcd-3. ...
 - Python pyYAML模块
			
pyYaml模块 一.pyYAML python也可以很容的处理ymal文档格式,只不过取药安装一个模块. 语法例子 注:主要用来做配置文件. 注:需要下载标准库.
 - server time zone
			
问题原因 由于使用的Mysql数据库驱动版本太高,存在数据库和系统时区差异,所以出问题. 问题解决 Spring Boot配置文件中在url: jdbc:mysql://127.0.0.1:3306/ ...
 - eclipse中svn上传及更新
 - Angular4.x Event (DOM事件和自定义事件)
			
Angular组件和DOM元素通过事件与外部进行通信,两者中的事件绑定语法是相同的-(eventName)="expression": <button (click)=&qu ...
 - mac 安装工具列表
			
1,jdk idea datagrip 2,maven download 3.1idea config maven 3.2 down load myql connector & datagr ...
 - EXCEL VBA——数组,使用数组提升程序效率
			
数组的存在价值就是让代码提速. 数组和非数组的差异只在于数据的保存和读取方式不同,虽然操作这些数据的方法或者函数并没有不同,但是保存与读取上的差异却使VBA代码在处理数据时实现了质的飞跃.在完成相同工 ...
 - 锯齿状优惠券css绘制
			
对于图上优惠券左右两侧的半圆锯齿效果,两种处理方式,一种直接使用切图进行处理,一种是纯css进行效果绘制.切图的就不再赘述,主要说纯css效果绘制 绘制的结果如下图: 难点在于两侧的半圆孔是透明色,不 ...
 - ZZW原创_rsync同步时由于注释问题引起的@ERROR: chdir failed
			
1.需求:A机器同步文件到B机器 2.问题: A机器执行如下命令: [root@sv0379 rsync]# rsync -vzrtopg --password-file=/usr/local/rs ...