Photon服务器引擎(二)socket/TCP/UDP基础及Unity聊天室的实现

Unity 与C#服务器 实现Socket的UDP通信(多客户端) 前言 上一篇简单的介绍了下Unity客户端和服务器的Socket通信,但是还不能实现多个客户端与服务器的通信,所以今天在这边把前面的工程完善一下(使用的是上篇讲到的UdpClient类来实现),实现多个客户端与服务器的udp通信。效果图如下,两个客户端可以向服务器发送消息,然后服务器每隔3秒给“连接上”的客户端发送收到的消息。 内容 思路上一篇已经讲到过了,我们定义两个特殊的字段,来告知... 阅读详情

Photon服务器引擎(二)socket/TCP/UDP基础及Unity聊天室的实现

我们平时说的最多的socket是什么呢,实际上socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API)。
通过Socket,我们才能使用TCP/IP协议。实际上,Socket跟TCP/IP协议没有必然的联系。Socket编程接口在设计的时候,就希望也能适应其他的网络协议。所以说,Socket的出现只是使得程序员更方便地使用TCP/IP协议栈而已,是对TCP/IP协议的抽象,从而形成了我们知道的一些最基本的函数接口,比如create、listen、connect、accept、send、read和write等等。
网络有一段关于socket和TCP/IP协议关系的说法比较容易理解:

“TCP/IP只是一个协议栈,就像操作系统的运行机制一样,必须要具体实现,同时还要提供对外的操作接口。
这个就像操作系统会提供标准的编程接口,比如win32编程接口一样,
TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口。”

1、TCP协议实现原理

TCP数据包主要包括:
1、SYN包:请求建立连接的数据包
2、ACK包:回应数据包,表示接收到了对方的某个数据包
3、PSH包:正常数据包
4、FIN包:通讯结束包
5、RST包:重置连接
6、URG包:紧急指针

一次完成的TCP通讯包括:建立连接、数据传输、关闭连接
建立连接(三次握手):
1、客户端通过向服务器端发送一个SYN来建立一个主动打开,作为三路握手的一部分。
2、服务器端应当为一个合法的SYN回送一个SYN/ACK。
3、最后,客户端再发送一个ACK。这样就完成了三路握手,并进入了连接建立状态。
数据传输:
1、发送数据端传输PSH数据包
2、接收数据端回复ACK数据包
关闭连接(四次分手):
1、一端主动关闭连接。向另一端发送FIN包。
2、接收到FIN包的另一端回应一个ACK数据包。
3、另一端发送一个FIN包。
4、接收到FIN包的原发送方发送ACK对它进行确认。

下面为使用TCP协议实现一个简单服务器端:
[csharp]  view plain  copy
 print ?
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Net;  
  5. using System.Net.Sockets;  
  6. using System.Text;  
  7. using System.Threading.Tasks;  
  8.   
  9.     class Program {  
  10.         static void Main(string[] args) {  
  11.             // 1,创建socket  
  12.             Socket tcpServer = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);  
  13.             //2,绑定ip跟端口号 222.20.30.68  
  14.             IPAddress ipaddress = new IPAddress(new byte[]{222,20,30,68});  
  15.             EndPoint point = new IPEndPoint(ipaddress,7788);//ipendpoint是对ip+端口做了一层封装的类  
  16.             tcpServer.Bind(point);//向操作系统申请一个可用的ip跟端口号 用来做通信  
  17.             //3,开始监听 (等待客户端连接)  
  18.             tcpServer.Listen(100);//参数是最大连接数  
  19.             Console.WriteLine("开始监听");  
  20.   
  21.            Socket clientSocket = tcpServer.Accept();//暂停当前线程,直到有一个客户端连接过来,之后进行下面的代码  
  22.             Console.WriteLine("一个客户端连接过来了");  
  23.             //使用返回的socket跟客户端做通信  
  24.             string message = "hello 欢迎你";  
  25.             byte[] data = Encoding.UTF8.GetBytes(message);//对字符串做编码,得到一个字符串的字节数组  
  26.             clientSocket.Send(data);  
  27.             Console.WriteLine("向客户端发送了一跳数据");  
  28.   
  29.             byte[] data2 = new byte[1024];//创建一个字节数组用来当做容器,去承接客户端发送过来的数据  
  30.             int length = clientSocket.Receive(data2);  
  31.             string message2 = Encoding.UTF8.GetString(data2, 0, length);//把字节数据转化成 一个字符串  
  32.             Console.WriteLine("接收到了一个从客户端发送过来的消息:"+message2);  
  33.   
  34.             Console.ReadKey();  
  35.         }  
  36.     }  

