Unity3D笔记——TCP简单服务器和客户端的连接和异步接受

unity使用Tcp/UDP协议网络通信实现(Socket简单应用) 服务器端: 1.打开vs,创建一个c#的控制台应用程序 代码如下 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Net.Sockets; using System.Net; namespace Socket服务器端 { class Program { static 阅读详情

前言:Unity3D笔记是我平时做一些好玩的测试和研究,记录的笔记。会比较详细也可能随口一提就过了。 所以大家见谅了,内容一般都会是原创的(非原创我会注明转载)。由于很多内容其他的朋友也肯定研究发表过,大家请指出错误。

公司需要做个简单的答题游戏,然后是局域网的四台固定设备,互相组队开始比赛答题。然后肯定需要用到网络啦,想啦下,需要有房间的思想。为了节约成本,就让其中先开局当服务器(房间),再用UDP广播出去地址,其他机器会知道服务器地址 之后在接入,开始游戏。 最后协议打算用TCP的,今天就打了稿子实现简单的功能;(感谢《unity3D网络游戏实战》对我帮助很大)。


直接上代码:服务器的

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

public class GameServer : MonoBehaviour {

    private Socket listenSocket;

 
    //客户端的池
    private List<Unit> conns = new List<Unit>();


	
	void Start () {
		
	}

    /// <summary>
    /// 开启服务器
    /// </summary>
    public void StartServer(string host,int port)
    {
        //实例化套接字
        listenSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);

        //定义端口和地址
        IPEndPoint iPEndPoint = new IPEndPoint(IPAddress.Parse(host),port);

        //将套接字和端口绑定
        listenSocket.Bind(iPEndPoint);

        //定义不能超过4个客户端接入
        listenSocket.Listen(4);

        //开始接入
        listenSocket.BeginAccept(AcceptCb,null);

        Debug.Log("GameServer is Open");
    }

    /// <summary>
    /// 关闭服务器
    /// </summary>
    public void CloseServer()
    {

        foreach (var item in conns)
        {
            item.socket.Close();
        }

        listenSocket.Close();
    }


    /// <summary>
    /// AcceptCb的回调
    /// </summary>
    /// <param name="ar"></param>
    private void AcceptCb(IAsyncResult ar)
    {
        try
        {
            //获取接入的socket
            Socket socket = listenSocket.EndAccept(ar);

            //实例化一个conn对象
            Unit conn = new Unit(socket);

            //放入客户端池子中
            conns.Add(conn);

            //开始异步接受,并把conn对象传过去
            conn.socket.BeginReceive(conn.readBuff,0,conn.readBuffCount,SocketFlags.None,ReceiveCb,conn);

            //继续监听接入
            listenSocket.BeginAccept(AcceptCb, null);
        }
        catch (Exception e)
        {
            Debug.LogError(e.Message);
            throw;
        }
    }


    /// <summary>
    /// 异步接受的回调
    /// </summary>
    /// <param name="ar"></param>
    private void ReceiveCb(IAsyncResult ar)
    {
        //获取该异步接受的客户端套接字
        Unit conn = (Unit)ar.AsyncState;

        try
        {
            //接受的到的数据长度
            int count = conn.socket.EndReceive(ar);

            //数据处理
            string str = System.Text.Encoding.UTF8.GetString(conn.readBuff,0,count);

            Debug.Log(str);

            //开始异步接受,并把conn对象传过去
            conn.socket.BeginReceive(conn.readBuff, 0, conn.readBuffCount, SocketFlags.None, ReceiveCb, conn);
        }
        catch (Exception e)
        {
            Debug.LogError(e.Message);
            throw;
        }
    }
}


/// <summary>
/// 客户端对象
/// </summary>
public class Unit {

    /// <summary>
    /// 用于存储客户端的套接字
    /// </summary>
    public Socket socket;

    /// <summary>
    /// 接受数据的缓存空间
    /// </summary>
    public byte[] readBuff = new byte[1024];

    public int readBuffCount = 1024;

