Socket同步通讯

news2024/11/17 2:45:23

目录

引言

1. 建立连接

2. 数据传输

3. 同步机制

4. 处理延迟

5. 安全性

6、一对一Socket同步通讯

客户端

代码分析

服务端

代码分析

7、服务端操作

1、首先我们先运行客户端代码

2、服务端点击Connect连接客户端

3、服务端输入信息传输到客户端

4、断开连接


引言

  • 虚拟现实(VR)技术的崛起为人们提供了沉浸式的体验,但要实现多用户共享虚拟环境或远程指导等功能,就需要采用有效的通信机制,其中 socket 同步通讯是一种常见的方法。本文将详细解析虚拟现实中的 socket 同步通讯,涵盖建立连接、数据传输、同步机制、处理延迟和安全性等方面的内容。

1. 建立连接

在虚拟现实中,通常使用 TCP(传输控制协议)或 UDP(用户数据报协议)来建立连接。TCP 提供可靠的、面向连接的通信,适合对数据完整性要求较高的场景,如文件传输。而 UDP 更适合对实时性要求较高的场景,如语音通话和视频流。在建立连接阶段,客户端和服务器端需要进行握手,以确保双方能够正常通信。

2. 数据传输

一旦连接建立,虚拟环境中的数据就可以通过 socket 进行传输。这些数据包括用户位置、姿态、手势、视角、声音等信息。对于实时性要求较高的数据,如用户位置和姿态,通常使用 UDP 进行传输,以确保低延迟和快速响应。而对于对数据完整性要求较高的数据,如文件传输或大规模数据同步,通常使用 TCP。

3. 同步机制

在多用户共享虚拟环境的场景中,需要采用同步机制来确保不同设备或用户之间的虚拟环境保持一致性。常见的同步机制包括时间戳同步、帧同步和插值。时间戳同步用于将不同设备的时间进行同步,以确保事件的发生顺序一致。帧同步用于确保不同设备上的渲染帧率一致,以避免画面卡顿或抖动。插值则用于平滑处理不同设备之间的数据差异,以提供更流畅的体验。

4. 处理延迟

在 VR 中,延迟是一个关键问题,因为高延迟会导致用户体验下降甚至晕眩。为了降低延迟,可以采取多种技术,如预测性渲染、数据压缩、网络优化和分布式计算等。预测性渲染用于预测用户的行为,并提前渲染可能的场景,以减少用户操作和画面呈现之间的延迟。数据压缩用于减小数据包的大小,从而减少传输延迟。网络优化则用于优化网络路径和传输速度,以提高数据传输的效率和稳定性。分布式计算则用于将计算任务分配到多个节点上进行处理,以提高计算速度和响应性。

5. 安全性

由于涉及用户数据的传输,安全性是至关重要的。必须采取适当的加密和身份验证措施来保护数据的机密性和完整性。常见的安全措施包括 SSL/TLS 加密、数字证书和 OAuth 认证。SSL/TLS 加密用于加密数据传输通道,防止数据被窃听或篡改。数字证书用于验证通信双方的身份,防止中间人攻击。OAuth 认证用于验证用户的身份和权限,以确保只有授权用户能够访问虚拟环境。


通过以上几个方面的详细解析,可以更全面地理解虚拟现实中的 socket 同步通讯机制,以及如何实现多用户共享虚拟环境或远程指导等功能。

6、一对一Socket同步通讯

客户端

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Net.Sockets;
using UnityEngine.UI;
using System;

public class Chat : MonoBehaviour
{
    Socket socket;
    public InputField InputField;
    public Text ServerInfo;
    public Text Conn_State;
    public Text CloseInfo;
    byte[] readBuff = new byte[1024];
    //Connect向服务端发起连接请求,并显示是否连接正常连接
    public void Connect()
    {
        try
        {
            socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            socket.Connect("127.0.0.1", 8888);
            Conn_State.text = "服务器端已经连接";
            Conn_State.color = Color.blue;
        }
        catch (System.Exception e)
        {
            Conn_State.color = Color.red;
            Conn_State.text = "请检查!服务端连接异常:" + e.Message.ToString();
        }

    }
    public void Send()
    {
        string sendStr = InputField.text;
        byte[] sendBytes = System.Text.Encoding.UTF8.GetBytes(sendStr);
        socket.Send(sendBytes);
        Receive();
    }
    public void Receive()
    {
        int length = socket.Receive(readBuff);
        string recStr = System.Text.Encoding.UTF8.GetString(readBuff, 0, length);
        Debug.Log(recStr);
        ServerInfo.text = recStr;
    }
    public void Close()
    {
        if (socket != null)
        {
            socket.Send(System.Text.Encoding.UTF8.GetBytes("客户端:" + socket.LocalEndPoint + "已断开连接"));
            CloseInfo.text = "与服务端:" + socket.RemoteEndPoint + "的连接已断开!";
            socket.Close();
        }
        System.Threading.Thread.Sleep(1000);
        Application.Quit();
    }
}

