Unity 网络连接协议总结

Tcp同步连接


Tcp同步连接介绍

Tcp协议作为稳定协议,在消息发送前必须完成客户端连接,且客户端连接在Tcp协议中只能是一对一的,即如果有ABC三个连接,那个A连接与B连接如果相互连接,则A与C之间则无法互相通信,只能由A接受到消息时创建出额外的D连接,然后由D与C相互通信

同步作为与异步区分的概念,同步即线程执行到发送或等待接受消息的指令时会进入阻塞状态,即暂停执行,直到接收到消息时,线程才会再次开始工作


Tcp客户端

tcp客户端介绍

客户端的概念是作为客机向主机连接的通信通道,客户端不需要绑定IP和端口,客户端在创建之后直接向服务器发送连接申请,成功连接后即可作为单向的消息的收发通道,客户端的代码中不需要存在自己的IP及端口号,只需要存在需要连接的主机和端口号即可

创建Tcp客户端

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

代码的功能为创建一个Tcp协议下的客户端

构造函数的第一个参数为采用IPv4的方式进行网络传输,保持不变即可,偶尔可用IPv6方式

构造函数的第二个参数为采用流的方式传递数据,保持不变即可

构造函数的第三个参数为使用tcp网络传输协议,保持不变即可

Tcp客户端连接服务器

socket.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 12345));

代码的功能为连接服务器主机,这个方法只需要在客户端执行,服务器中不需要使用Connect连接功能,需要注意的是连接的Socket必须要是服务器中已经调用Bind和Listen的Socket

传入的参数为IPEndPoint,声明IpEndPoint则需要传入IpAddress和端口号,IpAddress代表Ip地址,IpAddress.Parse(string)方法为获取指定字符串所指向的IP地址,连接时必须指定特定IP,不能使用IpAddress,Any或其他,IpAddress和开放端口号组成IpEndPoint

Tcp客户端接收消息

byte [] message = new byte[1024];
socket.Receive(message);
string str = Encoding.UTF8.GetString(message);

连接服务器完成后,即可调用Receive方法开始接受,需要注意的是执行的Receive语句时,无论是主线程或是分支线程,都会开始阻塞(暂停执行),直到收到服务器消息为止,所以Receive语句需要写到线程当中,然后在主线程中开启分支线程,在分支线程中执行Receive语句

Receive方法中的参数为byte数组,使用前需要先声明并赋予任意初始值,在Receive方法执行完后byte数组中将包含从服务器中接受到的数据流,需要通过下面的Encoding.UTF8.GetString方法将byte数组传入并返回由数据流转换好的字符串

Tcp客户端发送消息

socket.Send(Encoding.UTF8.GetBytes("客户端发送内容"));

Send方法的参数类型为byte数组,功能是将参数中的byte数组数据流发送到服务器,Encoding.UTF8.GetBytes方法为将传入的String类型的参数专函为byte数组并返回,在这里直接将方法的返回值传入的Send方法的参数中


Tcp服务器

Tcp服务器介绍

tcp服务器并不需要特殊的系统或特殊的硬件

服务器相当于不主动发送连接请求而被动接受连接请求的主机端

与客户端不同的是客户端向服务器申请连接,而服务器则是被动等待客户端的申请

服务器必须要在声明时绑定固定的Ip地址和端口号,这样才能被客户端寻找到

服务器在接收到新的连接申请时,并不会由服务器与其进行连接,而是会生成一个本地客户端与访问服务器的客户端进行一对一连接,客户端发送消息时将发送到服务器生成的本地客户端上

创建Tcp服务器

Socket mainSocket;        
mainSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
mainSocket.Bind(new IPEndPoint(IPAddress.Any,12345));

tcp服务器的声明与客户端的声明相同,但是区别于客户端的方式是服务器必须调用Bind方法绑定固定的IP地址和端口,服务器在声明时IP地址可以传入IPAddress.Any,等同于传入"127.0.0.1"或者自己的Ipv4地址,12345代表服务器部署的端口

Tcp服务器开启监听连接请求

mainSocket.Listen(10);

服务器必须调用Listen代码之后,才能收到来自客户端的连接申请,Listen方法的参数为同时最多可连接到服务器的客户端数量,超出数量的客户端发送连接请求时将返回连接失败

Tcp监听连接请求并生成本地客户端

Socket socket = mainSocket.Accept();

服务器调用Accept方法后,无论是主线程还是分支线程,都将进入阻塞状态(暂停执行),直到收到连接请求后才会继续执行,所以需要将Accept方法写入到分支线程中,然后在主线程开启的分支线程中调用Accept方法.

Accept方法调用后,服务器将为接下来第一个连接进来的客户端生成一个一对一专属的通信客户端作为方法的返回值返回,客户端发送消息时将会由通信客户端进行通信,与服务器将无关

所以通过Accept生成的客户端需要利用List或Dictionary等方式储存起来,供发送信息时使用

Accept方法接受到连接申请并创建本地客户端后,需要新开线程,在线程中用Receive方法队本地客户端进行消息监听处理


客户端示例代码

代码仅供学习演示,未进行异常处理,仅供展示方法功能

