Unity学习之Socket通信

这篇具有很好参考价值的文章主要介绍了Unity学习之Socket通信。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


简单的一对一通信,客户端向服务器传输字符串,具体操作如下:

服务器端

在VisualStudio中创建一个新工程,在工程中编写服务器逻辑,代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;

/// <summary>
/// Socket服务器端
/// </summary>
namespace SocketServerTest
{
    class Program
    {
        private static Socket socket;
        //接收消息的载体
        private static byte[] buffer = new byte[1024];
        //服务器入口
        static void Main(string[] args)
        {
            //1,创建套接字,并设置参数
            socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //2,绑定服务器的IP和端口
            EndPoint ep = new IPEndPoint(IPAddress.Any, 9999);
            socket.Bind(ep);
            //3,监听是否有客户端进行连接
            //参数表示在同一时间内服务器可以对该数量下的客户端进行操作,超出数量,则需要进行排队
            socket.Listen(0);
            //4,应答客户端
            StartAccept();
            Console.Read();
        }

        /// <summary>
        /// 开始应答客户端
        /// </summary>
        static void StartAccept()
        {
            //异步应答客户端
            socket.BeginAccept(AcceptCallback, null);
        }

        /// <summary>
        /// 开始接收消息
        /// </summary>
        /// <param name="client">应答的客户端套接字</param>
        static void StartReceive(Socket client)
        {
            //将应答的客户端作为参数传给回调函数
            client.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, ReceiveCallback, client);
        }

        /// <summary>
        /// 应答的回调函数
        /// </summary>
        /// <param name="iar"></param>
        static void AcceptCallback(IAsyncResult iar)
        {
            //1,结束应答,获得应答的客户端的套接字(服务器端将会有多个Socket,每一个Socket对应的是其响应的客户端)
            //一对一通信,client指的是应答Socket,而非客户端本身,该Socket属于服务器端,由服务器产生,针对请求响应的客户端
            Socket client = socket.EndAccept(iar);
            //2,应答Socket接收消息
            StartReceive(client);
            //3,处理完一个,继续处理,继续应答
            StartAccept();
        }

        static void ReceiveCallback(IAsyncResult iar)
        {
            //1,从回调函数结果中获取传递过来的参数,即获取传递过来的应答客户端对象
            Socket client = iar.AsyncState as Socket;
            //2,获取接收到信息的长度
            int len = client.EndReceive(iar);
            //3,判断信息是否成功接收
            if (len == 0)
            {
                return;
            }
            //4,解析信息并处理
            string str = Encoding.UTF8.GetString(buffer, 0, len);
            Console.WriteLine(str);
            //5,继续接收来自客户端的信息
            StartReceive(client);
        }
    }
}

客户端

在unity中创建一个脚本,即Client.cs,具体代码如下:

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

/// <summary>
/// 客户端
/// </summary>
public class Client : MonoBehaviour
{
    private Socket socket;
    //定义一个接收消息载体
    private byte[] buffer = new byte[1024];
    
    void Start()
    {
        //1,创建套接字 参数1表示地址族类型选择IP,参数2表示套接字类型选择数据流的方式,参数3表示协议选择TCP协议
        //协议选择UDP,套接字类型应选择数据报,即SocketType.Dgram
        socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        //2,连接服务器端
        socket.Connect("192.168.3.43", 9999);
        //3,连接服务器成功后,开始异步接收消息(第一条数据)
        StartReceive();
        //4,向服务器发送消息
        Send();
    }

    /// <summary>
    /// 开始接收消息
    /// </summary>
    void StartReceive()
    {
        //异步接收数据 参数1:接收信息载体,参数2:从0开始,参数3:信息长度,参数4:目前为空,参数5:回调函数,参数6:回调函数需要用到的参数
        //接收到的消息将在回调函数中进行处理
        socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, ReceiveCallback, null);
    }

    /// <summary>
    /// 接收消息的回调函数
    /// </summary>
    /// <param name="iar">BeginReceive方法得到结果即为回调函数的参数</param>
    void ReceiveCallback(IAsyncResult iar)
    {
        //1,结束接收消息后,会返回接收到的消息长度
        int len = socket.EndReceive(iar);
        //2,判断消息是否被正确完整接收
        //当接收消息过程中发生中断,EndReceive一直处于接收状态,返回的消息长度为0,及消息未传输成功
        if (len == 0)
        {
            return;
        }
        //3,对接收的消息进行解析
        #region 简单消息示例,接收到的是字符串信息
        //将字节数组中的信息转换成字符串,并用UTF-8进行编码
        string str = Encoding.UTF8.GetString(buffer, 0, len);
        //输出消息
        Debug.Log(str);
        #endregion
        //4,循环接收消息并对消息进行处理(第一条数据解析完后,对后面服务器发送的消息进行处理)
        StartReceive();
    }

    /// <summary>
    /// 向服务器发送消息
    /// </summary>
    void Send()
    {
        socket.Send(Encoding.UTF8.GetBytes("你好!"));
    }
}

在Hierarchy面板中创建一个空的游戏对象,将Client脚本绑定在游戏对象上。创建的面板格式如下所示:
unity socket,Unity,unity,学习,游戏引擎