    /// <summary>
    /// 构造函数
    /// </summary>
    /// <param name="socket"></param>
    public Unit(Socket socket)
    {
        this.socket = socket;
    }

}

说明:服务器的建立有这么几个顺序:1.建立套接字(socket);2.bind本地的地址和端口;3.开始监听客户端的接入(这边需要用异步的,不然会卡死);4.如果客户端接入了,获取其socket 开始异步接受信息。并将客户端信息保存在自己池子里。5.可以向客户端发送信息(我没做,代码和客户端本地发信息一样的);


客户端的代码:

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

public class GameClient  {

    //服务器端的地址
    public string serverHost;

    //服务器端的端口
    public int serverPort;

    //套接字
    public Socket socket;

    public byte[] readBuff = new byte[1024];

    private int readBuffSize = 1024;


    /// <summary>
    /// 向服务器请求接入
    /// </summary>
    /// <param name="host"></param>
    /// <param name="port"></param>
    public void Connetion(string host,int port)
    {
        //实例化套接字
        socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);

        socket.Connect(host, port);

        //开始异步接受数据
        socket.BeginReceive(readBuff,0,readBuffSize,SocketFlags.None,ReceiveCb,null);
    }


    /// <summary>
    /// 异步接受的回调
    /// </summary>
    /// <param name="ar"></param>
    private void ReceiveCb(IAsyncResult ar)
    {
        //收到数据的长度
        int count = socket.EndReceive(ar);

        try
        {
            //处理收到的数据
            string str = System.Text.Encoding.UTF8.GetString(readBuff,0,count);

            //继续开始异步接受数据
            socket.BeginReceive(readBuff, 0, readBuffSize, SocketFlags.None, ReceiveCb, null);
        }
        catch (Exception e)
        {
            Debug.LogError(e.Message);
            throw;
        }

    }


    /// <summary>
    /// 发送数据
    /// </summary>
    /// <param name="data"></param>
    public void Send(string data)
    {
        byte[] bytes = System.Text.Encoding.UTF8.GetBytes(data);

        try
        {
            socket.Send(bytes);
        }
        catch (Exception e)
        {
            Debug.LogError(e.Message);
            throw;
        }
    }
}

说明:客户端就简单多了,照例说下顺序:1.建立套接字;2.向服务器申请接入(这里需要知道目标服务器的地址和端口了,局域网需要广播接受到,大家可以看我之前的文章有UDP的广播);3.向服务器发送信息;4.接受服务器发送来的信息(我没做,参照服务器的接受);


小结:答题的项目,我可能会一直记录下其中需要的知识。希望对大家有帮助;项目我就不放了,就两个代码;

Unity3d 游戏与C 服务器 异步Socket 交互 一 阅读详情

相关推荐

Unity3D服务器AStar寻路与客户端同步显示验证架构详解

在游戏开发中,寻路算法是实现智能移动的核心技术,而AStar算法因其高效和灵活被广泛应用。其原理是通过评估节点代价,在网格或导航网格中寻找最优路径。在网络游戏中,将寻路逻辑置于服务器端,能确保所有客户端基于同一套规则计算路径,从而维护游戏状态的权威性和一致性,有效防止作弊。这一技术方案对于保障多人在线游戏的公平体验至关重要,尤其在MMORPG、MOBA等需要复杂地形交互的场景中。本文聚焦于服务器AStar寻路与客户端同步显示验证的完整实现,深入探讨了客户端预测、插值及纠错机制,以解决网络延迟带来的操作响应与

weixin_34320159的博客 424

【Unity】Socket网络通信(TCP) - 实现简单的多人聊天功能

unity实现非常简单的多人聊天功能,内含工程文件下载地址,免积分下载!

weixin_43453797的博客 9150

Unity3D MMORPG游戏服务器与客户端源码深度解析与部署实践

