Socket同步通讯

目录

引言

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后,服务端会出现断开连接的提示,客户端也会出现已断开连接的提示


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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【笔记】软件架构师要点记录(1)

【笔记】软件架构师要点记录 20240517 20240517 连续性:恢复能力;可用性:保持稳定态的时长 增量开发模式:在增量开发中,每个增量都有明确的范围和功能,并按照特定的功能顺序完成。增量之间的范围划分在开发…

Flask CORS: 解决跨域资源共享问题的利器

文章目录 安装和启用 CORS配置 CORS拓展 在本文中,我们介绍了如何使用 Flask-CORS 扩展来解决跨域问题。Flask-CORS 是一个方便的工具,可以帮助我们轻松地实现跨域资源共享支持。 安装和启用 CORS 要开始使用 Flask-CORS,我们需要先安装它。…

腹部多器官分割的眼动引导双路径网络

文章目录 标题摘要方法实验结果 标题 摘要 这项研究提出了一种新的方法,名为眼动引导双路径网络(Eye-Guided Dual-Path Network,EG-DPN),用于腹部多器官分割。这项工作的主要目标是提高医学影像分析中的多器官分割准…

express.js--token中间件验证及token解析(三)

主要作用 访问路由接口时,哪些需要校验token 通过token解析身份信息,就可以知道是哪个人 框架基本搭建express.js--基本用法及路由模块化(一)-CSDN博客 如何生成tokenexpress.js--生成token(二)-CSDN博客 middleware/index.js const jwt require(…

Vue 离线地图实现

效果图: 一、获取市的地图数据 DataV.geoAtlas 获取市地图数据 点击地图缩放至想要的市区域,通过右侧的链接打开网址,复制json数据。 二、获取镇地图数据 选择你想要的镇数据,点击下载 选择级别(清晰度&#xff09…

如何搭建Sphinx文档

环境准备 Linux CentOS 7 方案 搭建一个文档网站,本文档使用的是tomcatsphinx。 Tomcat可以快速搭建出http服务,也可以使用apache httpd。 Sphinx作为文档网页自动生成工具,可以从reStructured文档转换为html文件。 Tomcat安装 创建/…

App玩转oCPX投放,打造低成本高转化的广告模型

随着广告主考核目标逐渐深化,以激活、注册等浅层指标为考核已经无法满足大部分广告主的投放诉求,越来越多的后端深化指标成为了广告主的核心诉求。OCPX应需而生,更好的助力广告主优化投放,全面提升转化效率。 在投放实践中&#…

【系统分析师】论文框架

文章目录 HA高可用集群软件1、需求分析2、架构设计3、技术选型:4、编码实现:5、测试验证:6、部署和运维: HA高可用集群软件 论文支持 文心一言查的 1、需求分析 明确业务需求,包括需要支持的用户数量、服务级别协议…

AI绘画Stable Diffusion制作文字光效指南,SD实现超炫文字光影效果!

大家好,我是小强 如果你经常刷短视频,那么你可能会在各大社交平台上见到了这样的文字光效,那么这种光线照射文字的效果是如何制作的呢? 这个教程将解密如何使用Stable Diffusion ControlNet来制作这种非常火的文字光效效果~&…

[Chapter 5]线程级并行,《计算机系统结构》,《计算机体系结构:量化研究方法》

文章目录 一、互连网络1.1 互连网络概述1.1 互连函数1.1.1 互连函数1.1.2 几种基本的互连函数1.1.2.1 恒等函数1.1.2.2 交换函数1.1.2.3 均匀洗牌函数1.1.2.4 碟式函数1.1.2.5 反位序函数1.1.2.6 移数函数1.1.2.7 PM2I函数 1.2 互连网络的结构参数与性能指标1.2.1 互连网络的结…

Terraria泰拉瑞亚服务器开服联机教程

1、进入控制面板 2、等待服务器安装 3、启动服务器 服务器启动成功后如下图所示 4、连接游戏服务器 4.1、复制服务器地址和端口 4.2、连接游戏服务器 5、预配置选项修改(可选) 6、更换游戏版本(可选) 服务器默认安装是最新稳定版…

民国漫画杂志《时代漫画》第18期.PDF

时代漫画18.PDF: https://url03.ctfile.com/f/1779803-1248612707-27e56b?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了,截止1937年6月战争来临被迫停刊共发行了39期。 ps:资源来源网络!

Miniconda安装教程——macos

一、安装 二、启用 三、安装包 四、删除旧版 一、安装 1、Miniconda安装 Index of /anaconda/miniconda/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror Date倒序选择最新版,macos端下载pkg 点击安装,安装完成后,打开终端&a…

2024年信息素养大赛初赛成绩,你们查到了吗?

2024年全国青少年信息素养大赛初赛成绩已经发布,赶紧来查一下吧!今年Scratch实验室预计晋级复赛分数在90分以上嘞(最次也要85),今年的初赛题比较简单,大部分同学10多分钟就交卷了,之前发布了202…

视频图像识别技术常见开源算法模型及实践应用方案介绍

一、图像识别技术常见算法模型及数据集 人工智能图像识别技术是一种利用人工智能技术识别并理解图像内容的技术。它可以通过训练模型来识别和分类图像中的物体、场景和人脸等内容。 在人工智能图像识别技术中,常见的算法模型包括: 卷积神经网络&#x…

【iOS安全】BurpSuite iOS https抓包 | DNS Spoofing

BurpSuite 完整版安装 参考:Admin Team 小数智 的博客 下载 Burp Suite 2021.6 官网下载地址 https://portswigger.net/burp/releases (下载并安装好) jdk 使用的是11.0.10 https://www.oracle.com/java/technologies/javase-jdk11-downl…

react组件中的共享数据

在前面的示例中,每个 MyButton 都有自己独立的 count,当每个按钮被点击时,只有被点击按钮的 count 才会发生改变: 然而,你经常需要组件 共享数据并一起更新。 为了使得 MyButton 组件显示相同的 count 并一起更新&…

10 - 核心对象 Switch / case

简介 在Kettle(也称为Pentaho Data Integration,PDI)中,Switch/Case 是一个关键的组件,用于根据特定条件将数据流分支到不同的路径。Switch组件评估输入数据中的某个字段,并将数据标记后传递给相应的Case组…

vue3 响应式基础(怎么改变界面值)

在开发中,我们需要在改变一个数据的同时,去改变页面的变化,那这个时候响应式声明用起来就比较方便 之前做安卓开发的时候,要改变页面,首先拿到页面的一个控件,再对控件进行赋值或者其他的操作来改变界面 1、…

Flink 调度源码分析4:Physical Slot 分配过程

Flink 调度源码分析1:拓扑图创建与提交过程 Flink 调度源码分析2:调度过程 Flink 调度源码分析3:Shared Slot 分配策略 Flink 调度源码分析4:Physical Slot 分配过程 1 整体过程 在 SlotSharingExecutionSlotAllocator.allocate…