TcpListener的使用:
[csharp]  view plain  copy
 print ?
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Net;  
  5. using System.Net.Sockets;  
  6. using System.Runtime.InteropServices;  
  7. using System.Text;  
  8. using System.Threading.Tasks;  
  9.   
  10.     class Program {  
  11.         static void Main(string[] args) {  
  12.             //1,TcpListener对socket进行了一层封装,这个类里面自己会去创建socket对象  
  13.             TcpListener listener = new TcpListener(IPAddress.Parse("222.20.30.68"), 7788);  
  14.   
  15.             //2,开始进行监听  
  16.             listener.Start();  
  17.   
  18.             //3,等待客户端连接过来  
  19.             TcpClient client = listener.AcceptTcpClient();  
  20.   
  21.             //4,取得客户端发送过来的数据  
  22.             NetworkStream stream = client.GetStream();//得到了一个网络流  从这个网络流可以取得客户端发送过来的数据  
  23.   
  24.             byte[] data = new byte[1024];//创建一个数据的容器,用来承接数据  
  25.   
  26.             while (true)  
  27.             {  
  28.                 //0 表示从数组的哪个索引开始存放数据  
  29.                 //1024表示最大读取的字节数  
  30.                 int length = stream.Read(data, 0, 1024);//读取数据  
  31.                 string message = Encoding.UTF8.GetString(data, 0, length);  
  32.                 Console.WriteLine("收到了消息:" + message);  
  33.             }  
  34.   
  35.   
  36.             stream.Close();  
  37.             client.Close();  
  38.             listener.Stop();//停止监听  
  39.             Console.ReadKey();  
  40.         }  
  41.     }  

2、UDP协议实现原理

UDP协议在IP协议上增加了复用、分用和差错检测功能。UDP的特点:
1、是无连接的。相比于TCP协议,UDP协议在传送数据前不需要建立连接,当然也就没有释放连接。
2、是尽最大努力交付的。也就是说UDP协议无法保证数据能够准确的交付到目的主机。也不需要对接收到的UDP报文进行确认。
3、是面向报文的。也就是说UDP协议将应用层传输下来的数据封装在一个UDP包中,不进行拆分或合并。因此,运输层在收到对方的UDP包后,会去掉首部后,将数据原封不动的交给应用进程。
4、没有拥塞控制。因此UDP协议的发送速率不送网络的拥塞度影响。
5、UDP支持一对一、一对多、多对一和多对多的交互通信。
6、UDP的头部占用较小,只占用8个字节。

下面为使用UDP协议实现一个简单服务器端:
[csharp]  view plain  copy
 print ?
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Net;  
  5. using System.Net.Sockets;  
  6. using System.Text;  
  7. using System.Threading;  
  8. using System.Threading.Tasks;  
  9. class Program  
  10.     {  
  11.         private static Socket udpServer;  
  12.         static void Main(string[] args) {  
  13.             //1,创建socket  
  14.              udpServer = new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);  
  15.             //2,绑定ip跟端口号  
  16.             udpServer.Bind( new IPEndPoint( IPAddress.Parse("192.168.0.112"),7788 ) );  
  17.   
  18.             //3,接收数据  
  19.             new Thread(ReceiveMessage){ IsBackground = true}.Start();  
  20.   
  21.             //udpServer.Close();  
  22.             Console.ReadKey();  
  23.         }  
  24.   
  25.         static void ReceiveMessage()  
  26.         {  
  27.             while (true)  
  28.             {  
  29.                 EndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);  
  30.                 byte[] data = new byte[1024];  
  31.                 int length = udpServer.ReceiveFrom(data, ref remoteEndPoint);//这个方法会把数据的来源(ip:port)放到第二个参数上  
  32.                 string message = Encoding.UTF8.GetString(data, 0, length);  
  33.                 Console.WriteLine("从ip:" + (remoteEndPoint as IPEndPoint).Address.ToString() + ":" + (remoteEndPoint as IPEndPoint).Port + "收到了数据:" + message);  
  34.             }  
  35.   
  36.         }  
  37.     }  