在游戏开发领域,客户端-服务器(C/S)架构是构建大型多人在线游戏(MMORPG)的基石。其核心原理在于将游戏逻辑处理与数据存储集中在服务器端,以保证游戏状态的权威性和一致性,而客户端则主要负责渲染与用户交互。这种架构的技术价值在于能够有效管理海量玩家的并发交互,并防止作弊。其典型应用场景包括大型多人在线角色扮演游戏、开放世界游戏等。本文聚焦于一套基于Unity3D引擎和C# .NET Core技术栈的MMORPG源码,深入剖析其网络通信、数据持久化等核心模块的实现,并提供了从环境搭建到功能扩展的完整实践路

aofan9566的博客 433

Unity3D之TCP网络通信(客户端)

在C#中,封装好了两个核心类,用于TCP网络编程:在Unity开发中,要注意所有与网络相关的操作都应该在协程或异步任务中执行,以避免阻塞UI线程。C#中的异步操作使用async和await是配合使用的,async是修饰方法X的,await在被async修饰的方法里做标记,标记着一条语句y,主程序运行时候是逐方法逐语句的从上到下执行的,当主程序执行到被async修饰的X方法的时会进入该方法里一步一步的执行语句,当遇到被await标记的y语句的时分叉,主语句会跳出X方法,继续执行X方法下面的方法和语句。而y语句

yizhou2010的专栏 2106

Unity3D与C#打造简易客户端-服务器聊天系统

搭建一个健壮的服务器基础架构是开发任何网络应用程序的首要步骤。在C#中,常用的服务器框架包括ASP.NET Core和.NET Core。搭建服务器涉及多个方面,包括环境配置、服务器架构设计以及后续的扩展与维护。为了确保服务器的稳定运行,还需要考虑到负载均衡、故障转移以及性能监控等问题。套接字(Socket)是网络通信的基本操作单元,是计算机网络中进行数据交换的一种抽象概念。它允许程序通过网络发送和接收数据。

weixin_35094083的博客 364

Unity3D中实现Socket异步聊天室项目

网络通信是多人在线游戏的灵魂,它允许来自世界各地的玩家通过互联网相互连接、交换信息并共同享受游戏体验。要实现这一点,游戏服务器必须能够处理来自不同客户端的请求,同时确保所有玩家的数据实时、准确地同步。网络通信涉及到的技术包括数据传输、网络协议、连接管理、数据包处理等。游戏开发者在设计通信机制时,需要考虑的关键因素包括延迟、带宽、可靠性和安全性。

weixin_42584507的博客 1118

Unity3D TCP网络通讯核心意涵与基本原理详解

在Unity3D中,TCP网络通讯是一种常用的通讯方式,它可以实现可靠的数据传输和连接。对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀本文将详细介绍Unity3D TCP网络通讯的核心意涵与基本原理,包括技术详解和代码实现。一、TCP网络通讯的核心意涵TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输协议,它在网络通讯中被广泛应用。TCP建立了一种可靠的、全双工的数据传输通道,确保数据的完整性和可靠性。

Thomas_YXQ的博客 2217

Unity3D实现UDP通信完整示例

Unity3D作为一款功能全面的游戏开发平台,为开发者提供了一站式的解决方案,无论是2D还是3D游戏的开发。它支持多种操作系统和游戏平台,包括PC、移动设备以及游戏主机。Unity3D拥有强大的图形渲染能力,使得游戏的视觉效果达到高质量的水准。Unity3D内置了物理引擎、粒子系统、脚本编写工具等,极大地简化了游戏开发流程。此外,Unity3D的编辑器提供了直观的界面和强大的场景构建功能,开发者可以轻松地通过拖拽组件来设计和实现复杂的交互逻辑。

weixin_42430341的博客 1536

在Unity中实现TCP通信(附完整工程)

本篇博客讲述了如何在unity中实现简单的TCP通信功能,包含服务器端与客户端,并配有简易的交互界面,用来显示一些状态信息以及接收和发送的数据。

qq_39748832的博客 2万+

保姆级教程:用高云GW2A开发板搭建RISC-V软核处理器(含DDR3内存优化配置)

本文提供了一份详细的保姆级教程,指导开发者使用高云GW2A-LV18PG256C8 FPGA开发板搭建RISC-V软核处理器系统。教程涵盖了从开发环境搭建、PicoRV32软核集成,到关键的DDR3内存控制器配置与优化,并深入讲解了时序约束与系统调试方法,帮助初学者和爱好者实现从逻辑设计到软硬件协同的深度实践。