代码分析

1、using 指令

  • 引入了一些命名空间,包括 System.CollectionsSystem.Collections.GenericUnityEngineSystem.Net.Sockets,用于脚本中使用相关的类和方法。

2、定义类 Chat

  • 该类继承自 MonoBehaviour,是一个 Unity 脚本类。

3、成员变量:

  • socket:用于与服务器建立连接和进行通信的 Socket 对象。
  • InputField:Unity 中的输入字段,用于用户输入聊天内容。
  • ServerInfo:Unity 中的文本 UI 元素,用于显示从服务器接收到的信息。
  • Conn_State:Unity 中的文本 UI 元素,用于显示连接状态信息。
  • CloseInfo:Unity 中的文本 UI 元素,用于显示连接关闭信息。
  • readBuff:用于接收从服务器发送过来的数据的字节数组缓冲区。

4、方法 Connect()

  • 用于与服务器建立连接。在方法中,首先创建一个新的 Socket 对象,然后调用 Connect() 方法向指定的 IP 地址和端口发起连接请求,如果连接成功,则更新连接状态显示为已连接;如果连接失败,则显示连接异常信息。

5、方法 Send()

  • 用于发送用户输入的聊天内容到服务器。将用户输入的字符串转换为字节数组,然后通过 Socket 的 Send() 方法发送数据到服务器,并调用 Receive() 方法接收服务器的响应。

6、方法 Receive()

  • 用于接收从服务器发送过来的数据。通过 Socket 的 Receive() 方法接收数据,并将接收到的字节数组转换为字符串,然后将字符串显示在 ServerInfo 文本 UI 元素中,并通过 Debug.Log() 输出到 Unity 控制台。

7、方法 Close()

  • 用于关闭与服务器的连接。首先发送一个断开连接的消息到服务器,然后关闭 Socket 连接,最后延时一秒后退出应用程序。

这段代码实现了一个简单的基于 TCP 协议的客户端,在 Unity 中可以实现与服务器的聊天功能。


服务端

using System;
using System.Net;
using System.Net.Sockets;
class MainClass
{
    public static void Main(string[] args)
    {
        Console.WriteLine("Hello,I am Server!");
        Socket listenfd = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        IPAddress ipAdr = IPAddress.Parse("127.0.0.1");
        IPEndPoint ipEp = new IPEndPoint(ipAdr, 8888);
        listenfd.Bind(ipEp);
        listenfd.Listen(0);
        Console.WriteLine("服务器启动成功,等待连接......");
        Socket connfd = listenfd.Accept();
        Console.WriteLine("服务器Accept,连接已建立!!!");
        Console.WriteLine("客户端:" + connfd.RemoteEndPoint + "已连接进来!!!");
        try
        {
            while (true)
            {
                byte[] readBuff = new byte[1024];
                int count = connfd.Receive(readBuff);
                string readStr = System.Text.Encoding.UTF8.GetString(readBuff, 0, count);
                Console.WriteLine("服务器接收信息:" + readBuff);
                byte[] sendBytes = System.Text.Encoding.UTF8.GetBytes("server|" + readStr);
                connfd.Send(sendBytes);
                Console.WriteLine("服务器发送:" + System.Text.Encoding.UTF8.GetString(sendBytes));
            }
        }
        catch (Exception e)
        {
            Console.WriteLine("连接Close" + e.Message);
            while (true)
            {
                if (Console.ReadLine() == "0")
                    Environment.Exit(0);
            }
        }
    }
}

代码分析

1、using 指令

  • 引入了 SystemSystem.NetSystem.Net.Sockets 命名空间,用于使用相关的类和方法。

2、定义类 MainClass

  • 这是程序的主类。

3、方法 Main(string[] args)

  • 这是程序的入口点,Main 方法在程序启动时自动执行。

4、打印欢迎消息

  • 使用 Console.WriteLine 打印消息 "Hello,I am Server!" 表示服务器已启动。

5、创建 Socket 对象

  • 使用 Socket 类创建一个套接字对象 listenfd,指定地址族为 InterNetwork(IPv4),套接字类型为 Stream,协议类型为 Tcp

