Unity3D 网络游戏框架(四、异步客户端Socket)

在之前的代码中,我们了解了如何开发Socket网络通讯的代码,但是程序会阻塞,这篇我们来介绍如何开发异步Socket。

首先我们还是先查看一下微软官方文档的API了解下面的几个方法:

1、Socket.BeginConnect()

2、Socket.EndConnect()

3、Socket.BeginReceive()

4、Socket.EndReceive()

5、Socket.BeginSend()

6、SocketEndSend()

参考连接:Socket 类 (System.Net.Sockets) | Microsoft Learn

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

public class Client : MonoBehaviour
{
    Socket socket;
    public InputField InputField;
    public Text text;
    /// <summary>
    /// 接收缓冲区
    /// </summary>
    byte[] readBuff=new byte[1024];
    string receiveStr = "";
    /// <summary>
    /// 连接
    /// </summary>
    public void Connect()
    {
        socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        socket.BeginConnect("127.0.0.1", 8888, ConnectCallback, socket);
    }
    /// <summary>
    /// 连接回调
    /// </summary>
    /// <param name="ar"></param>
    private void ConnectCallback(IAsyncResult ar)
    {
        try
        {
            Socket socket = (Socket)ar.AsyncState;
            socket.EndConnect(ar);
            Debug.Log("连接成功");
            socket.BeginReceive(readBuff, 0, 1024, 0, ReceiveCallback, socket);
        }
        catch (SocketException ex)
        {
            Debug.Log("客户端连接失败" + ex.ToString());
        }
    }
    /// <summary>
    /// 接收回调
    /// </summary>
    /// <param name="ar"></param>
    private void ReceiveCallback(IAsyncResult ar)
    {
        try
        {
            Socket socket = ar.AsyncState as Socket;
            int count = socket.EndReceive(ar);
            string s=Encoding.UTF8.GetString(readBuff,0,count);
            receiveStr = s + "\n" + receiveStr;
            
            socket.BeginReceive(readBuff, 0, 1024, 0, ReceiveCallback, socket);
        }
        catch (SocketException ex)
        {
            Debug.Log("客户端接收失败" + ex.ToString());
        }
    }

    /// <summary>
    /// 发送
    /// </summary>
    public void Send()
    {
        //发送
        string sendStr = InputField.text;
        byte[] sendBytes = Encoding.UTF8.GetBytes(sendStr);
        socket.BeginSend(sendBytes, 0, sendBytes.Length, 0, SendCallback, socket);

        
    }
    /// <summary>
    /// 发送回调
    /// </summary>
    /// <param name="ar"></param>
    private void SendCallback(IAsyncResult ar)
    {
        try
        {
            Socket socket =ar.AsyncState as Socket;
            int count=socket.EndSend(ar);
            Debug.Log("发送成功" + count);
        }
        catch (SocketException ex)
        {
            Debug.Log("发送失败" + ex.ToString());
        }
    }
    private void Update()
    {
        text.text = receiveStr;
    }
}

try...catch...是C#当中处理异常的结构,程序正常执行try里面,如果出现异常,那么执行catch

我们从这节用到的异步方法就可以看出来一个Begin...就对应一个End...,而且Begin...的参数都有一个回调函数和一个Object类型的参数,而且我们的每一个回调函数都有一个IAsyncResult类型的参数而我们在Begin...中把这个Object类型的参数封装在了IAsyncResultAsyncState当中,将封装好的接口发送给我们的回调函数,举个例子:BeginConnect当中,我们传入ConnectCallbacksocket,当客户端要连接服务端的时候,执行我们的回调函数ConnectCallback并且把socket传了进去,在回调函数ConnectCallback当中用ar.AsyncState来取得我们的socket,然后每次执行完都要调用End...

在我们ReceiveCallback当中,又一次调用了BeginReceive这是递归调用我们的回调函数,保证客户端可以一直接收服务端消息

注意:操作Unity当中操作UI只能在主线程中,所以我这里写在了UPdate里面

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《Unity3D网络游戏实战PDF》是一本非常重要的Unity3D开发书籍,它着重介绍了Unity3D游戏开发的网络部分。本书包含了网络游戏的核心概念、原理及实现方法,深入剖析了网络游戏的架构设计模式、游戏性能优化、安全防护等方面内容,并提供了实际的案例分析和设计思路,是网络游戏开发者的必备指南。 本书主要包括了以下内容:网络游戏的基础知识,如网络通信、协议、数据传输、数据整合等;Unity3D网络游戏的基本架构设计,如服务器端和客户端的架构设计、消息通信机制等;Unity3D游戏性能优化技巧,如消息压缩、消息缓存、负载均衡等;网络游戏的安全防护策略,如加密算法、防作弊、账号安全等;最后,作者还介绍了如何进行网络游戏的调试及问题排除。 《Unity3D网络游戏实战PDF》书籍内容深入浅出,适合初学者和中级开发者阅读。它提供了实用的方法和工具,帮助读者掌握网络游戏开发的技能,提高游戏开发的效率和质量。无论你是想开发网络游戏,还是想学习Unity3D游戏开发,本书都是不容错过的开发指南。 ### 回答2: unity3d网络游戏实战pdf是一本讲解使用Unity3D引擎开发网络游戏的实战教程,内容涵盖了Unity3D的基础知识、网络编程与多人联机游戏设计。本书从基础开始,逐步讲解如何使用Unity3D引擎搭建网络游戏,包括如何进行多人联机游戏设计、实现网络通信,以及如何利用Unity3D引擎的特性实现游戏的界面设计和多人对战功能。本书不仅具有理论知识,更有大量实例和案例,可以帮助读者深刻了解Unity3D引擎的应用,提高网络游戏开发的技能和水平。这本书适合想要学习和掌握Unity3D引擎开发网络游戏的初、中级程序员、游戏开发者和爱好者阅读使用,可以帮助他们快速地了解并掌握开发网络游戏的流程和技巧。总之,如果你正在寻找一本全面且系统的Unity3D网络游戏开发教程,那么这本《unity3d网络游戏实战pdf》将是你的不二选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值