udpClient的使用:
[csharp]  view plain  copy
 print ?
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Net;  
  5. using System.Net.Sockets;  
  6. using System.Text;  
  7. using System.Threading.Tasks;  
  8.   
  9.     class Program {  
  10.         static void Main(string[] args) {  
  11.             //创建udpclient 绑定ip跟端口号  
  12.             UdpClient udpClient = new UdpClient(new IPEndPoint(IPAddress.Parse("192.168.0.112"),7788));  
  13.   
  14.             while (true)  
  15.             {  
  16.                 //接收数据  
  17.                 IPEndPoint point = new IPEndPoint(IPAddress.Any, 0);  
  18.                 byte[] data = udpClient.Receive(ref point);//通过point确定数据来自哪个ip的哪个端口号 返回值是一个字节数组,就是我们的数据  
  19.                 string message = Encoding.UTF8.GetString(data);  
  20.                 Console.WriteLine("收到了消息:" + message);  
  21.             }  
  22.   
  23.   
  24.             udpClient.Close();  
  25.             Console.ReadKey();  
  26.         }  
  27.     }  

3、Unity实现聊天室功能

客户端的实现代码:
[csharp]  view plain  copy
 print ?
  1. using UnityEngine;  
  2. using System.Collections;  
  3. using System.Net;  
  4. using System.Net.Sockets;  
  5. using System.Text;  
  6. using System.Threading;  
  7.   
  8. public class ChatManager : MonoBehaviour  
  9. {  
  10.     public string ipaddress = "222.20.30.68";  
  11.     public int port = 7788;  
  12.     public UIInput textInput;  
  13.     public UILabel chatLabel;  
  14.   
  15.     private Socket clientSocket;  
  16.     private Thread t;  
  17.     private byte[] data = new byte[1024];//数据容器  
  18.     private string message = "";//消息容器  
  19.     // Use this for initialization  
  20.     void Start () {  
  21.         ConnectToServer();  
  22.     }  
  23.       
  24.     // Update is called once per frame  
  25.     void Update () {  
  26.         if (message != null && message != "")  
  27.         {  
  28.             chatLabel.text += "\n" + message;  
  29.             message = "";//清空消息  
  30.         }  
  31.     }  
  32.   
  33.     void ConnectToServer()  
  34.     {  
  35.           
  36.         clientSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);  
  37.         //跟服务器端建立连接  
  38.         clientSocket.Connect(new IPEndPoint(IPAddress.Parse("222.20.30.68"),7788));  
  39.         //创建一个新的线程 用来接收消息  
  40.         t = new Thread(ReceiveMessage);  
  41.         t.Start();  
  42.     }  
  43.     /// <summary>  
  44.     /// 这个线程方法 用来循环接收消息  
  45.     /// </summary>  
  46.     void ReceiveMessage()  
  47.     {  
  48.         while (true)  
  49.         {  
  50.             if (clientSocket.Connected == false)  
  51.                 break;  
  52.   
  53.             int length = clientSocket.Receive(data);  
  54.             message = Encoding.UTF8.GetString(data, 0, length);  
  55.             //chatLabel.text += "\n" + message;  
  56.         }  
  57.     }  
  58.   
  59.     void SendMessage(string message)  
  60.     {  
  61.         byte[] data = Encoding.UTF8.GetBytes(message);  
  62.         clientSocket.Send(data);  
  63.     }  
  64.   
  65.     public void OnSendButtonClick()  
  66.     {  
  67.         string value = textInput.value;  
  68.         SendMessage(value);  
  69.         textInput.value = "";  
  70.     }  
  71.   
  72.     void OnDestroy()  
  73.     {  
  74.         clientSocket.Shutdown(SocketShutdown.Both);  
  75.           
  76.         clientSocket.Close();//关闭连接  
  77.     }  
  78. }  

