热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

网络通信_两种网络通信架构:socket与RPC

篇首语:本文由编程笔记#小编为大家整理,主要介绍了两种网络通信架构:socket与RPC相关的知识,希望对你有一定的参考价值。客户端与服务器的沟通是网络游戏的根

篇首语:本文由编程笔记#小编为大家整理,主要介绍了两种网络通信架构:socket与RPC相关的知识,希望对你有一定的参考价值。



客户端与服务器的沟通是网络游戏的根基。一个网络游戏,大部分业务需求都会涉及网络通信,而事实上在开发团队中,却只有少部分开发者真正处理过网络通信逻辑。因为网络通信逻辑总是被封装在框架的底层,处理业务的程序猿只需调用网络工程狮提供的接口即可达成所有的需求。而程序猿与工程狮的隔阂也由此拉开。

这篇文章将从实现Unity客户端网络通信功能出发,介绍网络通信的两种架构一一Socket与RPC。这里观点均来自我收集的网络资源整理,也有部分是我的个人感悟,不保证完全正确,欢迎讨论。

转载请说明出处。

文章的结构如下图所示,你可以根据自己的兴趣点选择阅读。



  • Socket的使用


  • 关于线程Thread


  • socket百科


  • socket的设计理念及实现


  • NetworkView.rpc


  • UNet


  • RPC百科


  • RPC的设计理念及实现


  • socket与RPC的架构对比



Socket的使用



如前文所说,这篇文章将从实现Unity3D客户端的网络通信着手,这里将使用C#语言。

了解下面这些信息后,你即可实现基本的网络通信功能:



  1. C#语言在System.Net.Sockets命名空间中提供了一个Socket类。


  2. 使用Socket.Connect(IPEndPoint endPoint)方法可与指定IP的远程主机建立连接。


  3. 使用Socket.Send(byte[] message)方法可发送字节消息。


  4. 使用Socket.Receive(byte[] message)方法可接受字节消息。


至此,一个客户端的简易网络通信功能就已经完成。



若想了解服务器端的处理,请参考:


C#socket通信 - 码农来了 - 博客园


https://www.cnblogs.com/sdyinfang/p/5519708.html



关于线程Thread



线程与网络通信没有直接关系,放在这篇文章中的主要目的是因为网络通信通常被放到单独的线程中,也是为了章节排版的对称。

了解下面这些信息后,你即可实现基本的多线程功能:



  1. C#语言在System.Threading命名空间中提供了一个Thread类。


  2. 使用Thread.Start()方法即可开启一个新的线程。


那么,为什么网络通信功能通常都被放到单独的线程中呢?

原来这是因为,C#提供的socket架构的机制是同步的。就是说,线程执行到发送协议,将挂起,等待服务器端执行完毕,才开始执行下一行。

这样问题就变的很明显,产品的流畅度会被网速限制。

为了防止游戏在网速缓慢的情况下被影响而卡顿,大多数游戏项目的客户端选择了将网络通信功能放在单独的线程中,即,除了游戏的主线程之外,还会有一个发送协议的线程,和一个接受协议的线程。

但这样的做法也并非是一个强制选项。我猜测,市面上有些主流产品就是单线程。我猜测的依据在于,使用产品发送协议时,屏幕被锁死,出现网络加载图标,知道网络加载完成,才可以开始下一步操作。这是大概是因为,这些产品自身进行网络通信不比游戏那样频繁,且通信的内容对于下一步操作非常重要。


socket百科



阅读到这里,你已经会使用socket了。

可是,socket究竟是什么?

网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。

建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。



若想了解更多,请参考:


socket(计算机专业术语)_百度百科


https://baike.baidu.com/item/socket/281150?fr=aladdin



socket的设计理念及实现



socket并不是一种协议,是在程序员层面上对TCP/IP协议的封装和应用。其实是一个调用接口,方便程序员使用TCP/IP协议栈而已。程序员通过socket来使用tcp/ip协议。但是socket并不是一定要使用tcp/ip协议,Socket编程接口在设计的时候,就希望也能适应其他的网络协议。



若想了解更多,请参考:


C# Socket网络编程精华篇 - 微冷的雨 - 博客园


http://www.cnblogs.com/weilengdeyu/archive/2013/03/08/2949101.html


Socket实现 - kakawater - 博客园


https://www.cnblogs.com/kakawater/p/7085122.html



NetworkView.rpc



依旧是从实现Unity3D客户端的网络通信着手,使用C#语言。

了解下面这些信息后,你即可实现基本的网络通信功能:



  1. Unity游戏引擎提供了一个NetworkView组件。


  2. 使用Network.Connect可与指定IP的远程主机建立连接。


  3. 调用NetworkView.RPC方法即可调用到远程主机上的函数。


  4. 有[RPC]标签的函数才可被远程调用。