2a4s6d8f0g的博客 564

通信工程学习:什么是ASK振幅键控、FSK频移键控、PSK相移键控

ASK、FSK和PSK是三种基础数字调制技术。ASK通过改变载波振幅传输信息,实现简单但抗干扰弱;FSK利用频率变化传递信号,抗干扰较强但频谱利用率一般;PSK通过相位变化编码数据,抗干扰和频谱效率最优但同步要求高。三种技术各具特点,分别适用于不同通信场景:ASK用于低速光纤通信,FSK常见于无线广播,PSK则广泛应用于Wi-Fi、蓝牙等现代通信系统。

limengshi138392的博客 8717

Unity3D游戏制作学习记录02——丛林战争

Unity3D游戏制作学习记录02——丛林战争 Siki学院的视频教程指路牌:http://www.sikiedu.com/course/61. 一、服务器端——消息接收的异步处理 由于之前使用Receive()方法来接受消息,是在等待消息的过程中一直执行,直到接收到消息了才会继续执行下面的代码,因此接收消息的方式是同步的。 这样的接收就只能一条一条的接收处理,不太符合实际的需求,所以就需要有异步的处理了。 异步处理调用的接收消息的方法是BeginReceive(),其中的参数是,接收到消息后会执行什么方法

LAUGINJI的博客 1299

ANSYS Maxwell:创建即用型 3D 轴向磁通电机模型

Magnet Length” 是磁体的径向长度。“Magnet Thickness” 是磁体的轴向长度。为了对 AFM 进行更详细的分析,用户需要在 ANSYS Maxwell 中运行 3D FEA 分析。对于 2D 模型,它们类似于 MotorCAD 中的模型,后者对等效的直线电机进行建模。单击“确定”后,将创建一个 3D Maxwell 模型。“长度”是转子铁的轴向长度。然后需要定义定子的“磁芯”尺寸和材料。“长度”是定子铁芯的轴向长度。“转子”# 的极数必须与“定子”中定义的磁极相同。

jkh920184196的博客 1152

罗培羽-Unity3D网络游戏实战(第2版)学习笔记一

网络上的两个程序通过一个双向的通信连接实现数据交换、这个连接的一端成为一个socket。socket一般包含了进行网络通信必需的五大信息:连接使用的协议、本地主机ip地址、本地的协议端口、远程主机的ip地址、远程协议端口比起异步程序,同步程序更加的简单明了,而且不会引发线程安全问题,只需要在阻塞方法前加上一层判断,当有数据可读才调用Receive,有数据可写才调用Send,这样就既能够实现功能,又不会卡住程序。于是,微软给Socket类提供了Poll方法。

qq_53663718的博客 3230

Unity - gamma space下还原linear space效果

还有头发之后的 (头发没有处理完整,因为使用 ASE 连连看练出来的,使用 surface shader,虽然可以生成一下 vert, frag 的方式在修改,但是我懒得去修改了,这样就是 PBR 的 BRDF 里面的部分曲线是不一样的,所以可以看到头发有一些差异)其实上面的代码判断 是否有分量 > 1.0f 的方式来判断是否 HDR 是不太合理的,因为不同的贴图格式的编码方式不同。还有比较隐蔽的一些颜色相关的常量值 (比如PBR中的 绝缘体的 F0 常量值,等等)

Jave.Lin 的学习笔记 2829

保姆级教程:用BIGEMAP和Global Mapper搞定5米精度DEM高程数据下载与处理

本文提供了一份详细的5米精度DEM高程数据处理教程,涵盖从BIGEMAP下载到Global Mapper处理的完整流程。通过实战案例和避坑指南,帮助用户掌握高效下载DEM数据、优化等高线生成及坐标系转换的关键技巧,适用于GIS新手和专业人士。

weixin_34169322的博客 389

Unity简单搭建小服务器和客户端-----------客户端部分