服务器端的实现代码:
[csharp]  view plain  copy
 print ?
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Net.Sockets;  
  5. using System.Text;  
  6. using System.Threading;  
  7. using System.Threading.Tasks;  
  8.   
  9.   
  10. namespace _022_聊天室_socket_tcp服务器端 {  
  11.     /// <summary>  
  12.     /// 用来跟客户端做通信   
  13.     /// </summary>  
  14.     class Client  
  15.     {  
  16.         public string name=null;  
  17.         private Socket clientSocket;  
  18.         private Thread t;  
  19.         private byte[] data = new byte[1024];//这个是一个数据容器  
  20.   
  21.         public Client(Socket s,string i)  
  22.         {  
  23.             clientSocket = s;  
  24.             name = i;  
  25.             //启动一个线程 处理客户端的数据接收  
  26.             t = new Thread(ReceiveMessage);  
  27.             t.Start();  
  28.         }  
  29.   
  30.         private void ReceiveMessage()  
  31.         {  
  32.             //一直接收客户端的数据  
  33.             while (true)  
  34.             {  
  35.                 //在接收数据之前  判断一下socket连接是否断开  
  36.                 if (clientSocket.Poll(10, SelectMode.SelectRead))  
  37.                 {  
  38.                     clientSocket.Close();  
  39.                     break;//跳出循环 终止线程的执行  
  40.                 }  
  41.                   
  42.                 int length = clientSocket.Receive(data);  
  43.                 string message = Encoding.UTF8.GetString(data, 0, length);  
  44.                 //接收到数据的时候 要把这个数据 分发到客户端  
  45.                 //广播这个消息  
  46.                 Program.BroadcastMessage(message,name);  
  47.                 Console.WriteLine("收到 "+name +" 的消息:" + message);  
  48.             }  
  49.         }  
  50.   
  51.         public void SendMessage(string message)  
  52.         {  
  53.             byte[] data = Encoding.UTF8.GetBytes(message);  
  54.             clientSocket.Send(data);  
  55.         }  
  56.   
  57.         public bool Connected  
  58.         {  
  59.             get { return clientSocket.Connected; }  
  60.         }  
  61.     }  
  62. }  

[csharp]  view plain  copy
 print ?
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Net;  
  5. using System.Net.Sockets;  
  6. using System.Net.WebSockets;  
  7. using System.Text;  
  8. using System.Threading.Tasks;  
  9.   
  10. namespace _022_聊天室_socket_tcp服务器端 {  
  11.     class Program {  
  12.         static  List<Client> clientList = new List<Client>();  
  13.           
  14.         /// <summary>  
  15.         /// 广播消息  
  16.         /// </summary>  
  17.         /// <param name="message"></param>  
  18.         public static void BroadcastMessage(string message,string name)  
  19.         {  
  20.             var notConnectedList = new List<Client>();  
  21.             foreach (var client in clientList)  
  22.             {  
  23.                 if (client.Connected)  
  24.                     client.SendMessage(name+" : "+message);  
  25.                 else  
  26.                 {  
  27.                     notConnectedList.Add(client);  
  28.                 }  
  29.             }  
  30.             foreach (var temp in notConnectedList)  
  31.             {  
  32.                 clientList.Remove(temp);  
  33.             }  
  34.         }  
  35.         static void Main(string[] args) {  
  36.             int i = 0;  
  37.             string name = null;  
  38.             Socket tcpServer = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);//create tcpserver  
  39.             tcpServer.Bind(new IPEndPoint(IPAddress.Parse("222.20.30.68"),7788));//set ip and port  
  40.   
  41.             tcpServer.Listen(100);//listen port  
  42.             Console.WriteLine("server running...");  
  43.   
  44.             while (true)  
  45.             {  
  46.                 i = i + 1;  
  47.                 if (i == 1) { name = "Tom"; }   
  48.                 else if (i == 2) { name = "Alice";}  
  49.                 else { name = "Other"; }  
  50.                 Socket clientSocket = tcpServer.Accept();//accept client request  
  51.                 Console.WriteLine("用户 "+name+" 已连接 !");  
  52.                 Client client = new Client(clientSocket,name);//把与每个客户端通信的逻辑(收发消息)放到client类里面进行处理                  
  53.                 clientList.Add(client);  
  54.             }  
  55.               
  56.         }  
  57.     }  
  58. }  