using UnityEngine;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;public class SocketScript : MonoBehaviour
{Socket mainSocket;/// <summary>/// 声明客户端并连接服务器/// </summary>void Start(){mainSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);mainSocket.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 12345));Thread thread = new Thread(Listen);thread.Start();}byte [] message = new byte[1024];/// <summary>/// 监听服务器消息并处理/// </summary>void Listen(){while (true){mainSocket.Receive(message);Debug.Log(Encoding.UTF8.GetString(message));}}/// <summary>/// 客户端向服务器发送消息/// </summary>/// <param name="str"></param>void Send(string str){mainSocket.Send(Encoding.UTF8.GetBytes(str));}private void Update(){if (Input.GetKeyDown(KeyCode.Space)){Send("客户端发送测试数据");}}
}

服务器示例代码

代码仅供学习演示,未进行异常处理,仅供展示方法功能

using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using UnityEngine;public class SeverSocketScript : MonoBehaviour
{Dictionary<string,Socket> connectSockets = new Dictionary<string,Socket>();Socket mainSocket;/// <summary>/// 声明服务器并开启接受监听线程/// </summary>void Start(){mainSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);mainSocket.Bind(new IPEndPoint(IPAddress.Any,12345));mainSocket.Listen(10);Thread thread = new Thread(CreatConnectSocket);thread.Start();}/// <summary>/// 接受监听后保存生成的通信客户端,并开启线程监听通信客户端消息/// </summary>void CreatConnectSocket(){while (true){Socket socket = mainSocket.Accept();if (!connectSockets.ContainsKey(socket.RemoteEndPoint.ToString())){connectSockets.Add(socket.RemoteEndPoint.ToString(), socket);Thread thrad = new Thread(() => { ListenNewConnectSocket(socket); });thrad.Start();}}}byte[] bytes = new byte[1024];/// <summary>/// 接受通信客户端消息并对消息进行处理/// </summary>/// <param name="socket"></param>void ListenNewConnectSocket(Socket socket){while (true){socket.Receive(bytes);Debug.Log("接受消息" + Encoding.UTF8.GetString(bytes));socket.Send(Encoding.UTF8.GetBytes("服务器收到测试数据"));Debug.Log("发送消息回执");}}/// <summary>/// 由服务器向全部客户端进行数据广播/// </summary>void Send(){foreach (var socket in connectSockets){socket.Value.Send(Encoding.UTF8.GetBytes("服务器发送测试数据"));Debug.Log("服务器向" + socket.Key + "发送测试数据");}}private void Update(){if (Input.GetKeyDown(KeyCode.Space)){Send();}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/192.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件缺陷的生命周期

参考&#xff1a;Defect/Bug Life Cycle in Software Testing 什么是缺陷 软件缺陷一般被我们叫做Bug。对应的软件缺陷&#xff0c;就是我们所测试的程序中存在的无法正常运行或功能有相关缺陷。 IEEE729-1983对缺陷的标准定义&#xff1a; 从产品内部看&#xff0c;缺陷是…

Java强连通分量(含面试大厂题和源码)

强连通分量&#xff08;Strongly Connected Components, SCCs&#xff09;是图论中的一个概念&#xff0c;主要用于有向图。在有向图中&#xff0c;如果从图中的某个顶点 A 能够到达另一个顶点 B&#xff0c;并且从顶点 B 也能到达顶点 A&#xff0c;则称这两个顶点是强连通的。…

基于快照行情的股票/基金 1分钟 K 线合成指南

1. 概述 由于不同交易所不同资产的交易规则是有差异的&#xff0c;导致不同交易所基于快照行情或逐笔成交合成不同资产1分钟 K 线的计算方法是不同的。 本教程旨在提高 DolphinDB 在具体业务场景下的落地效率&#xff0c;降低 DolphinDB 在实际业务使用中的开发难度。 本教程…

C语言如何使⽤指针?

一、问题 指针变量在初始化以后就可以使⽤和参与操作了&#xff0c;那么就要⽤到对指针变量最常⽤的两个操作符——> * 和 &#xff06; 。 二、解答 这⾥⼜要提到始终贯穿着指针的⼀个符号“ * ”&#xff0c;但是这⾥的“ * ”是作为指针运算符使⽤的&#xff0c;叫做取内…

如何合理利用多个中国大陆小带宽服务器?

我们知道在中国大陆带宽单价非常昂贵&#xff0c;一个1Mbps 带宽的机子一年就得卖好几百人民币&#xff0c;这是不值当的&#xff0c;当然我们可以去低价漂阿里云、腾讯云的轻量服务器&#xff0c;99包年&#xff0c;但是带宽太小很难崩。 所以&#xff0c;我们必须构建一个能够…

linux进阶篇:重定向和管道操作

Linux中的重定向和管道操作 llinux中的三种IO设备&#xff1a; 标准输入&#xff08;STDIN&#xff09;,文件描述符号为&#xff1a;0&#xff0c;默认从键盘获取输入 标准输出&#xff08;STDOUT&#xff09;,文件描述符号位&#xff1a;1&#xff0c;默认输出到显示终端 标准…

5GNR刷题

5G帧结构 5G NR帧结构的基本时间单位是( C ) A) subframe B) slot C) Tc D) symbol 5G无线帧长是多少ms&#xff08;B&#xff09; A) 5 B) 10 C) 20 D) 40 下面哪种子载波间隔是中国移动白皮书中规定必选(B ) A) 15KHz B) 30KHz C) 60KHz D) 120KHz 5G参数集包含哪…

