皮皮网
皮皮网

【内外盘比 源码】【易语言合并源码】【embos开发源码】unity socket源码

来源:网站源码简单漂亮 发表时间:2024-11-27 07:23:40

1.求一份unity中Socket-TCP从服务器接收数据方法的代码
2.Unity网络编程(一)——套接字与套接字编程
3.Python 与 unitysocket 通信如何实现?
4.探索游戏开发中的Socket和HTTP网络通信,含主流引擎的代码示例
5.Unity3D 服务器高并发的原理详解

unity socket源码

求一份unity中Socket-TCP从服务器接收数据方法的代码

       接收的字节使用了protubuf反序列化,处理的时候要注意和服务器发送消息类型、大小定义一致。如果不需要可以直接删除,用服务器发送字符串也是一样

       using System.Collections;

       using System.Collections.Generic;

       using UnityEngine;

       using System.Net.Sockets;

       using System;

       using UnityEngine.Networking;

       using System.Text;

       using Google.Protobuf;

       using Pb;

       using System.Net;

       using System.IO;

       namespace Net

       {

       public class SocketClient

       {

       #region Public Variables

       public static SocketClient Instance { get; private set; }

       [Header("Network")]

       public string ipAdress = ".0.0.1";

       public int port = ;

       public float waitingMessagesFrequency = 1;

       public bool loggedIn { get; private set; }

       public bool FullLog = true;

       #endregion

       #region Private m_Variables

       private TcpClient m_Client;

       private NetworkStream m_NetStream = null;

       private byte[] m_Buffer = new byte[];

       private NetworkStream m_OutStream;

       [Tooltip("This value should be >= to Server waitingMessagesFrequency")]

       [Min(0)] private float m_DelayedCloseTime = 0.5f;

       #endregion

       #region Delegate Variables

       protected Action OnClientStarted = null; //Delegate triggered when client start

       protected Action OnClientClosed = null; //Delegate triggered when client close

       #endregion

       private void Awake()

       {

       if (Instance == null)

       Instance = this;

       }

       //Start client and stablish connection with server

       public void StartClient()

       {

       //Early out

       if (m_Client != null)

       {

       ClientLogError($"There is already a runing client on { ipAdress}::{ port}");

       return;

       }

       try

       {

       //Create new client

       m_Client = new TcpClient();

       //Set and enable client

       m_Client.BeginConnect(ipAdress, port, new AsyncCallback(OnConnect), null);

       ClientLogInfo($"Client Started on { ipAdress}::{ port}");

       OnClientStarted?.Invoke();

       }

       catch (SocketException)

       {

       ClientLogError("Socket Exception: Start Server first");

       OnClose();

       }

       }

       private void OnConnect(IAsyncResult asr)

       {

       ClientLogInfo("Connect Sucessful.");

       m_NetStream = m_Client.GetStream();

       m_Client.GetStream().BeginRead(m_Buffer, 0, m_Buffer.Length, new AsyncCallback(OnRead), m_Client);

       }

       #region Receive Message

       private void OnRead(IAsyncResult result)

       {

       OnReceivedMessage(m_Buffer);

       NetworkStream stream = m_Client.GetStream();

       lock (stream)

       {

       Array.Clear(m_Buffer, 0, m_Buffer.Length);

       m_Client.GetStream().BeginRead(m_Buffer, 0, m_Buffer.Length, new AsyncCallback(OnRead), m_Client);

       }

       }

       private void OnReceivedMessage(byte[] bytes)

       {

       ByteBuffer buffer = new ByteBuffer(bytes);

       OnRecieveMessageDeal(buffer, 0);

       }

       private void OnRecieveMessageDeal(ByteBuffer buffer, ushort length = 0)

       {

       // 判断传参length是否为0,如果不为0则代表非首次调用,内外盘比 源码不再取length值而使用传递的length

       ushort nextLength;

       if(length != 0)

       {

       nextLength = length;

       }

       else

       { // 判断传参length是否为0,如果为0则为首次调用,直接取出length后进行处理

       nextLength = buffer.ReadUInt();

       }

       uint pId = buffer.ReadUInt();

       ClientLogInfo("Length:" + nextLength + ".id:" + pId);

       byte[] bytes = buffer.ReadBytes(nextLength);

       NetLogic(pId, bytes);

       // 取出下一个length,如果为0则没有数据了,不为0则递归调用,并且传递已经取出的长度值

       nextLength = buffer.ReadUInt();

       if (nextLength != 0)

       {

       OnRecieveMessageDeal(buffer, nextLength);

       }

       }

       #endregion

       #region Process

       private void NetLogic(uint pid, byte[] bytes)

       {

       ClientLogInfo("Get Msg Id :" + pid);

       if (pid == 1)

       {

       SyncPid syncPid = SyncPid.Parser.ParseFrom(bytes);

       ClientLogInfo("sync pid:"+syncPid.Pid);

       }

       if (pid == )

       {

       BroadCast broadCast = BroadCast.Parser.ParseFrom(bytes);

       ClientLogInfo("broadCast-pid:" + broadCast.Pid);

       ClientLogInfo("broadCast-Tp:" + broadCast.Tp);

       ClientLogInfo("broadCast-Position-x:" + broadCast.P.X);

       ClientLogInfo("broadCast-Position-y:" + broadCast.P.Y);

       ClientLogInfo("broadCast-Position-z:" + broadCast.P.Z);

       ClientLogInfo("broadCast-Position-v:" + broadCast.P.V);

       }

       }

       #endregion

       #region Send Message

       private void WriteMessage(byte[] message)

       {

       MemoryStream memoryStream2;

       MemoryStream memoryStream = memoryStream2 = new MemoryStream();

       try

       {

       memoryStream.Position = 0L;

       BinaryWriter binaryWriter = new BinaryWriter(memoryStream);

       ushort num = (ushort)message.Length;

       binaryWriter.Write(message);

       binaryWriter.Flush();

       if (m_Client != null && this.m_Client.Connected)

       {

       byte[] array = memoryStream.ToArray();

       m_OutStream.BeginWrite(array, 0, array.Length, new AsyncCallback(OnWrite), null);

       }

       else

       {

       ClientLogError("client.connected----->>false");

       }

       }

       finally

       {

       if (memoryStream2 != null)

       {

       ((IDisposable)memoryStream2).Dispose();

       }

       }

       }

       private void OnWrite(IAsyncResult r)

       {

       try

       {

       m_OutStream.EndWrite(r);

       }

       catch (Exception ex)

       {

       ClientLogError("OnWrite--->>>" + ex.Message);

       }

       }

       public void SendMessage(ByteBuffer buffer)

       {

       this.SessionSend(buffer.ToBytes());

       buffer.Close();

       }

       private void SessionSend(byte[] bytes)

       {

       this.WriteMessage(bytes);

       }

       #endregion

       #region Close Client

       //Close client connection

       public void Close()

       {

       if (m_Client != null)

       {

       if (m_Client.Connected)

       {

       m_Client.Close();

       }

       m_Client = null;

       }

       loggedIn = false;

       }

       public void OnClose()

       {

       ClientLogError("Client Closed");

       //Reset everything to defaults

       if (m_Client.Connected)

       m_Client.Close();

       if (m_Client != null)

       m_Client = null;

       OnClientClosed?.Invoke();

       }

       #endregion

       #region ClientLog

       // Custom Client Log With Text Color

       public void ClientLogInfo(string msg)

       {

       if (FullLog)

       {

       Debug.Log($"<color=green>Client:</color>{ msg}");

       }

       }

       public void ClientLogWarning(string msg)

       {

       if (FullLog)

       {

       Debug.LogWarning($"<color=yellow>Client:</color>{ msg}");

       }

       }

       public void ClientLogError(string msg)

       {

       if (FullLog)

       {

       Debug.LogError($"<color=red>Client:</color>{ msg}");

       }

       }

       //Custom Client Log Without Text Color

       public void ClientLog(string msg)

       {

       if (FullLog)

       {

       Debug.Log($"Client:{ msg}");

       }

       }

       #endregion

       }

       }

