Unity使用C#实现简单Scoket连接及服务端与客户端通讯

unity socket通信 unity服务器客户端编程 服务器端:在VS创建一个空的C#项目NetworkServer using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Net.Sockets; using System.Net; namespace NetworkServer { 阅读详情

简介:

网络编程是个很有意思的事情,偶然翻出来很久之前刚开始看Socket的时候写的一个实例,贴出来吧

Unity中实现简单的Socket连接,c#中提供了丰富的API,直接上代码。

服务端代码:

    Thread connectThread;//当前服务端监听子线程
    public string address;//当前地址
    public int port;//当前本地端口
    TcpClient romoteClient;//远程客户端

    // Use this for initialization
    void Start()
    {
        connectThread = new Thread(InitServerSocket);
        connectThread.Start();
    }

    /// <summary>
    /// 实例化服务端Socket
    /// </summary>
    public void InitServerSocket()
    {
        int bufferSize = 8192;//缓冲区大小
        IPAddress ip = IPAddress.Parse(address);
        //新建TCP连接,并开启监听子线程
        TcpListener tcpListener = new TcpListener(ip, port);
        tcpListener.Start();
        Debug.Log("服务端-->客户端完成,开启tcp连接监听");
        //如果有远程客户端连接,此时得到其对象用于通讯
        romoteClient = tcpListener.AcceptTcpClient();
        Debug.Log("客户端连接开始 本地地址端口: " + romoteClient.Client.LocalEndPoint + "  远程客户端地址端口: " + romoteClient.Client.RemoteEndPoint);
        NetworkStream stream = romoteClient.GetStream();
        do
        {
            try
            {
                //获取与客户端连接数据
                byte[] buffer = new byte[bufferSize];
                int byteRead = stream.Read(buffer, 0, bufferSize);
                if (byteRead == 0)
                {
                    Debug.Log("客户端断开");
                    break;
                }
                string msg = Encoding.UTF8.GetString(buffer, 0, byteRead);
                Debug.Log("接收到客户端的数据: " + msg + "   数据长度: " + byteRead + "字节");

            }
            catch (Exception ex)
            {
                Debug.Log("客户端异常: " + ex.Message);
                //客户端出现异常或者断开的时候,关闭线程防止溢出
                tcpListener.Stop();
                break;
            }
        } while (true);
    }

    /// <summary>
    /// 服务器端根据当前连接的远程客户端发送消息
    /// </summary>
    public void SendMessageToClient()
    {
        if (romoteClient != null)
        {
            romoteClient.Client.Send(Encoding.UTF8.GetBytes("Hello Client ,This is Server!"));
        }
    }

    /// <summary>
    /// 销毁时关闭监听线程及连接
    /// </summary>
    void OnDestroy()
    {
        if (romoteClient != null)
            romoteClient.Close();
        if (connectThread != null)
            connectThread.Abort();
    }

客户端代码:

    public string serverAddress;//服务器地址
    public int port;//服务器端口
    private TcpClient localClient;//当前tcp客户端
    private Thread receiveThread;//接收服务器消息线程
    private byte[] resultBuffer = new byte[1024];//服务器返回流字节
    private string resultStr;//服务器返回字符串

    void Start()
    {
        //连接至服务端
        InitClientSocket();
    }

    /// <summary>
    /// 销毁时操作
    /// </summary>
    private void OnDestroy()
    {
        if (localClient != null)
            localClient.Close();
        if (receiveThread != null)
            receiveThread.Abort();
    }

    /// <summary>
    /// 客户端实例化Socket连接
    /// </summary>
    private void InitClientSocket()
    {
        localClient = new TcpClient();
        try
        {
            //当前客户端连接的服务器地址与远程端口
            localClient.Connect(IPAddress.Parse(serverAddress), port);
            //开始接收服务器消息子线程
            receiveThread = new Thread(SocketReceiver);
            receiveThread.Start();
            Debug.Log("客户端-->服务端完成,开启接收消息线程");
        }
        catch (Exception ex)
        {
            Debug.Log("客户端连接服务器异常: " + ex.Message);
        }
        Debug.Log("连接到服务器 本地地址端口:" + localClient.Client.LocalEndPoint + "  远程服务器端口:" + localClient.Client.RemoteEndPoint);
    }

    /// <summary>
    /// 客户端发送消息到服务器
    /// </summary>
    private void SendMessageToServer()
    {
        try
        {
            string clientStr = "Hello Server, This is Client!";
            //获取当前客户端的流对象,然后将要发送的字符串转化为byte[]写入发送
            NetworkStream stream = localClient.GetStream();
            byte[] buffer = Encoding.UTF8.GetBytes(clientStr);
            stream.Write(buffer, 0, buffer.Length);
        }
        catch (Exception ex)
        {
            Debug.Log("发送消息时服务器产生异常: " + ex.Message);
        }
    }

    /// <summary>
    /// 客户端检测收到服务器信息子线程
    /// </summary>
    private void SocketReceiver()
    {
        if (localClient != null)
        {
            while (true)
            {
                if (localClient.Client.Connected == false)
                    break;
                //在循环中,
                localClient.Client.Receive(resultBuffer);
                resultStr = Encoding.UTF8.GetString(resultBuffer);
                Debug.Log("客户端收到服务器消息 : " + resultStr);
            }
        }
    }