运行

先启动服务器端代码,再运行unity,即可得到下面的运行结果:
1,服务器启动后
unity socket,Unity,unity,学习,游戏引擎
2,客户端启动后,服务器收到消息
unity socket,Unity,unity,学习,游戏引擎

笔记来源

以上笔记是通过观看视频所得。文章来源地址https://www.toymoban.com/news/detail-522256.html

到了这里,关于Unity学习之Socket通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Unity】Socket网络通信(TCP) - 最基础的C#服务端通信流程

    我这里新建了一个C#控制台项目来写服务端代码。 下面是基于C# Socket的最基础服务端通信流程: 创建服务端Socket对象 绑定IP地址和端口 设置最大监听客户端数量 等待客户端连接 收发消息 释放连接 基于上面流程就能实现一个最简单并且能和客户端通信的服务器程序,每个步

    2023年04月16日
    浏览(43)
  • 【Unity】Socket网络通信(TCP) - 实现简单的多人聊天功能

    多客户端连接服务器其原理是在服务端保存客户端连入后与客户端通信的socket,由于等待客户端连接会阻塞主线程,所以结合多线程就能实现多客户端连入功能。多人聊天只需要将A客户端发来的消息,转发给除A客户端外的其他客户端,即可实现。如果你还不怎么熟悉服务端

    2024年02月03日
    浏览(45)
  • Unity3D 网络游戏框架(二、同步Socket) 参考连接:Socket 类 (System.Net.Sockets) | Microsoft Learn

    1、Socket.Connect() 2、Socket.Send() 3、Socket.Receive() 在了解完Socket通讯流程图和相关API之后我们来开发客户端代码:  在Unity中添加 两个Button、一个InputField和有Text ,Connect 方法 绑定连接的按钮, Send 方法绑定发送按钮。 Connect :客户端点击连接后会和服务端进行连接,这里面127

    2024年02月16日
    浏览(33)
  • Unity的Socket通讯,Unity作为服务端

     最近在研究Socket通讯,发现对Unity来说,作为客户端的情况比较多,于是突发奇想搞一个服务器端,废话不多说直接上代码 using System; using System.Collections; using System.Collections.Generic; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using UnityEngine; public class Tes

    2024年02月05日
    浏览(20)
  • Unity运用socket传输信息(同步)

    客户端: 在UGUI中创建两个Button,一个是连接服务器,一个是发送消息的按钮,分别绑定Connection和SendMessage两个函数 并且创建一个InputField和一个Text文本,Text文本用于显示服务器回传的消息,InputField用于输入要发送的消息 以下是代码: 客户端代码 服务端: 服务端采用VS提供

    2024年02月08日
    浏览(27)
  • 网络通信学习笔记之 ———Socket网络通信

    一、套接字 1、什么是套接字 ​ 套接字(socket)是一种通信机制,是通信的两方的一种约定,socket屏蔽了各个协议的通信细节, 对用户进程提供了一套可以统一、方便的使用TCP/IP协议的接口。这使得程序员无需关注协议本身,直 接使用socket提供的接口与不同主机间的进程互

    2024年02月08日
    浏览(29)
  • 【Unity3D】同步Socket通讯

    1 前言          在多人对战网络游戏中,玩家之间一般不是直接通讯,而是与服务器通讯,服务器再把消息转发给其他玩家。网络通讯一般基于 Socket 实现,也有一些开源网络游戏框架,如:光子引擎 Photon,其底层仍然使用 Socket 实现网络通讯。         同步 Socket 是指

    2024年02月15日
    浏览(26)
  • 【Unity 3D】利用C#、Unity和Socket实现简单的在线聊天室工具(附源码 简单易懂)

    需要源码请点赞关注收藏后评论区留言并且私信~~~ 下面利用Unity和C#语言做一个简单的聊天室程序,主要用到的技术就是Socket通信连接,需要一个客户端和一个服务器端,服务器端就使用C#语言的控制台完成 下面就开始搭建C#语言服务器端 1:新建一个C#语言控制台程序 2:命名

    2024年02月05日
    浏览(42)
  • 【Unity】(Socket)TCP 实现同一局域网 一台主机控制多台主机

    前几天博主接到一个任务:5台HTCVIVEPro设备,其中一台设备进行演示,另外四台设备画面同步。 在设备没到之前,博主进行了一下前期准本工作: 同一局域网 一台主机控制多台主机 PS:博主参考了其它博主大大的文章,感觉很有用!!!!!! 如果需要其它的一些TCP操作流程

    2024年02月10日
    浏览(28)
  • Fanuc机器人 Karel 编程学习(五)---简单的Socket通信

    1.1机器人系统变量设置 MENU------- SYSTEM------ Variables-------$KERAL_ENB     设置为1 1.2 IP地址设定 MENU----SETUP----Host Comm 选择 F3【DETAIL】进入IP设置界面 备注:按键F3【PORT】可以选择相应的物理网口Port#1 或者Port#2,具体需要看你网线插在哪个物理网口上  设置IP地址和上位机在同一网

    2024年02月16日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包