Unity网络编程(一)——套接字与套接字编程

       本文将探讨Unity网络编程的基本概念和Socket编程。套接字(Socket)是应用程序与网络协议栈之间的抽象层,用于进行通信。易语言合并源码IP地址与端口号的组合标识了特定功能的定位。地址族、套接字类型和协议类型定义了网络通信的兼容性和功能。本地地址用于内部网络通信。服务端的Socket实例涉及绑定、监听、接受和交互。客户端的Socket主要负责连接和操作。使用.NET创建控制台程序实现基本的服务端,包括绑定、监听、接受和交互。测试与回声实验演示客户端与服务端的embos开发源码Socket编程访问。使用C#实现回声实验,避免了C语言中的字符串拼接等难题,提供了一种简单高效的解决方法。为学习者提供了一种实现网络编程的概念和实践,特别是使用.NET进行服务端编程的示例,以及通过C#实现回声实验的步骤。此文章旨在简化学习网络编程的起点,为Unity开发者提供实用的网络编程知识。

Python 与 unitysocket 通信如何实现?

       Python 和 Unity 间的通信可以通过TCP或UDP套接字来实现,它们都支持这两种网络通信协议。以下是这两种方式的简要步骤:

       1. TCP实现: Python中,使用socket模块创建一个TCP服务器,它会监听连接请求。ionic 的案例源码一旦接收到,服务器会通过accept()函数接受连接,并创建新的线程处理。服务器可以利用send()发送数据,recv()接收数据。在Unity客户端,TcpClient和NetworkStream类被用来连接Python服务器并进行数据交换。具体代码示例如下:

       Python 服务器代码段:

       Unity 客户端代码段:

       2. UDP实现: 对于UDP,Python同样使用socket模块,创建一个服务器等待客户端数据。通过sendto()发送数据,recvfrom()接收数据,而Unity客户端则通过UdpClient类完成数据传输。java消息提醒源码同样,实际应用中需根据需求调整代码,并注意数据格式、编码和安全问题。

       以上是Python与Unity通过TCP和UDP套接字进行通信的基本步骤,实际操作时需根据具体项目需求进行相应的代码定制和安全处理。