此时,面板填入服务端的地址及端口,运行服务端,再运行客户端,客户端点击发送消息,服务器收到消息,服务端发送消息后,客户端收到消息。本人是在两台机器上进行测试,Debug如下:

服务端:


客户端:



注意事项:

1.服务端和客户端的地址不要写错

2.服务端的端口确保未被占用

3.在进行通讯的时候,要保持字符串编码格式一致

4.子线程的生命周期,记得销毁,为了保证在主线程销毁同时销毁子线程可以使用thread.IsBackground = true

Unity中进行网络通信:三:unity客户端和Unity服务端互相发消息 一.目的 1.想知道:Unity中进行网络通信:unity客户端和Unity服务端互相发消息 二.参考 1.unity3D中使用Socket进行数据通信(三) https://blog.csdn.net/qq_38112703/article/details/82624502 三.操作:一:完成:在同一个Unity的同一个物体上面添加 服务端、客户端代码 1.版本 unity2018.4.0f1 vs2017 windows10 64位 1.运行结果... 阅读详情

相关推荐

Unity C# Scoke 如何实现网络通讯

强联网在我们的游戏开发中所占比重越来越大,尤其是开发MMO游戏时,更需要强联网来进行实时更新,所以我们就有了强联网的需要。 首先我们得清楚强联网的工作原理,说到强联网,我们就必须说到socket。 socket是对tcp/ip协议的封装和应用,是面向程序员的,给我们提供了操作网络的接口,但是我们也必须基本了解其工作原理: 强联网我们主要使用的是TCP和UDP,首先我们说一下TCP。 一说到...

u012943521的博客 594

Unity与C++之间进行socket通信

在本例中我们将以C#作为Unity脚本为例与C++进行通信,所以实质上是C#与C++之间进行socket通信。C#与C++都提供了socket类,这样就使得这两种语言之间可以相互发送并接受消息。从而能够实现Unity与C++之间进行通信,也就使得在C++程序中对Unity程序进行控制成为可能。在本例中我们通过在C++程序中控制实现Unity中Cube对象的旋转以及移动操作来说明Un...

dieyi4726的博客 1225

从共现矩阵到共现图一步到位——详解版