6、绑定 IP 地址和端口

  • 将服务器套接字绑定到本地 IP 地址 "127.0.0.1" 和端口号 8888。

7、开始监听

  • 调用 Listen() 方法开始监听客户端连接请求,参数为 0 表示最大连接队列长度为默认值。

8、等待连接

  • 调用 Accept() 方法阻塞等待客户端的连接请求,当有客户端连接成功时,会返回一个新的 Socket 对象 connfd,表示与客户端的通信套接字。

9、处理通信

  • 使用一个 while 循环不断接收和处理客户端的消息。首先创建一个字节数组 readBuff 用于接收客户端发送的数据,然后调用 Receive() 方法接收数据,并获取接收到的字节数。接收到的字节数据使用 UTF-8 编码转换为字符串 readStr,然后输出接收到的信息到控制台。接着将处理后的消息添加前缀 "server|",并将其发送给客户端,最后再次输出发送的信息到控制台。

10、异常处理

  • 如果发生异常,输出异常信息并进入一个新的无限循环中,直到控制台输入 "0" 时退出程序。

7、服务端操作

1、首先我们先运行客户端代码

这时会显示等待连接。

2、服务端点击Connect连接客户端

这时客户端会显示已连接。

3、服务端输入信息传输到客户端

这时客户端会收到信息,且服务端也会收到反馈信息

这个时候一对一Socket就已经建立好了!

4、断开连接

当点击Close后,服务端会出现断开连接的提示,客户端也会出现已断开连接的提示


希望这些能对刚学习算法的同学们提供些帮助哦!!!

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

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

相关文章

芯片设计公司外协ERP数字化运营:科技与管理的融合

随着信息技术的快速发展,ERP(企业资源计划)系统已经成为现代企业管理不可或缺的一部分。在芯片设计行业,由于产品的复杂性、技术的高要求以及市场的快速变化,外协ERP数字化运营显得尤为重要。 芯片设计公司的外协ERP数字化运营,主…

javaSwing员工工资管理系统(文档+视频+源码)

摘要 由Java swing mysql数据库实现的员工工资管理系统,该项目功能相对完善,有管理员和普通用户两个角色,分别实现了一些列功能,数据库采用的是mysql 系统实现 我们先以员工的身份查询一下: 接下来我们以管理员身份…

Qt | QCalendarWidget 类(日历)