若想了解更多,请参考:


Unity - Scripting API: NetworkView.RPC


https://docs.unity3d.com/ScriptReference/NetworkView.RPC.html



UNet



也许你已经注意到Unity官方提供的API上关于NetworkView.rpc打上了这个提示"Method group is Obsolete"。Unity的版本更新迭代比较快,且版本差异比较大,经常修复重要BUG,或做框架调整。本来想好好研究下UNet,结果也看到一个提示"this API is experimental and might be changed or removed in the future."。



若想了解更多,请参考:


Unity - Scripting API: UNetUpdate


https://docs.unity3d.com/ScriptReference/Experimental.PlayerLoop.PreLateUpdate.UNetUpdate.html



RPC百科



不管Unity的版本如何迭代,可以看出它始终会提供一个RPC的架构,尽管使用的方法千变万化。

那么,RPC究竟是什么呢?

RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。

RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。



若想了解更多,请参考:


远程过程调用协议_百度百科


https://baike.baidu.com/item/%E8%BF%9C%E7%A8%8B%E8%BF%87%E7%A8%8B%E8%B0%83%E7%94%A8%E5%8D%8F%E8%AE%AE/6893245?fromtitle=RPC&fromid=609861&fr=aladdin



RPC的设计理念及实现



RPC 这个概念术语在上世纪 80 年代由 Bruce Jay Nelson 提出。这里我们追溯下当初开发 RPC 的原动机是什么?在 Nelson 的论文 "Implementing Remote Procedure Calls" 中他提到了几点:



  1. 简单:RPC 概念的语义十分清晰和简单,这样建立分布式计算就更容易。


  2. 高效:过程调用看起来十分简单而且高效。


  3. 通用:在单机计算中过程往往是不同算法部分间最重要的通信机制。


通俗一点说,就是一般程序员对于本地的过程调用很熟悉,那么我们把 RPC 作成和本地调用完全类似,那么就更容易被接受,使用起来毫无障碍。Nelson 的论文发表于 30 年前,其观点今天看来确实高瞻远瞩,今天我们使用的 RPC 框架基本就是按这个目标来实现的。



若想了解更多,请参考:


深入浅出 RPC - 浅出篇 - CSDN博客


https://blog.csdn.net/mindfloating/article/details/39473807


深入浅出 RPC - 深入篇 - CSDN博客


https://blog.csdn.net/mindfloating/article/details/39474123


RPC架构简单理解 - ChrisMurphy - 博客园


https://www.cnblogs.com/ChrisMurphy/p/6550184.html



socket与RPC的架构对比



socket作为“套接字”它传输的是远程数据;而RPC是在socket的基础上实现的,他传递的是远程过程(即函数方法)。



转载请说明出处

欢迎讨论!欢迎指正!



推荐阅读
  • CEPH LIO iSCSI Gateway及其使用参考文档
    本文介绍了CEPH LIO iSCSI Gateway以及使用该网关的参考文档,包括Ceph Block Device、CEPH ISCSI GATEWAY、USING AN ISCSI GATEWAY等。同时提供了多个参考链接,详细介绍了CEPH LIO iSCSI Gateway的配置和使用方法。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 本文介绍了一些Java开发项目管理工具及其配置教程,包括团队协同工具worktil,版本管理工具GitLab,自动化构建工具Jenkins,项目管理工具Maven和Maven私服Nexus,以及Mybatis的安装和代码自动生成工具。提供了相关链接供读者参考。 ... [详细]
  • 嵌入式处理器的架构与内核发展历程
    本文主要介绍了嵌入式处理器的架构与内核发展历程,包括不同架构的指令集的变化,以及内核的流水线和结构。通过对ARM架构的分析,可以更好地理解嵌入式处理器的架构与内核的关系。 ... [详细]
  • 分享css中提升优先级属性!important的用法总结
    web前端|css教程css!importantweb前端-css教程本文分享css中提升优先级属性!important的用法总结微信门店展示源码,vscode如何管理站点,ubu ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • Monkey《大话移动——Android与iOS应用测试指南》的预购信息发布啦!
    Monkey《大话移动——Android与iOS应用测试指南》的预购信息已经发布,可以在京东和当当网进行预购。感谢几位大牛给出的书评,并呼吁大家的支持。明天京东的链接也将发布。 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 禁止程序接收鼠标事件的工具_VNC Viewer for Mac(远程桌面工具)免费版
    VNCViewerforMac是一款运行在Mac平台上的远程桌面工具,vncviewermac版可以帮助您使用Mac的键盘和鼠标来控制远程计算机,操作简 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
author-avatar
河南王修华
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有