1.共现矩阵 判断大量不同文本之间,相邻词的联系,两词在所有文本中相邻的次数在矩阵中用数值表示。(参考此) 例子如下: 1.1 文本 • I like deep learning. • I like NLP. • I enjoy flying. 1.2 共现矩阵 2.共现图 2.1 数据预处理(节点和边) 获取文件node.csv和edge.csv。代码详见github仓库 2.2 共现图的制作 2.2.1 gephi的安装(参考此) (1)先下载gephi (2) 再配置java环境(下载java1.8

微乐的博客 4398

Unity C# 端口串口通信实现

一, 平台说明 Unity: Unity2019.2.0a9 运行平台:Win7 , Android5及以下 二, 重要说明 我最开始是在Unity5.5.5f1上测试但是发现此版本Unity .Net版本对System.IO.Ports 支持非常不好所以改用新版,不管使用那个版本都要选择一下Unity .Net库 修改为(不同版本 .Net 库不一样,但是都不能用 .Net St...

qq_22133477的博客 1416

异步fifo的UVM验证(最终最终版)

更新了refmdl以及scb

qq_44674008的博客 2984

可调电源的电路设计

可调电源在电路调试中经常用到,可调电源分为两种2-5v(非0点可调)和0-5v(低至0点可调)可调两种。 对于第一种非0点电压的可调范围,其主要是由于开关电源或LDO芯片输出的最小电压为一个固定电压值,非0范围。因此通过调节开关电源或LDO端的反馈电阻的设计模型,其电压可调范围都与芯片的参考电压有关。 基于开关电源的可调电压设计电路 因芯片U2的输出参考电压VSENSE管脚为1.22v。因此,通过调节可调电阻R8的数值,其芯片输出的最低电压一定不小于1.22v。当然此种方案是手动可调输出电压的设计,如

weixin_42257266的博客 9709

C#在Unity中接口的实现

接口也是可以继承的有点类似于类,接口主要是可以补充一些无法用类继承的公有属性,例如:海豚,不是鱼,的拥有很多鱼的共性,就可以把这些共性封装进接口,以便调用。 using UnityEngine; using System.Collections; using System.Collections.Generic; interface Isuibian{     void 

空夜飞鹰的专栏 2753

Quartus的Signal Tap II的使用技巧

Signal Tap II全称Signal Tap II Logic Analyzer,是第二代系统级调试工具,它集成在Quartus II软件中,可以捕获和显示实时信号,是一款功能强大、极具实用性的FPGA片上调试工具软件。传统的FPGA板级调试是由外接的逻辑分析仪连接到FPGA的控制引脚,将内部引号引出至引脚I/O上,接着进行板级调试。

qq_37624854的博客 5887

一篇文章学会Unity/C#串口通信(图文、虚拟串口下载\使用,unity22亲测可实现)

在unity中使用串口,连接下位机,实现仿真

qq_38830492的博客 3209

推免保研夏令营/预推免面试记录—北航网安

链接:https://pan.baidu.com/s/1vkP3EzbVrCc8a7wgQuUZgQ?链接:https://pan.baidu.com/s/1n4EFS2c9WLAfQn91CP4j2g?链接:https://pan.baidu.com/s/1VVNNSfcNDWjXhVhH3MtNjA?上面五个比例基本为:1:5:2:1:1。面试时间:当天上午面试,但是没面完,下午吃了饭之后又继续面试。--来自百度网盘超级会员V5的分享。--来自百度网盘超级会员V5的分享。

admin的博客 3007

23种设计模式-中介者(Mediator)设计模式

软考中级-软件设计师 中介者设计模式

片言可决讼,半纸能缚龙 1851

【笔记】unity开发中Socket的用法(一,实现服务器与客户端简单的链接)

实现了简单的链接,也增加了客户端没有链接到服务器的自动重连 。服务器代码 using System; using System.Net; using System.Net.Sockets; namespace SeverSocket { class Program { static void Main(string[] args) { //创建服务器 Socket severSocket = new So

vrmogui的博客 814

2025.05.30【转录组】|Ribo-seq数据流程详解(一 质量控制)

本文详细介绍了Ribo-seq数据的质控分析流程,重点讲解了使用fastp进行原始数据质控的关键步骤和参数设置。作者通过Snakemake自动化流程示例,展示了如何去除接头序列、过滤低质量reads、生成质控报告等操作。文章强调高质量的Ribo-seq数据对转录后调控和翻译动态研究的重要性,并提供了兼顾数据质量和下游分析需求的参数配置建议。该流程有助于研究人员规范高效地完成Ribo-seq数据质控,为后续分析提供可靠数据基础。

782

Unity3D教程:实现基于Socket通讯的公共聊天室

多个客户端一同使用就是一个简单的公共聊天室。服务端为一个控制台程序使用C#实现,当然,在Unity3D中也相应地使用了C#语言实现客户端,服务端和客户端能实现消息的互通,当服务端接收到某客户端发送过来的消息时将会对客户端列表成员进行广播,这是公共聊天室的最基本的形式。Socket通讯是网络游戏最为基础的知识,因此这个实例能向有志投身于网游行业的初学者提供指导意义。 [csha

a787188834的专栏 676

全覆盖路径规划开源项目Clean-robot-turtlebot3关键函数解析(下)

本系列文章主要介绍全覆盖路径规划开源项目Clean-robot-turtlebot3的相关内容,包含如下四篇文章,分别介绍了开源项目Clean-robot-turtlebot3流程的概括总结、ROS坐标系常用坐标及其变换、Clean-robot-turtlebot3关键函数解析等内容。

慕羽★的博客 2292

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Socket网络通讯入门(一)

简单学习了解一下Socket网络通讯入门。提示:以下是本篇文章正文内容,下面仅供参考上面服务端和客户端的代码,只是用于简单交互示列,正式使用不会如此写法,因为阻塞性太大,正常使用会异步处理。

qq_37524903的博客 1333

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

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

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

weixin_43453797的博客 9148

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Unity 实现简单socket通信收发消息

服务端: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Net.Sockets; using System.Net; namespace NetworkServer { cla...

Young的博客 3146

Unity中进行网络通信:一:unity客户端连接服务端

一.目的 1.想知道:Unity中进行网络通信

qq_40544338的博客 3838

Unity笔记——C#的Socket基础

总的来说TCP通信大致就是六步,建立socket->绑定Bind->监听Listen->通过Accept()与客户端建立连接->客户端Connect()连接服务器->Send()给服务器发送消息->通过Receive()方法来建立连接,从而实现可靠传输。4)通过ReciveFrom()方法接收指定主机发送的消息(需要提供主机IP地址及端口)3)通过SendTo()方法向建立连接的主机发送消息(需要提供IP地址及端口)7)利用Receive()方法接受来自建立连接主机的消息(实现可靠连接)

掩扉Blog 2974

Unity3D 使用Socket进行游戏数据的通信

前言 Unity 是一款功能非常强大的游戏开发引擎,相信有很多小伙伴使用过。

若汝棋茗 的博客 2247

unity3D中使用Socket进行数据通信(二)

上一篇博客主要介绍了使用socket搭建服务端和客户端程序,这一篇来说说socket的数据传输,我们使用socket的目的是解决点对点之间的数据传输,之前提到了socket中一个重要的概念:端口。而socket传输数据的方式就是端口与端口之间以流(stream)的方式传输数据,socket命名空间中提供了该流的一个功能类(NetworkStream),用起来很方便,因为任何可以转换为二进制的数据都

老李与代码二三事 8646

Unity Socket不断接受和发送消息

【代码】Unity Socket不断接受和发送消息。

weixin_43780907的博客 482
上一篇: Android Studio 守护进程 错误 Error:Unable to start the daemon process....
下一篇: Unity 工具类ScrollView拖拽滑动翻页
真像大白阿
博客等级 码龄10年 1126粉丝 49原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值