探索游戏开发中的Socket和HTTP网络通信,含主流引擎的代码示例

       在游戏开发中,实现有效的通信是确保玩家获得无缝体验的关键之一。两种常见的通信方式是 Socket 和 HTTP,它们各自在不同场景下发挥着重要作用。本文将深入探讨这两种通信方式的特点、优势以及在游戏开发中的应用。

       Socket 是一种基于 TCP 或 UDP 协议的底层通信方式,它允许游戏客户端和服务器之间建立持久性的连接,实现实时数据传输。这种通信方式特别适合需要高实时性和灵活性的场景,如多人在线游戏。

       优势包括实时性与灵活性,应用场景如多人在线游戏。

       HTTP(超文本传输协议)是一种广泛使用的协议,用于在客户端和服务器之间传输数据。在游戏开发中,虽然 HTTP 不如 Socket 那样实时,但它在某些方面具有独特的优势。

       优势包括稳定性与跨平台的兼容性,应用场景如玩家数据存储和资源下载。

       各主流引擎的代码示例展示如何在 Unity、LayaAir、Cocos 和 Egret 等引擎中实现 Socket 和 HTTP 通信。

       总结指出,在实际游戏开发中,需要综合考虑实时性、稳定性和平台适配等因素来选择适合的通信方式。

       结论强调 Socket 适用于多人在线游戏的高实时性需求,HTTP 适用于稳定性要求较高、跨平台数据传输的场景。

       建议开发者具备良好的网络编程技能和合理的设计思路,以确保通信的效率、稳定性和安全性,从而为玩家创造出更加优质的游戏体验。

       文章主要强调了 Socket 和 HTTP 的特点、优势以及在游戏开发中的应用,通过示例代码展示了如何在不同引擎中实现这两种通信方式。提醒读者在实际开发中综合考虑选择合适的通信方式,以满足游戏的实时性和稳定性需求。

Unity3D 服务器高并发的原理详解

       本文详细解析Unity3D服务器在高并发环境下的工作原理和实现策略。首先,Unity3D利用Socket的UDP协议处理网络通信,因UDP无连接性,能有效处理多个并发请求,通过异步Socket避免阻塞。其次,服务器运用多线程技术,主线程负责接收请求,工作线程处理CPU密集任务,通过线程池管理效率更高。此外,为了应对数据库性能瓶颈,Unity3D服务器会利用缓存技术,如MemoryCache,减少对数据库的频繁访问。负载均衡方面,Unity3D通过LoadBalancing实现,通常采用轮询算法分配请求到不同服务器。

       技术详解部分,具体涉及Socket的UDP使用,多线程的创建和管理,以及MemoryCache的缓存功能和LoadBalancing的负载均衡配置。代码实现部分则展示了这些技术在实际项目中的应用实例。总的来说,要实现Unity3D服务器的高并发,关键在于正确选择网络协议、有效利用多线程、合理缓存数据和明智的负载均衡策略。通过本文,你将对Unity3D服务器的并发处理有更深入的理解。

相关栏目:知识

.重点关注