01、QCalendarWidget 类 1、QCalendarWidget 类是 QWidget 的直接子类,该类用于日历,见下图 02、QCalendarWidget 属性 ①、dateEditAcceptDelay:int 访问函数:int dateEditAcceptDelay()const; void setDateEditAcceptDelay(int) 获取和设置日期编辑器的延迟时间(以毫秒…

事务的ACID是什么及扁平化事务、链式事务

一、什么是事务 1.事务(Transaction)是区别于数据库文件系统的重要特性之一。事务会把数据库从一种一致状态转换为另一种一致状态。在数据库提交工作时,可以确保要么所有修改都已经保存,要么所有修改都不保存。 2.InnoDB存储引擎中的事物完…

深度学习之基于YoloV5车牌识别系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与目标 随着智能交通系统的快速发展,车牌识别技术在交通管理、安防监控等领域扮演着越来越…

javaSwing购物系统项目(文档+视频+源码)

摘要 由Java swing实现的一款简单的购物程序,数据库采用的是mysql,该项目非常简单,实现了管理员对商品类型和商品的管理及用户注册登录后浏览商品、加入购物车、购买商品等功能,旨在学习Java 图形界面开发 系统实现 我们先来管理…

【HarmonyOS尝鲜课】- 下载、安装DevEco Studio以及配置环境、创建运行HarmonyOS项目

下载、安装开发工具 进入DevEco Studio下载官网,单击“立即下载”进入下载页面。 这里以Windows为例进行安装,可以根据操作系统选择对应的版本进行下载。 下载完成后解压一下,进入文件里,双击应用程序,打开安装向导&a…

FreeRTOS_同步互斥与通信_队列集_学习笔记

FreeRTOS_同步互斥与通信_环形buffer、队列_学习笔记 5.5 队列集 要支持多个输入设备时,我们需要实现一个“InputTask”,它读取各个设备的队列,得到数据后再分别转换为游戏的控制键。 InputTask如何及时读取到多个队列的数据?要…

汇聚荣科技有限公司怎么样?

在众多企业中,汇聚荣科技有限公司以其独特的发展模式和市场定位引起了人们的关注。对于这个问题,答案并非简单的好与坏,而需要从多个维度进行深入分析。 一、公司背景与发展历程汇聚荣科技有限公司成立于何年何地,由谁创立&#x…

如何在go项目中实现发送邮箱验证码、邮箱+验证码登录

前期准备 GoLand :2024.1.1 下载官网:https://www.jetbrains.com/zh-cn/go/download/other.html Postman: 下载官网:https://www.postman.com/downloads/ 效果图(使用Postman) Google: QQ: And …

第十五届“北斗杯”全国青少年空天科技体验与创新大赛安徽赛区阜阳市解读会议

5月19日,第十五届“北斗杯”全国青少年空天科技体验与创新大赛安徽赛区阜阳解读活动在阜阳市图书馆隆重举行。共青团阜阳市委员会学少部副部长丁晓龙、阜阳市师范大学物理系副主任黄银生教授、安徽科技报阜阳站站长李伟、市人工智能学会秘书长郭广泽、“北斗杯”安徽…

【html5】02-语义标签

1 引言 语义标签在用法上面与div标签没有区别&#xff0c;但是比div标签没多了层语义性&#xff01;&#xff01; 低版本的浏览器不支持语义标签&#xff0c;即语义标签失效 2 语义标签 <body><!-- <div class"nav"></div><div class&quo…

Lazarus - 从 Hello 开始

我们在《Lazarus - 隐秘的神器》一文中了解到了 Lazarus 的历史和特点&#xff0c;此后将正式开始学习Lazarus 开发。 如果你也对 Windows、Pascal、Delphi 开发感兴趣&#xff0c;请关注 Lazarus专栏 &#x1f4f0; 安装开发环境 官网&#xff1a;Lazarus Homepage (lazarus-i…

智慧园区EasyCVR视频智能管理方案:构建高效安全园区新视界

一、背景分析 园区作为城市的基本单元&#xff0c;是最重要的人口和产业聚集区。根据行业市场调研&#xff0c;90%以上城市居民工作与生活在园区进行&#xff0c;80%以上的GDP和90%以上的创新在园区内产生&#xff0c;可以说“城市&#xff0c;除了马路都是园区”。 园区形态…

Redis的下载、安装、启动和初尝试【超级简单】

redis最好是在Linux系统中使用&#xff0c;这是最接近生产实际的环境。 不过&#xff0c;我们初学者&#xff0c;目的是学习Redis的使用、原理&#xff0c;如果在Linux下直接学习Redis&#xff0c;很可能会因为命令不熟悉而劝退&#xff0c;这是不好的。 因此&#xff0c;我主张…

知乎广告推广开户最低需要多少钱?

精准高效的广告推广&#xff0c;是企业成功的关键&#xff0c;知乎作为知识分享与交流的高端平台&#xff0c;汇聚了大量高质量用户群体&#xff0c;无疑是品牌传播与产品推广的黄金之地。云衔科技作为您数字营销旅程中的得力伙伴&#xff0c;正以专业的知乎广告开户及代运营服…

【企业动态】东胜物联成为AWS硬件合作伙伴,助力实现边缘智能

近日&#xff0c;AIoT硬件设备供应商东胜物联与全球领先的云计算服务提供商亚马逊云&#xff08;AWS&#xff09;达成合作关系&#xff0c;共同致力于推动物联网技术的发展&#xff0c;为企业客户提供更智能、灵活的硬件解决方案&#xff0c;助力智能化升级和数字化转型。 作为…

fping 一键检测局域网内的连接设备(KALI工具系列三)

目录 1、KALI LINUX简介 2、fping工具简介 3、在KALI中使用fping 3.1 目标主机IP&#xff08;win&#xff09; 3.2 KALI的IP 4、操作示例 4.1 检测主机是否存活 4.2 发送ping包 4.3 指定发送ping包的大小 4.4 生成目标列表 5、总结 1、KALI LINUX简介 Kali Linux …

利用 MongoDB Atlas 进行大模型语义搜索和RAG

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学. 针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 汇总合集&…

太速科技-基于5VLX110T FPGA FMC接口功能验证6U CPCI平台

基于5VLX110T FPGA FMC接口功能验证6U CPCI平台 一、板卡概述   本板卡是Xilinx公司芯片V5系列芯片设计信号处理板卡。由一片Xilinx公司的XC5VLX110T-1FF1136 / XC5VSX95T-1FF1136 / XC5VFX70T-1FF1136芯片组成。FPGA接1片DDR2内存条 2GB&#xff0c;32MB Nor flash存储器&a…