unity使用Tcp/UDP协议网络通信实现(Socket简单应用)

2023-11-06

一.TCP协议

服务器端:

1.打开vs,创建一个c#的控制台应用程序
代码如下(记得把ip换成自己电脑ip)

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 void Main(string[] args)
        {
            //创建一个socket对象
            Socket tcpServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//寻址方案,套接字类型,协议类型

            //2.绑定一个ip和端口
            //ip用自己电脑ip
            //IPAddress ipaddress = new IPAddress(new byte[] { 192,168,1,104 });
            IPAddress ipaddress = IPAddress.Parse("192.168.1.104");//将一个字符串类型的ip地址转化成一个IPAddress的对象
            EndPoint endpoint = new IPEndPoint(ipaddress, 5000);
            tcpServer.Bind(endpoint);//向操作系统申请一个可用的ip和端口号用来通讯


            //3.开始监听客户端的连接请求
            tcpServer.Listen(100);//最大连接数
            Console.WriteLine("服务器启动完成");
            Socket clientSocket = tcpServer.Accept();//暂停当前线程,直到一个客户端连接过来

            Console.WriteLine("接收到客户端的连接请求!");

            //4.发送/接受消息
            string message = "Hello Client";
            var data = Encoding.UTF8.GetBytes(message);//将字符串转化成字节数组
            clientSocket.Send(data);//发送
            Console.WriteLine("服务器向客户端发送了一条消息:" + message);

            //接受客户端消息
            byte[] data2 = new byte[1024];//存放消息的字节数组容器
            int length = clientSocket.Receive(data2);
            string message2 = Encoding.UTF8.GetString(data2, 0, length);//bytes转化成string
            Console.WriteLine("服务器接收到客户端发送过来的消息:"+message2);
            Console.Read();


        }
    }
}
客户端:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Net.Sockets;
using System.Net;
using System.Text;

public class SocketClient : MonoBehaviour
{
    private Socket tcpClient;
    private string serverIP = "192.168.1.104";//这个ip用自己电脑ip
    private int serverPort = 5000;