【笔试训练】day5

今天的题&#xff0c;最后一题忘公式了&#xff0c;卡了一会推出来了 1、游游的you 思路&#xff1a; 看清题目意思就行&#xff0c;这里的相邻两个o可以重复算&#xff0c;也就是说&#xff0c;“ooo”算2分。 先算you的得分&#xff0c;再算oo 对了&#xff0c;不开long lo…

git 命令大全(常用)

Git 是一个功能强大的版本控制系统&#xff0c;它提供了大量的命令来执行各种版本控制操作。除了之前提到的添加、查看和修改用户名和邮箱地址的命令外&#xff0c;Git 还有许多其他命令。以下是一些常用的 Git 命令的概述&#xff1a; 接下来☀️☀️公&#x1f437;&#x1…

24年蓝桥杯java-b组

24年蓝桥杯javaB组 蓝桥杯在昨天考完了&#xff0c;结果很不乐观&#xff0c;哎&#xff0c;还是太笨了&#xff0c;脑子确实转的慢&#xff1b;&#x1f625; 本篇博客中解题思路和代码并不一定完全正确&#xff0c;是我和同学们讨论的解答方法&#xff0c;但并未使用官方题…

【python从入门到精通】-- 第五战:函数大总结

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;python从入门到精通&#xff0c;魔法指针&#xff0c;进阶C&#xff0c;C语言&#xff0c;C语言题集&#xff0c;C语言实现游戏&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持创作博文…

Leo赠书活动-24期 【三大层次学习企业架构框架TOGAF】文末送书

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 赠书活动专栏 ✨特色专栏&#xff1a;…

自定义Centos的终端的命令提示符

背景 当我们使用终端登陆Centos时&#xff0c;就自动打开了ssh终端。这个终端的命令提示符一般是这样的&#xff1a; 这个以#号结束的一行字&#xff0c;就是我们说的命令提示符了。 这个是腾讯云的服务器的提示符&#xff0c;可以看到主机名是VM-4-7-centos。 但是这个看起…

MYSQL一条SQL语句的底层执行流程

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是小周同志&#xff0c;25届双非校招生Java选手&#xff0c;很高兴认识大家 &#x1f4d5;学习出处&#xff1a;本文是学自小林coding (xiaolincoding.com) 网站的MYSQL图解篇 &#x1f525;如果感觉博主的文章还不错的…

字符串算法习题分析

目录 1 [POI2006]OKR-Periods of Words2 同构字符串3 Camp Schedule 1 [POI2006]OKR-Periods of Words P3435 [POI2006] OKR-Periods of Words - 洛谷 题目描述 定义 Q Q Q 为 A A A 的周期&#xff0c;当且仅当 Q Q Q 是 A A A 的严格前缀&#xff0c;且 A A A 是 Q Q …

STL库 —— priority_queue 的编写

目录 一、 优先级队列的介绍 二、优先级队列的使用 2.1 建大堆 less 2.2 建小堆 greater 2.3 详解 greater 与 less 三、 priority_queue 的模拟实现 3.1 编写框架 3.2 编写简单函数 3.2 进堆 向上调整 3.3 出堆 向下调整 四、完整代码 一、 优先级队列的介绍 1.…

web轮播图

思路&#xff1a; 例如&#xff1a;有5张轮播的图片&#xff0c;每张图片的宽度为1024px、高度为512px.那么轮播的窗口大小就应该为一张图片的尺寸&#xff0c;即为&#xff1a;1024512。之后将这5张图片0px水平相接组成一张宽度为&#xff1a;5120px,高度依然为&#xff1a;5…

守望先锋2怎么在steam上玩 守望先锋归来steam下载安装

守望先锋2怎么在steam上玩 守望先锋归来steam下载安装 《守望先锋2》是知名游戏开发商暴雪娱乐开发的团队射击游戏。与第一部相比&#xff0c;守望先锋2加入了更多元素和新特性。游戏设定在未来的世界&#xff0c;玩家可以选择不同的英雄&#xff08;heroes&#xff09;加入战…

python聊天室

python聊天室 文章目录 python聊天室chat_serverchat_client使用方式1.局域网聊天2.公网聊天 下面是一个简单的示例&#xff0c;包含了chat_client.py和chat_server.py的代码。 chat_server chat_server.py监听指定的端口&#xff0c;并接收来自客户端的消息&#xff0c;并将消…

35岁+技术人的困境与选择

前言 最近一些大厂的持续裁员事件&#xff0c;让职场年龄焦虑的话题又火热起来了。职场的年龄焦虑是客观存在的事实&#xff0c;这是市场与资本相互作用的必然结果。资本在运作的过程中&#xff0c;肯定是要逐利的&#xff0c;最终也是要趋向于利润最大化的。 因此&#xff0…