分为两个Unity项目 一个是SeverTest01 用于Unity的服务器部分 --------- 关于服务器部分的 一个是SocketTest01 用于Unity的客户端部分 初步学习只有简单的服务器和客户端连接,并且发送消息回复,算是一个学习记录 分为如下几个脚本 依然还是 代码展示部分 using System.Collections; using System.Collec...

hennysky的博客 2443

解决【x2openEuler环境检查未通过——CheckRepoCurlActor不通过】问题

摘要:x2openEuler使用默认repo源时出现环境检查失败问题,原因是默认源返回308永久重定向错误。解决方法包括:1)为CentOS主机配置华为yum源;2)在x2openEuler Web界面修改为自定义可用源。具体步骤包括备份原源、下载华为源、清除缓存,并通过curl测试确认新源可用性。最终成功配置openEuler-24.03-LTS-SP1版本的repo源后,环境检查顺利通过。

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 258

unity3d Socket异步连接(附带一个案例)

socket同步 同步就是有阻塞,比如接收数据时如果没有数据就等待,等到有数据了再执行下一步代码。 socket异步 异步就不用等待,比如指定接收数据后就会继续执行一下步代码,等到有数据了再跳出当前执行的代码转去执行异步调用。 同步的话通常要配合多线程(否则在阻塞的时候当前线程会停止,如果当前线程是UI线程就表现出好像界面停止的样子)。 左边是客户端右边是服务器 服务器储存客户集合客户类(服务器的) using System; using System.Collections....

qq_57896821的博客 2641

Matplotlib之bar3d画3D柱状图

3D柱状图通常用于展示数据集中不同分类项的数据大小或数量。与普通的柱状图相比,3D柱状图更适合展示数据的三个维度 3D 柱状图 按行/列涂颜色 柱加阴影、描黑边 自定义座标轴名、刻度标签、范围

我走的每一步都算数 1120

【ComfyUI】Wan2.2 Animate 动作迁移重绘视频生成

本文介绍了一个基于ComfyUI的Wan2.2 Animate视频生成工作流,通过动作迁移和视频重绘技术实现高质量视频创作。该系统融合视频帧重建、动作迁移、图像重绘和音频合成等多种AI技术,核心采用Wan2.2 Animate 14B_fp8模型配合专属VAE解码器和LoRA微调模块。工作流程包含输入预处理、模型加载、特征提取、动作采样生成、解码输出和资源清理六个阶段,通过WanVideo系列节点实现从图像/视频输入到最终视频输出的完整处理。系统支持对参考图像进行视觉特征提取和嵌入生成,结合文本/动作嵌入进

Mr数据杨 2444

笔记|Unity异步处理与UI Text显示的问题

学更好的别人,做更好的自己。——《微卡智享》本文长度为2323字,预计阅读6分钟前言这阵子一有空就在研究Unity3D网络通讯,使用过程中访问通过协程的方式收到返回的数据直接更新Text...

Vaccae的博客 921

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

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

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

weixin_30905981的博客 284

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

c# 异步处理 socket TCP转UDP服务

//定义线程和连接对应数组 Dictionary<string, Socket> dictSocket = new Dictionary<string, Socket>(); Dictionary<string, Thread> dictThread = new Dictionary<string, Thre...

幻辰科技 nbhctec.com 585

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Tcp网络通讯详解

Tcp通讯 一款网络游戏分为客户端和服务端两个部分, 客户端程序运行在用户的电脑或手机上,服务端程序运行在游戏运营商的服务器上。多个客户端通过网络与服务端通信。TCP 连接指的是一种游戏中常用的网络通信协议, 与之对应的还有UDP 协议、KCP 协议、HTTP 协议等。本片文章只讨论Tcp通讯。 先来认识Socket 网络上的两个程序通过一个双向的通信连接实现数据交换, 这个连接的一端称为一...

司军礼的博客 2982
上一篇: Unity3D笔记——unity2d Sprite 泛白
下一篇: Unity3D笔记——解决Unity官方《Tanks》同时启动会创建两个服务器问题
YYL_Debug
博客等级 码龄10年 14粉丝 8原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值