    // Start is called before the first frame update
    void Start()
    {
        //1.创建一个Socket
        tcpClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        //2.建立连接请求
        IPAddress ipaddress = IPAddress.Parse(serverIP);
        EndPoint endPoint = new IPEndPoint(ipaddress, serverPort);
        tcpClient.Connect(endPoint);
        Debug.Log("请求服务器连接");

        //3.接受/发送消息
        byte[] data = new byte[1024];
        int length = tcpClient.Receive(data);
        var message = Encoding.UTF8.GetString(data, 0, length);
        Debug.Log("客户端接收到服务器发来的消息:" + message);


        //发送消息
        string message2 = "Client Say To Server Hello";
        tcpClient.Send(Encoding.UTF8.GetBytes(message2));
        Debug.Log("客户端向服务器发送消息"+message2);
        


    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

代码配置完成之后

运行服务器端

在这里插入图片描述可以看到控制台已经运行起来了

然后运行unity工程

在这里插入图片描述
在这里插入图片描述
成功了
代码中有注释,有时间的话仔细看一遍,搞懂
特点效果(客户端可以一直向服务器发送消息,服务器也可以一直接收消息):

二.UDP协议

服务器端
using System;
using System.Net.Sockets;
using System.Net;
using System.Text;

namespace C_高级课程练习
{
    /// <summary>
    /// Description of UDP_my.
    /// </summary>
    public class UDP_my
    {
        public UDP_my()
        {
        }
        public static void Main(string[] args)
        {
            //建立udp服务器,参数2:udp协议以数据报的方式传输,参数3:UDP协议
            Socket udpServer = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            //为服务器绑定IP
            IPAddress ip = IPAddress.Parse("192.168.1.104");
            EndPoint ep = new IPEndPoint(ip, 3456);
            udpServer.Bind(ep);
            //接收数据
            EndPoint endP = new IPEndPoint(IPAddress.Any, 0);
            string message;
            byte[] data = new byte[1024];
            int length = 0;
            //把数据的来源放到第二个参数上
            while (true)
            {
                length = udpServer.ReceiveFrom(data, ref endP);
                message = Encoding.UTF8.GetString(data, 0, length);
                Console.WriteLine("从IP:" + (endP as IPEndPoint).Address + "取到了消息:" + message);
            }
        }
    }
}
客户端
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Net.Sockets;
using System.Net;
using System.Text;
using System;
using UnityEngine.UI;
using System.Threading;

public class UDP_Test : MonoBehaviour
{
    private Socket udpClient;//创建客户端
    private IPAddress ip;
    private EndPoint ep;
    private byte[] data = new byte[2048];//用来接收和发送数据
    private int length = 0;
    private string message;
    public Text inputText;//输入栏
    public Text outputText;//显示栏
    private string allMessage;
    void Start()
    {
        UDPInit();
    }

    private void UDPInit()
    {
        //建立udp客户端,参数2:udp协议以数据报的方式传输,参数3:UDP协议
        udpClient = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        //发送信息准备工作
        ip = IPAddress.Parse("192.168.1.104");
        ep = new IPEndPoint(ip, 3456);
    }
    public void SendMessageToServer()
    {
        message = inputText.text;//得到输入框中的信息
        inputText.text = "";
        data = Encoding.UTF8.GetBytes(message);
        allMessage += message + '\n';
        outputText.text = allMessage;//将要发送的信息显示出来
        udpClient.SendTo(data, ep);
    }
}

在这里插入图片描述
参考博文:https://blog.csdn.net/hyy_sui_yuan/article/details/81279365

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

unity使用Tcp/UDP协议网络通信实现(Socket简单应用) 的相关文章

  • linux send recv函数详解

    2009 05 10 21 55 int send SOCKET s const char FAR buf int len int flags 不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数据 客户程序一般用sen
  • 游戏开发unity编辑器扩展知识系列:修改纹理资源的TextureType

    需要用TextureImporter导入资源 调用如下代码 TextureImporter importer TextureImporter TextureImporter GetAtPath path importer textureTy
  • Unity 资源加载卸载过程

    什么时候才是UnusedAssets 看一个例子 Object obj Resources Load MyPrefab GameObject instance Instantiate obj as GameObject Destroy in
  • Unity中loading页加载的实现

    首先创建一个Global cs 使用单例用于存储场景的名字 便于后续脚本的调用 此脚本不必挂载在游戏物体上 using UnityEngine using System Collections public class Global Mon
  • Unity Animator 动画没切换

    恶魔射手 Survival Shooter 项目 有两个动画 一个是静止时的Idle 一个是走路时候的Move 如下图 设置好动画状态机后发现按方向键后还是Idle 没反应 而一直按着方向键后呢又动起来了 最后找到了真相 原来选中了 Has
  • unity制作一个可以自由滑动收缩的历史记录功能。

    公司在做一款模拟经营类的卖车游戏 需要一个简单的历史记录功能 放在左上角 记录最近20条的收入 支出记录 超过2秒不动则收起 收起时展示最近的一个消息记录 用到的组件是ScrollView 使用方法可以参考我写过的一篇博客 ScrollVi
  • c#获取cpu序列号

  • Unity 粒子特效、材质发光 HDR ShaderGraph图文教程[完成lit发光设置]

    效果如图 准备工作 在hdr模式下 关闭Directional Light 相机设置 移动球挂一个点光源作为子节点 设置自行调节 0 创建移动球的材质及shader shader gt 在Project Create Shader Grap
  • Unity Shader入门精要第七章 基础纹理之遮罩纹理

    Unity系列文章目录 文章目录 Unity系列文章目录 前言 一 实践 参考 前言 遮罩纹理 mask texture 是本章要介绍的最后一种纹理 它非常有用 在很多商业游戏中 都可以见到它的身影 那么什么是遮罩呢 简单来讲 遮罩允许我们
  • Unity中UI框架的使用1-添加面板、显示Loading页面

    其中BasePanel和Canvas都是挂在面板的预制物上的 1 导入我们的UI框架 本篇文章中有用的是两个UIPanelType NUIManager和NBasePanel 会放在文章最后供大家使用 2 先将我们做好的Panel设置成预制
  • GooglePlay提审警告(com.google.android.gms:play-services-safetynet:17.0.0)

    1 Goole在今年6月份出的新政策 不在使用safetynet 而使用Play Integrity API 2 项目本身没有使用过safetynet 3 使用了firebase 查阅资料 解决方案如下 implementation pla
  • Unity 键盘控制人物移动——之输入方式代码的编写

    键盘输入 控制人物移动 在我们制作游戏中最常见的需求之一就是使用键盘移动游戏角色 那么我们首先需要获取键盘输入 以下提供两种方法获取键盘 这里尽量通过截图解释让大家理解代码的含义 GetInput void FixedUpdate Move
  • 【Unity】按Esc进入操作菜单

    本文章是基于如下视频的自我总结 https www youtube com watch v JivuXdrIHK0 步骤如下 1 在Canvas 界面添加一个Panel Panel中添加一个按钮 调整按钮的大小为合适大小 调整字体的大小为合
  • Unity万向节死锁解决方案(2023/12/4)

    1 万向节死锁无法解决 这是因为它的特性就是如此 就像玻璃杯就是玻璃 这不可否认 别钻牛角尖昂 2 大多数情况下欧拉角足够用 例如 CF 摄像机不可能绕z轴旋转 x轴旋转也不会超过九十度 因为那样人物的腰子会被扭断 塔防游戏 保卫萝卜 吃鸡
  • unity3d 自定义的图片无法放入source image中

    须将图片的texture type改为 sprite
  • 【转载】【Unity】WebSocket通信

    1 前言 Unity客户端常用的与服务器通信的方式有socket http webSocket 本文主要实现一个简单的WebSocket通信案例 包含客户端 服务器 实现了两端的通信以及客户端向服务器发送关闭连接请求的功能 实现上没有使用U
  • 【Unity】运行时创建曲线(贝塞尔的运用)

    Unity 运行时创建线 贝塞尔的运用 1 实现的目标 在运行状态下创建一条可以使用贝塞尔方法实时编辑的网格曲线 2 原理介绍 2 1 曲线的创建 unity建立网格曲线可以参考 Unity程序化网格体 的实现方法 主要分为顶点 三角面 U
  • Unity中URP下的指数雾

    文章目录 前言 一 指数雾 雾效因子 1 FOG EXP 2 FOG EXP2 二 MixFog 1 ComputeFogIntensity 雾效强度计算 2 lerp fogColor fragColor fogIntensity 雾效颜
  • 游戏开发创建操作之玩家信息系统的建立

    游戏一般都需要玩家信息系统 那么我们应该如何搭建玩家信息系统 接下来我将展示一种简单的方法 完整代码如下 using System Collections using System Collections Generic using Uni
  • 游戏开发常见操作梳理之NPC药品商店系统(NGUI版)

    后续会出UGUI Json的版本 敬请期待 游戏开发中经常会出现药品商店 实际操作与武器商店类似 甚至根据实际情况可以简化设置 废话不多说 直接上代码 药品商店的源码 using System Collections using Syste

随机推荐

  • 如何正确配置nginx php,php – 如何在nginx中正确配置alias指令?

    我一直在尝试在我的Nginx网络服务器上配置多个webapp但我无法使用一个需要将 document root设置为laravel公共文件夹的Laravel应用程序 我目前正在尝试使用别名指令配置它 但由于一个不明确的原因 这不起作用 这是
  • PHP本地项目及docker项目的debug安装和vscode、phpstorm中具体使用教程

    查看本地PHP应该下载的xdebug版本 点击进入网址 https xdebug org wizard 将本地phpinfo的信息复制放到文本框中就可以查看与本地适配的xdebug版本 按指令安装xdebug 按照上面的步骤下载文件 移动文
  • 让WordPress不同的分类目录的文章调用不同的模板

    近日 因为网站建设的需要 在没有使用自定义文章类型的情况下 使用不同的分类目录里的文章调用不同的模板 作为注册wordpress大学的见面礼 首先在function php里 添加如下代码 获取并输入某个分类的子分类 function po
  • 解决choice金融终端Excel/Wps插件修复visual basic异常

    注意 如下情况无解 注意 Excel要用专业版 家庭版的Excel无法修复 WPS要用企业版 个人版的Wps无法修复 解决方法 下面是安装Office专业版的教程 进入网站https msdn itellyou cn 下载office专业版
  • Unity自定义输入方式(通过可视化面板进行输入)

    去年某个时间段做VR功能预研 利用Pico一体机做开发 当时通过Unity内置Inputfield组件实现外部输入 该组件貌似是调用系统内置输入方式 Pico一体机那个时候的输入方式简则是蛋疼得很 因为一调用该输入法就是双目模式 这就算了
  • Matlab程序设计(六)----创建函数(function)

    本部分Matlab中的函数创建非常重要 主要分为三个小部分 本部分主要参考了Matlab文件的讲述 https ww2 mathworks cn help matlab function basics html 一 函数基本知识 funct
  • Elasticsearch专栏-8.es读写性能及优化

    es读写性能及优化 写入性能 服务器资源 单机写入性能 写入性能优化 查询性能 资源占用情况 写入性能 服务器资源 资源 数值 服务器 华为 系统 centos7 9 cpu Intel Core i5 10500 CPU 3 10GHz
  • C#控制台应用程序生成10个随机数,并且保证他们不重复

    1 这个和上面那个代码不同 随机生成的10个随机数是会重复的 因为它不确定 所有我们在函数中加了一个判断函数 将重复的数去掉就可以了 using System using System Collections using System Co
  • UML建模与软件开发设计(四)——包图设计

    包图清晰地表达了包间关系 对于大型项目而言 良好的代码组织 对软件的可维护性至关重要 软件的架构设计 思路遵循由大到小 因此大型项目的结构往往从子系统 模块 包开始进行设计 与类图 Class Diagram 相比 包图 Package D
  • linux top命令查看内存及多核CPU的使用讲述

    查看多核CPU命令 mpstat P ALL 和 sar P ALL 说明 sar P ALL gt aaa txt 重定向输出内容到文件 aaa txt top命令 经常用来监控linux的系统状况 比如cpu 内存的使用 程序员基本都知
  • elasticsearch启动报错

    系统 操作centos7 虚拟机 bin elasticsearch 启动报错 es1 es1 software elasticsearch 6 3 1 bin elasticsearch Exception in thread main
  • 误差函数erf

    1 erf误差函数介绍 erf 是误差函数 它是高斯概率密度函数的积分 性质 2 erf误差函数在matlab中实现 erf函数在matlab里面可以直接作为内置函数使用 erf 0 与下面式子等价 syms s f f exp s 2 e
  • AcWing 3375. 成绩排序

    题目 题目链接3375 成绩排序 思路 思路要求稳定排序或者特判的快排 写法一 写两个sort中的比较函数的参数cmp 写法二 直接在结构体中进行比较 写法三 归并排序 代码1 include
  • Win11 Vmware 16 Pro 启动报错 ‘0xc000007b‘

    一段时间没有使用Vmware 打开突然报错 0xc000007b 可能是因为安装了其他软件导致C 库被改变 原因 C 库改变 解决方法 windows打开控制面板 然后打开程序 卸载程序 图中左下角 然后找到图中两个C 程序 分别右键 卸载
  • YoloV8改进策略:将FasterNet与YoloV8深度融合,打造更快更强的检测网络

    文章目录 数据集 官方模型的成绩 改进一 改进二 改进三 总结 数据集 本来想选COCO数据集 但是我觉得训练相同的epoch是一种不公平的对比 因为预训练本来就是COCO数据集上得来的 这样对官方的模型有利 而我改动了模型的结构 导致了没
  • 【重点突破】—— 百度地图在React单页面应用中的使用

    重点突破 百度地图在React单页面应用中的使用 前言 百度地图是网页中使用地图的常用第三方工具 这里结合React项目中学到的应用场景总结一些使用要点 一 在网页中嵌入百度地图 搜百度地图开放平台 注册百度开发者账号 控制台 查看应用 创
  • QT的使用(初期笔记)

    signal 发送的信号 signals 自定义信号 返回值是void 只需声明 不需实现 可以有参数 可以重载 按钮 1 inherited 继承 from QAbstractButton 1 clicked bool checked f
  • idea2021版本新建web项目(详细教程)

    打开idea右上角的文件 新建项目 选中java模块 下一步 取名 下一步 打开后是个空白 到这一步 右键选中untitled打开添加框架支持 选中web应用程序 一定要勾选创建web xml 然后点击确定 接下来 找到右上角的添加配置 点
  • matplotlib绘图横坐标或纵坐标文本显示不全

    import matplotlib pyplot as plt x 1 2 3 4 y 1 4 9 6 labels Frogs Hogs Bogs Slogs plt plot x y You can specify a rotation
  • unity使用Tcp/UDP协议网络通信实现(Socket简单应用)

    一 TCP协议 服务器端 1 打开vs 创建一个c 的控制台应用程序 代码如下 记得把ip换成自己电脑ip using System using System Collections Generic using System Linq us