打开两个客户端。记得代码中的IP地址要改成自己的PC机的IP地址。
实现效果:





===================================================================================
结束。
祝大家国庆节快乐!

下一节直接上手Photon服务器引擎吧。


Unity网络编程实战:从零构建TCP Socket聊天系统 网络通信是游戏开发与实时应用的核心技术,其基础在于理解客户端与服务器之间的数据传输原理。TCP协议以其可靠、有序的特性,成为聊天、状态同步等场景的常用选择。通过Socket编程,开发者能够直接操控连接建立、数据流读写与连接管理,深入掌握网络层的运作机制。这种底层实践不仅有助于解决消息粘包、拆包等典型问题,更能为后续理解与应用高级网络框架(如Photon、Mirror)打下坚实基础。本文聚焦于Unity客户端与.NET控制台服务器端的实战结合,详细解析了如何利用多线程处理并发连接、设计应用层协议,并安全地实现 阅读详情

相关推荐

Unity WebSocket聊天室:跨平台实时通信的端到端实现方案

WebSocket作为一种基于TCP的全双工通信协议,通过一次握手建立持久连接,实现了客户端与服务器之间的双向实时数据交换。其核心原理在于突破了传统HTTP请求-响应模式的限制,大幅降低了通信延迟和服务器开销,为需要高频、低延迟交互的应用场景提供了理想的技术基础。在游戏开发、在线协作、即时通讯等领域,WebSocket的技术价值尤为突出,能够支撑实时聊天、状态同步、数据推送等关键功能。结合当前热门的服务端技术如Node.js、.NET Core和Go语言,开发者可以构建高性能、可扩展的实时通信后端。本文以U

aobu0171的博客 584

unity 基于socket的多人群聊实现

通过c#开发服务器端,unity搭建客户端。实现客户端多用户之间消息的收发,类似于群聊的一种效果。 先看一下程序最终运行效果图: 服务端程序: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; usin

abcd5711664321的博客 486

Unity游戏网络通信实战:基于LiteNetLib实现高性能状态同步

网络通信是实时多人游戏开发的核心技术,其本质是在不同终端间高效、可靠地交换数据。基于UDP协议的网络库通过轻量级的设计,在保证低延迟的同时,可实现可靠的传输机制,这对于游戏开发中的状态同步至关重要。LiteNetLib作为一个轻量级、高性能的C# UDP网络库,为开发者提供了从底层协议到应用层的完整控制能力。它通过事件驱动模型和四种可选的传输模式(如Unreliable和ReliableOrdered),精准匹配游戏场景中不同数据类型的传输需求,例如高频位置更新与关键指令的可靠有序传递。在Unity中集成L

weixin_33743880的博客 588

Unity实现网络通信(UDP)

不同于TCP通信方式,UDP中服务端与客户端代码实现流程相似,如下:1.创建socket套接字对象2.利用Bind方法将本机地址与套接字绑定3.利用ReceiveFrom与SendTo方法进行通信4.用Shutdown方法释放连接5.关闭套接字本文中服务端与客户端通信,仅以相互发送字符串为例。通过创建对应的类对象并利用序列化与反序列化,也可以实现复杂数据的传输。

YuKar_的博客 5453

Unity3D多人在线游戏开发:从网络模型到实战同步

