2.22 网络基础

来源:互联网 发布:csdn黑马程序员 编辑:程序博客网 时间:2024/06/06 07:25
day22 网络基础
一,网络协议
1,概念:
网络协议即网络中传递、管理信息的一些规范,在计算机之间的相互通信需要共同遵守一 定的规则,这些规则就称为网络协议。

2,TCP/IP
TCP/IP不是一个协议,而是一个协议簇的统称,里面包含TCP协议IP协议, UDP协议,以及 http、FTP等。之所以命名为TCP/IP协议,因为TCP,IP协议是两个很重要的协议,所以以TCP/IP 命名。

3,TCP/IP协议的四层参考模型
应用层: 应用程序间沟通的层,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议 (Telnet),以及超文本传输协议(http) 等。 传输层: 在此层中,它提供了节点间的数据传送服务,如传输控制协议(TCP)、用户数据报协议(UDP) 等,TCP和UDP给数据包加入传输数据并把它传输到下一层中,这一层负责传送数据,并且确定数据 已被送达并接收。 互连网络层: 负责提供基本的数据封包传送功能,让每一块数据包都能够到达目的主机(但不检查是否被正确接 收),如网际协议(IP)。 网络接口层: 对实际的网络媒体的管理,定义如何使用实际网络来传送数据.

4,什么是长连接和短连接
长连接: 是客户端与服务器建立连接后,进行业务报文的收发,始终保持连接状态,在没有报文收发的情况 下,可以使用心跳包来确认连接状态的保持,很多移动端游戏类型都采用长连接,例如RPG,SLG, ACT等需要即时交互的游戏类型,使用TCP长连接协议。
短连接: 是客户端与服务器需要进行报文交互时进行连接,交互完毕后断开连接。例如在某种推图游戏对战 回合中,进行不联网的单机计算,当在本关卡结束时再联机交互结算报文,所以例如卡牌,回合制 还有例如页游等使用http短连接协议。

5,TCP
TCP(Transmission Control Protocol,传输控制协议)是面向连接的协议, 在收发数据前,必须和 对方建立可靠的连接。 客户端主机和服务器经过三次握手进行链接简单描述如下: 第一次,客户端向服务器发送连接请求。 第二次 服务器做出收到请求和允许发送数据的应答。 第三次客户端再次送一个确认应答,表示现在开始传输数据了。

6,UDP协议
UDP协议使用IP层提供的服务把从应用层得到的数据从一台主机的某个应用程序传给网络上另一台主 机上的某一个应用程序UDP协议有如下的特点: 1、UDP传送数据前并不与对方建立连接,即UDP是无连接的,在传输数据前,发送方和接收方相互 交换信息使双方同步。 2、UDP不对收到的数据进行排序,在UDP报文的头中并没有关于数据顺序的信息(如TCP所采用的 序号),而且报文不一定按顺序到达的,所以接收端无从排起。 3、UDP对接收到的数据报不发送确认信号,发送端不知道数据是否被正确接收,也不会重发数据。 4、UDP传送数据较TCP快速,系统开销也少。 总结: 从以上特点可知,UDP提供的是无连接的、不可靠的数据传送方式,是一种尽力而为的数据交互服 务,而TCP是长连接,较可靠的网络协议。

二,Socket套接字
1,Socket概念
Socket本质是对TCP/IP封装的编程接口(API),使得程序员更方便地使用TCP/IP协议。Socket类提 供了各种网络连接,接收数据,发送数据等相关方法给程序开发人员使用
2,Socket类常用方法
BeginConnect() 开始一个对远程主机连接的异步请求
BeginReceive() 开始异步接收数据
BeginSend() 开始异步发送数据
Connect() 建立与远程主机的连接
Send() 将数据发送到连接
Receive() 接收数据到缓冲区
EndConnect() 结束异步连接请求
EndReceive() 结束异步接收
EndSeed() 结束异步发送
Close() 关闭socket连接和释放所有关联

三,Protocolbuffer语法和使用
1,protocolbuffer是什么?
protocolbuffer也叫Googlebuffer,protobuf,它是谷歌的数据交换格式,独立于语言,原生支 持Java,c++ ,python 等语言,一种高效率和优秀兼容性的二进制数据传输格式,使用第三方工 具可以良好支持C#语言,由于它独立于语言和平台,可以在unity客户端和c++服务器,或 python服务器之间进行良好交互,故而是目前unity移动端网络游戏开发的主流数据交互协议。

2,Protobuf和XML, JSON 比较具备以下优势和缺点:
相对于XML来说,protobuf具有以下优势:
<1>更加简单
<2>小3-10倍
<3>快20-100倍
<4>歧义更少,生成数据访问类更加简单
而相对于JSON来说,protobuf也有比较明显的优势:
<1>更好的前后数据兼容性
<2>业务字段容易扩展
<3>不同语言间交互更好 缺点: 二进制编码与传输,可读性较差 编码与解码依赖于额外的库 缺乏自描述

3,基本语法
定义消息 message 关键字:
message c2s_login_game_request
{ required string account = 1;
required string password = 2; }

4,分配标识号:
<1> 正如上述文件格式,在消息定义中,每个字段都有唯一的一个标识符。这些标识符是用 来在消息的二进制格式中识别各个字段的,一旦开始使用就不能够再改变。
<2>最小的标识号可以从1开始,最大到2^229 - 1(2的229次方), or 536,870,911。
<3>不可以使用其中的[19000-19999]的标识号, Protobuf协议实现中对这些进行了预留。 如果非要在.proto文件中使用这些预留标识号,编译时就会报警。

5,字段关键字:
Package: 包定义,名空间。
required: 表示该值是必须要设置的。
optional: 可选字段,消息格式中该字段可以有0个或1个值(不超过1个)。
repeated: 重复的值的顺序会被保留,表示该值是一个集合。 注释: Proto文件可以使用//注释不需要编译的内容。

6,导入定义: 如果想要使用的消息类型已经在其他.proto文件中已经定义过,你可以通过导入其他的.proto文 件中的定义来使用它们。 使用以下写法导入定义: import " myproject/other.proto " ;

7,使用课纲提供的批处理工具快速生成.cs文件
第一步:将proto文件放入工具proto文件夹
第二步:点击CreatCsharp批处理
第三步: 打开CS文件夹获取自动生成的.cs文件

8,序列化与反序列
序列化proto数据参考代码:
public static byte[] Serialize(IExtensible msg)
{
byte[] result; using (var stream = new MemoryStream())
{
Serializer.Serialize(stream, msg); result = stream.ToArray();
}
return result;
}

反序列化参考代码:
public static T Deserialize(byte[] message)
{
T result; using (var stream = new MemoryStream(message))
{
result = Serializer.Deserialize(stream);
}
return result;
}