socket(掌握环信的前提,也是即时通讯的底层的实现)
2016-09-09 本文已影响2079人
IIronMan
1.Socket简介
- Socket 又称为"套接字",,它与网络相关,学网络必学的一个知识
- 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的每一端都称为一个socket
- 应用程序通过"套接字"向网络发出请求或者答应网络请求
2.网络通信的要素
- 网络上的请求就是通过Socket 来建立连接然后互相通信
- IP地址(网络上主机设备的唯一标识)
- 端号口(定位程序)
<1>用于标示进程的逻辑地址,不同进程的表示
<2>有效端口:0-65535,其中0-1024由系统使用或者保留端口,开发中建议只用1024以上端口 - 传输协议 (用什么样的方式进行交互)
<1>通讯的规则
<2>常见的协议:TCP,UDP
(1)TCP (传输控制协议)
1.建立连接,形成传输数据的通道
2.在连接中进行大数据传输(数据不受限制)
3.通过3次握手完成连接:目的是可靠协议,安全送达
4.必须建立连接效率会稍低
(2)UDP (用户数据报协议)<不需要3次连接>
1.将数据及源和目的封装成数据包中,不需要建立连接
2.每个数据报的大小限制在64k之内
3.因为无需连接,因此是不可靠协议
4.不需要建立连接,速度快
常见的协议:TCP,UDP
3.Socket通信流程图
Socket通信流程图- HTTP 底层是通过socket建立连接通信管道,实现数据传输
- HTTP 是一个TCP的传输协议(方式),它是一个可靠,安全的协议
4.实现Socket服务端监听
- 实现socket 的监听方法
<1>使用C语言实现
<2>使用CocoaAsyncSocket (OC) 第三方框架,内部都是对C的封装
Telnet命令 : telnet host port/telnet 192.168.10.10 5228
Telnet命令是连接服务器上的某个端口对应的服务
<3>讲解一下Socket服务端对客户端请求的处理(以10086为形式来模拟)- 下面是oc命令行来写的
1.在gitHub下载 CocoaAsyncSocket
2.取出来里面的source->GCD
- 下面是oc命令行来写的
3.我们需要建立一个Socket对象
Socket对象4.终端输入来连接服务端,然后敲Enter 来输入一些想要发送给服务器的内容,在JKServeLestening.m进行返回输入的内容,实现自问自答
telnet 192.168.80.102 5228
5.重要的是掌握服务器端接受数据和返回数据的处理
在终端输入 telnet 192.168.80.102 5228 后有个选择,3是退出服务器连接
6.具体的代码都在JKServeLestening类里面自己下载
5.群聊服务器端
- 多个客户连接到服务器
- 当一个客户端发送消息时,服务器转发给其他已经连接的客户端
- 相当于一个群聊的意思
- 我们可以打开多个终端,来进行群聊操作
在返回给用户信息时判断一下就好了
这里有两个比较重要的属性(端口号非常重要)
端口号:当一个手机有多个QQ的时候,为了区分外面的手机给他的两个QQ发送时,用端口号来区分的到底应该发给哪个QQ
/*
//服务器IP地址
@property (atomic, readonly, nullable) NSString *connectedHost;
//端口号
@property (atomic, readonly) uint16_t connectedPort;
*/
/*
服务器这边读取数据
*/
-(void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
{
/*
1.把 NSData 转化我 string
*/
NSString *string = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
//把当前客户端的数据转发给其他客户端
NSLog(@"接收到客户端的数据 = %@",string);
for (GCDAsyncSocket *socket in self.clientSocketS) {
if (socket != sock) {
[socket writeData:data withTimeout:-1 tag:0];
}
}
/*
2.处理请求,返回数据给客户端
*/
#warning 每次读取完数据后,都要调用一次监听数据的方法
[sock readDataWithTimeout:-1 tag:0]; //(客户端有请求就调用下面的方法)
}
6.群聊客户端(和上面的服务器是保持一致的)
- 客户端也需要GCDAsyncSocket对象,挂代理GCDAsyncSocketDelegate
- 里面与服务器连接成功需要监听,读取完数据还需要监听 (否则可能只有一次数据)
[sock readDataWithTimeout:-1 tag:0];
//1.连接到聊天服务器
//1.1创建一个客户端的socket对象
GCDAsyncSocket *clientSocket = [[GCDAsyncSocket alloc]initWithDelegate:self delegateQueue:dispatch_get_global_queue(0, 0)];
self.clientSocket = clientSocket;
//1.2发送链接请求
NSError *error = nil;
[clientSocket connectToHost:@"192.168.80.102" onPort:5228 error:&error];
/*
读取数据
*/
-(void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
{
NSString *string = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",string);
//读完数据也要监听
[sock readDataWithTimeout:-1 tag:0];
}
/*
与服务器连接成功
*/
-(void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port
{
NSLog(@"与服务器连接成功");
//监听读取数据(只有如此才会读取下面方法中的数据)
[sock readDataWithTimeout:-1 tag:0];
}
/*
与服务器断开连接
*/
-(void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err
{
NSLog(@"断开连接= %@",err);
}
7.上面5和6的汇总
- 一个客户端和一个服务器端,你需要把客户端里面的IP改为自己电脑的IP地址,端口 大于1024就好,自己随便设,但是服务器端和客户端要保持一致
下面是代码:在此只是模拟 群聊
服务器端群聊和客户端群聊代码
8.长连接和短连接
-
长连接和短连接其实就是一个连接的保存状态,区别就是连接保存的时间
-
讲解一下:Socket层上的协议(Http协议与XMPP协议都是定义数据传输格式)
<1>Socket是层上的协议,指的是数据传输的格式
<2>Http协议其实是它就是定义在网络上传输的数据格式,双方互相约束,也是数据传输的格式 -
XMPP协议,是一款即时通讯协议
<1>可扩展消息处理现场的协议,是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线探测,这个协议可能最终允许因特网用户向因特网其他任何人发送即时消息 -
具体的分析一下下面的协议
-
以写一封信为标准:
** TCP/UDP (传输方式 ) ->EMS/申通/圆通**
HTTP/XMPP(数据传输格式) ->>新的内容格式 (中文或,英文)
9.简述即时通讯
- 即时通讯,又称实时通讯
- 即时通讯(Instant MessageIng,简称IM) 是一个实时通信系统,允许两人或者多人使用网络实时的传递文字消息,文件,语音与视频交流
- 即时通讯在开发中使用的场景
<1>开发一个类似于微信,QQ,易信的聊天软件
<2>在电商APP集成买家和卖家的实时沟通等等 - 当前时下,实现即时通讯的方案
<1> XMPP(开源的即时通讯)
<2> 环信
- XMPP协议是一个即时通讯的协议,在网络上传输的数据格式是XML,它是通过TCP/IP连接到服务器.
综述:环信是在XMPP上的的二次开发