多人在线游戏开发的核心在于网络同步,它决定了玩家在虚拟世界中的互动体验。其基本原理通常围绕客户端-服务器模型展开,通过状态同步或帧同步等技术,确保所有玩家看到一致的游戏世界。这项技术的价值在于构建公平、可扩展的在线互动环境,广泛应用于MMO、FPS、MOBA等游戏类型。在Unity3D引擎中,借助Mirror或Netcode for GameObjects等框架,开发者可以高效实现玩家移动、属性同步和战斗等核心机制。例如,使用[SyncVar]自动同步玩家血量,并通过[Command]和[ClientRpc

weixin_34214500的博客 408

unity3d 实现多人聊天通讯

用unity3d实现的多人在线聊天通讯程序 包含服务器端(web程序),pc端客户端,Android客户端 支持多台手机,电脑在线聊天

基于Unity与C#控制台的局域网音视频通话解决方案

基于Unity与C#控制台的局域网音视频通话解决方案 前段时间由于工作上的需要,研究了一下局域网内音视频通话的需求,思路主要有以下几个点: Socket UDP协议 分包组包 RawImage加WebCamTexture Microphone加AudioClip 数据压缩 先说一下需求: 多人在局域网下,在不同设备\平台上进行音视频通话,通话质量要求不高。 平台用了Unity,到时候如果需要的话改该发布平台就好了,版本是2018.2.2f1。 相关代码贴一部分在最后,兄弟们就不要想复制全.

qq_28873519的博客 2846

unity实现Socket通讯(内含tcp粘包/拆包解决)

通过socket通讯实现服务器与客户端的连接。首先服务器利用udp广播发送自己的ip地址,客户端在收到广播后通过此ip以tcp连接的方式连接服务器来通讯。

Unity3D TCP聊天应用开发:从Socket通信到C/S架构实战

网络通信是实时交互应用的核心骨架,其基础在于理解客户端-服务器(C/S)模型与Socket编程原理。TCP协议通过三次握手建立可靠连接,确保数据有序、完整传输,为聊天、指令同步等场景提供稳定保障。在Unity3D中实现网络功能,需掌握多线程或异步编程,以处理网络IO操作,避免阻塞主线程。通过设计应用层消息协议(如长度+内容的格式)解决TCP粘包问题,并利用心跳机制维护连接活性。本文以构建一个完整的TCP聊天室为例,详解服务器端监听、连接管理、消息广播,以及Unity客户端的连接、数据收发与UI交互,涵盖**

weixin_30905981的博客 284

Unity的UDP传输

Unity的udp传输,适合新手,注释详细

最新推荐-2026年固态电池+锂电正极+硅基负极等关键技术实践PPT合集(55份).zip

2026年最新固态电池+锂电正极+硅基负极等关键技术实践PPT合集,共55份。供大家查阅。 一、固态电池 1.全固态电池用硅基负极材料研究进展 2.全固态电池硅基负极的开发思考 3.功能型固态电解质设计及界面调控 4.固态电池及关键材料研发与产业化进展 5.固态电池的产业化应用探索 6.固态锂电池开发现状及未来展望 7.固态锂离子电池正极结构设计与材料选择 8.固态锂金属电池设计与应用 9.硫化物全固态电池石墨和硅负极性能调控技术 10.硫化物固态电解质行业应用 11.聚合物基固态电解质与固态电池的关键技术 12.蜂鸟声共振技术-固态电池产业化的革命性创新 13.长安汽车固态电池应用探索 14.高安全性固态电池技术发展趋势 15.高性能硫化物全固态锂电池解决方案 16.高硅体系的膨胀解决方案 二、硅基负极 1.化学气相沉积碳包覆技术在硅基负极材料中的应用 2.新型粘结剂解决 硅基负极膨胀问题 3.氧化亚硅负极材料化学预锂化与界面设计 4.流化床法生产磷酸铁锂及硅负极材料研究 5.石墨烯包覆硅碳负极 6.硅基材料的发展现状及展望 7.硅基负极与固态电解质 8.硅基负极技术与进展 9.硅基负极材料体积膨胀解决策略 10.硅基负极材料及其结构设计 11.硅基负极材料的冶金法制备 12.硅基负极材料的发展与应用 13.硅基负极材料研究进展 14.硅基负极材料:从基础研究到产业应用 15.硅基负极析锂行为及调制研究 16.硅碳负极低成本制造技术报告 17.硅碳负极制备用多孔碳的开发 18.硅碳负极挑战和进展 19.硅碳负极新路线及关键材料制备 20.硅碳负极锂离子电池应力特性研究 21.锂电石墨负极材料工程化技术进步 22.锂离子电池负极材料 23.高容量石墨烯-硅基复合负极材料的研究进展 三、锂电正极 1.基于AI和图论结构化学的锂电池的材料基因探索 2.废旧磷酸铁锂电池梯次及再生利用进展 3.电动汽车大功率充电标准体系与检测认证实践 4.磷酸铁及磷酸铁锂异物防控管理 5.磷酸铁锂正极材料:液相法合成及产业化应用研究 6.磷酸锰铁锂正极材料的研究现状 7.车用动力电池安全标准化工作进展及未来展望 8.锂电层状氧化物正极材料的原子尺度失效机制 9.锂电正极材料工厂异物防控管理图册 10.锂离子电池高熵正极材料成分设计及储锂机制研究 11.高压实磷酸铁锂正极材料生产工艺配方.docx 12.高安全正极材料添加剂提升三元锂电安全性 13.高比能富锂锰基电池关键技术 14.高能量密度锂离子电池正极材料及应用研究 15.高镍单晶三元正极材料研究 16.三元高电压单晶正极材料

【游戏开发实战】Unity从零开发多人视频聊天功能,无聊了就和自己视频聊天(附源码 | Mirror | 多人视频 | 详细教程)

【游戏开发实战】Unity从零开发多人视频聊天功能,无聊了就和自己视频聊天(Mirror | 多人视频 | 清晰度切换)

linxinfa的专栏 1万+

CCS环境下ADC采样波形的实时可视化调试技巧

本文详细介绍了在CCS环境下实现ADC采样波形实时可视化的调试技巧。通过数组缓存优化、多通道同步显示和波形测量工具的高级用法,帮助开发者高效调试嵌入式系统中的ADC采样问题,提升信号分析的准确性和效率。

weixin_33712987的博客 420

【Unity/网络】Unity和内网穿透的网络测试 —— 以聊天室为例

首先先说一下写的聊天室案例使用MessageManager来作为RPC调用,提供全局添加Message方法的单例,其他类可以订阅对应的委托进行自己的处理,比如UI部分可以根据委托创建消息显示NetworkManager是Unity提供的网络类,配合UnityTransport实现网络的传输和连接的管理第一部分是输入消息内容并发送的部分第二部分是提供启动Host和Client的按钮部分第三部分就是消息的生成显示的部分。

Siro_sama的博客 1897

大模型辅助意图识别,更懂你的客户洞察平台

通过大量的学习和训练,大模型不仅具备庞大的知识库,更掌握着丰富的语言模式和语义规则,能够精准地理解每一段对话的含义,为每一通对话进行全面、准确的标注。主要来自客户的行为信息,将客户与机构的重要时刻以时间轴的方式呈现出来,掌握客户生命周期的完整脉络,识别一些容易被忽略的重要营销MOT(Moment Of Truth,关键时刻研究)机会,提示理财经理跟进处理。将客户的历史交易数据和埋点系统采集的客户行为数据结合起来,辅以部分内容资讯的偏好探测,综合分析和预测客户在各个维度的喜好程度,实现千人千面的客户推送。

Dezhuzhineng的博客 2162

FMCW雷达基本原理(通俗易懂)篇2

FMCW雷达(Frequency Modulated Continuous Wave Radar)是一种使用频率调制连续波的雷达系统。它使用一个发射器发射一个连续波,但是这个连续波的频率会在一定的范围内不断变化。当这个连续波遇到一个目标物体并被反射回来时,接收器会检测到这个反射波的频率变化,并计算出目标物体的距离和速度等信息。FMCW雷达的原理可以理解为:1.发射器发射一个连续波,这个波的频率会从一个固定的起始频率开始,逐渐变化至一个固定的终止频率。

研二小学鸡的博客 7694

Unity功能开发 多人聊天基于Socket的通讯功能

先看一下效果参数解释:1、AddressFamily: Socket 地址簇2、SocketType:指定Socket类的实例表示的的类型3、ProtocolType:Socket 类支持的协议IPEndPoint作用是用来封装ip和端口号 以便于指定一个唯一设备参数解释:1、ip地址2、端口号参数解释:参数为0时,是不做数量限制;其次就是参数决定数量。

m0_72857966的博客 602

STM32CubeMx + FatFs 实战:SD卡DMA传输中断回调问题深度解析

本文深度解析了在STM32CubeMx环境下,结合FatFs文件系统并使用DMA进行SD卡读写时,程序可能出现的“卡死”问题。核心原因在于HAL库的弱函数回调机制未被正确处理,导致DMA传输完成中断后,状态机锁死。文章提供了两种实战修复方案:直接修改HAL库文件或在用户代码中重写回调函数,并给出了关键的配置检查点与调试技巧,帮助开发者彻底解决SD卡DMA传输中断回调失效的难题。

weixin_29176179的博客 332

【游戏开发实战】Unity使用Socket通信实现简单的多人聊天室(万字详解 | 网络 | TCP | 通信 | Mirror | Networking)

教你Unity使用Socket通信实现简单的多人聊天室(网络 | TCP | 通信 | Mirror | Networking)

linxinfa的专栏 1万+

2025最新OSM中国矢量数据保姆级下载指南(附百度网盘链接)

本文提供2025年OSM中国矢量数据的保姆级下载与使用指南。详细介绍了通过Geofabrik镜像站、QGIS插件及第三方平台获取数据的多种途径,重点解析了Shapefile格式数据的结构、WGS84坐标系特性,并指导进行格式转换与基础GIS应用,帮助用户高效合规地获取并利用这份开放地理数据资源。

weixin_29228781的博客 884

全在这了!全国分省90米、30米、12.5米、5米DEM高程模型数据下载方式汇总

全在这了!全国分省90米、30米、12.5米、5米DEM高程模型数据下载方式汇总 SRTM15(450米)免费下载 https://pan.baidu.com/s/1eO0U6wfzs7YSe2EQdxRJ2Q提取码:o7am GMTED(250米)免费下载 https://pan.baidu.com/share/init?surl=nrbbdbhyNVQV46XwqzqLlg 提取码:V7X9 SRTM3 (90米)免费下载 https://pan.baidu.com/share/..

TuxinyunGIS的博客 1万+

unity开发:TCP socket网络连接

unity内部封装了一个很高层次的网络接口,不过有时候并不需要那么复杂的功能,只是想实现简单的TCP网络连接,可以在unity里面用C#写tcp socket。 以下TCP连接是同步模式。 建立两个unity工程,编写脚本。 服务端 using UnityEngine; using System.Collections; //引入库 using System.Net; us

踏莎行的博客 1万+

嵌入式STM32F407CET6移植OpenHarmony系统方法

文件末尾添加:export PATH=~/gcc-arm-none-eabi-10-2020-q4-major/bin:$PATH。编译完成文件输出在LiteOs源码目录下out/STM32F407_ATK_Explorer文件夹中。②点击connect to the target,下方会自动显示识别出来的芯片型号以及flash大小。⑤点击program verify并点击start,等待烧写并校验完成,你就能看到程序正在运行了。,在选择刚才我们说的Huawei_LiteOS.hex文件。

嵌入式技术开发 547

Unity中Socket,Tcp,Udp网络连接协议总结

详细解释Socket通信,Tcp同步与异步通信,Udp同步与异步通信,单播和组播的功能

qq_39332021的博客 4013

可维护的 SAP UI5 Theming 策略:从 CSS 级联与特性选择器到 UI Theme Designer 的工程化落地

摘要:SAP UI5主题化是一个涉及CSS级联、选择器特异性和主题参数的系统工程,与应用逻辑解耦以实现品牌化和无障碍适配。轻量级调整优先使用附加CSS,重大改动才考虑创建新主题。样式冲突需通过特异性原则解决,避免滥用!important。动态添加样式应使用addStyleClass而非直接操作DOM。主题可通过bootstrap参数、URL或运行时API设置,企业级主题推荐使用UI Theme Designer。自定义内容应消费主题变量以实现一致性,避免直接修改控件内部结构或内联样式。工程化落地需规范分层和

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 307

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

unity的tcp和udp

近来有需求如下:局域网内两个人合作拆装一个东西,比如汽车引擎。于是开始学习socket通信。还好网上这个教程已经很多了,整理了一下自己拿过来用了。 最开始用的是UDP,因为想着客户端A做了什么直接扔给服务器然后服务器再扔给客户端B(反过来也一样)就完事了。 udp客户端和服务器端的基类: using UnityEngine; public abstract class BaseUDP : Mon...

带酒书生的博客 2526

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

上一篇: Photon服务器引擎(一)Photon简介
下一篇: 关于Unity动画系统优化,你可能遇到这些问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值