如何使数据在客户机和服务器之间传递?

如何使数据在客户机和服务器之间传递?,第1张

我们还是从计算机的网络层说起,主要是分为7个层分别是物理层,数据链路层,网络层,传输层,会话层,表示层,应用层。

数据之间的交互主要在传输层这一块。通常用到的底层协议有TCP和UDP这两种协议。通过中间层SOCKET协议,进行包装,再往上就是我们经常用到的>

>

上面这个就是我们网站的>

同时我们的实时聊天软件,比如今日头条的聊天软件就是通过TCP,SOCKET来进行通信的,这种是面向连接的长链接方式,双向通信。响应指定封包协议和解包协议,通过socket的处理,去监听两端的端口,分别获取各自的数据,和发送各自的数据。实现双向通信。具体过程如下:

>客户端步骤

1创建套接字

2向服务器发送连接请求(connect)

3通信(send/recv)

4关闭套接字

>服务器端步骤

1创建用于监听的套接字(socket)

2将套接字绑定到本地地址和端口上(bind)

3将套接字设为监听模式(listen)

4等待客户请求(accept),此处要不断的调用accept

5通信(send/receive),完成后返回4

6关闭套接字(closesocket)

谢谢阅读,欢迎关注。

(1) 连接 当客户在浏览器上键入或单击一个URL时,客户程序就在网络上搜索定位正确的服务器,并与其连接。
(2) 请求 在连接后,客户程序向服务器发出一个请求,要求服务器向自己发送指定的信息。
(3) 响应 服务器收到请求,就向客户端传回所需要的文件。
(4)关闭 服务器发出数据后,就断开与客户端的连接,以便接受其他客户的连接。

边缘部分的端系统利用核心部分所提供的服务,使众多主机之间能够互相通信并交换或共享信息。
端系统之间的通信方式可以划分为两大类:客户服务器方式和对等方式。这里所说的“主机A和主机B进行通信”,实际上是指:“运行在主机A上的某个程序和运行在主机B上的另一个程序进行通信”。 客户服务器方式在因特网上是最常用的,也是最传统的方式。客户服务器模式是一种分布式系统体系结构。我们在上网发邮件或在网站上查找资料时,都会使用客户服务器方式(有时也写为客户-服务器方式或客户/服务器方式)。
当打电话时,电话振铃声使被叫用户知道有一个电话呼叫。计算机通信的对象是应用层中的应用程序,显然不能用响铃的办法来通知所要找的对方的应用进程。然而采用客户服务器方式可以使两个应用程序能够进行通信。
客户(client)和服务器(server)都是指通信中所涉及的两个应用程序。客户服务器方式描述的是进程之间服务和被服务的关系。这里所说的客户和服务器都指的是计算机进程(软件)。在C/S方式中,请求一方为客户,响应请求一方称为服务器,如果一个服务器在响应客户请求时不能单独完成任务,还可能向其他服务器发出请求,这时,发出请求的服务器就成为另一个服务器的客户。从双方建立联系的方式来看,主动启动通信的应用叫客户,被动等待通信的应用叫服务器。这里最主要的特征就是:客户是服务请求方,服务器是服务提方。
客户与服务器的通信关系建立后,通信可以是双向的,客户和服务器都可以发送和接收数据。 对等连接(peer-to-peer,简写为P2P)是指两个端系统在通信时并不区分哪一个是服务请求方式还是服务提供方式。只要两个主机都运行了对等连接软件(P2P软件),它们就可以进行平等的、对等连接通信。这时,双方都可以下载对方已经存储在硬盘中的共享文档。因此这种工作方式也称为P2P文件共享。如图中,主机C,D,E和F都运行了P2P软件,因此这几个主机都可以进行对等通信(如C何D,E和F,以及C和F)。实际上,对等连接方式从本质上看仍然是使用客户服务器方式,只是对等连接中的每一个主机既是客户又同时是服务器。例如主机C,当C请求D的服务时,C是客户,D是服务器。但如果C又同时向F提供服务,那么C又同时起着服务器的作用。对等连接工作方式可支持大量对等用户(如上百万个)同时工作。

网络之间的数据传递 都可以认为是数据流的传递。具体什么意思呢?所谓协议,说白了 你就是发送一个结构体过去。你定义如下结构体
//定义包头
struct PacketHeader{
int uLen;//包长
int uOpCode;//协议号(项目实战中常规做法。)
};
//定义一个协议。传输 int 变量的值过去。
struct Protrol{
PacketHeader head;//协议头
int nBody; //协议身体,就是我们要传的值。
};
然后发送的时候这么发送:
Protrol a;
anBody = 1;
auLen = sizeof(Protrol );
SendBuffer((const char)&a,auLen);
接收端也是如此,根据Opcode的值,将收到的数据流强制类型转换成Protrol的指针就可以了。
比如收到的buff是:const char szBuff[1024]={0};
const Protrol pMsg = (const Protrol)szBuff;
这样就可以了。pMsg -> nBody ;就是你要的值。
现阶段 你学习到这个程度就够了,以后你就会发现一些问题,比如内存对齐 比如O2优化的问题。
尽管如此 这也是一个常用方法,或许你们教科书就是这么写的。这种方式非常简单。就这样。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10563425.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-09
下一篇 2023-05-09

发表评论

登录后才能评论

评论列表(0条)

保存