unity简单本地服务器的创建

本文介绍了一个基于Unity的游戏网络通信示例,包括服务器和客户端的搭建过程。通过使用C#语言和Socket API,实现了简单的文本消息收发功能。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Net.Sockets;
using System.Net;
using System;
using System.Text;
//工具类

public class NetworkManager {
    #region  单例
    private static NetworkManager instance;
    private NetworkManager(){}
    public static NetworkManager Instance{
        get{
            if (instance == null)
            {
                instance = new NetworkManager();
            }
            return instance;
        }
    }

    #endregion
    
    //定义一个委托,来表示一类的方法,只要是方法是这种类型
    //都可以使用这种委托来实现回调
    public delegate void MyCallBack(string msg);
    
    #region 服务器端
    /*服务器创建流程
        1、创建服务器
        2、等待客户端连接
        3、发送消息
        4、接受消息
    要使用到Socket中的方法有:
        1、创建套接字的方法
        2、绑定端口号和IP的方法
        3、监听的方法
        4、接收客户端连接请求的方法(Accept)
        5、收发消息的方法
     */
    #endregion
    //服务器委托对象,主要实现向外界传输数据
    MyCallBack m_serverCallBack;
    //服务器端的套接字对象
    Socket m_serverSocket;
    //服务端的输入输出的缓存区
    byte[] m_serverBuffer;

    //初始化服务器
    public void ServerInit(MyCallBack userCallBack){
        m_serverCallBack = userCallBack;
        //实例化输入输出数组
        m_serverBuffer = new byte[1024];
        //实例化服务器Socket
        m_serverSocket = new Socket(
            //使用IP地址的类型
            AddressFamily.InterNetwork,
            //套接字类型,使用的TCP的流式传输,
            //还有UDP的报文式传输:QQ的传输方式
            SocketType.Stream,
            //选取协议,流式传输不一定是Tcp协议
            ProtocolType.Tcp
        );
        //IP地址的绑定和端口号版定
        //IPAddress.Any:表示能够接受所有连接的IP地址类型
        //第二个参数:端口号,IP表示的是哪个电脑,端口号
        //表示哪个应用
        IPEndPoint point =
             new IPEndPoint(IPAddress.Any,34567);
        //将节点绑定到socket上
        m_serverSocket.Bind(point);

        //服务器开启监听客户端连接,该方法调用成功,即
        //表示服务器启动成功,10表示能够连接的最大连接
        //数目,比如说玩游戏时进入需要排队,就是服务器
        //设置了连接数据
        m_serverSocket.Listen(10);
        //开启的回调
        m_serverCallBack("服务器启动成功");
        //服务器开启等待用户连接的状态
        //第一个参数:这是一个方法,如果有客户端连接当前的服务器了,
        //该方法会自动调用
        m_serverSocket.BeginAccept(ServerAccept,m_serverSocket);
    }
    //当服务器收到用户请求连接的时候的回调方法
    void ServerAccept(IAsyncResult ar){
        //获取到当前客户端连接服务器的套接字
        m_serverSocket = ar.AsyncState as Socket;
        //得到新的套接字,针对当前连接的客户端
        Socket workingSocket = m_serverSocket.EndAccept(ar);
        //给客户端发送一个连接成功的消息
        workingSocket.Send(Encoding.Unicode.GetBytes(
            "Hello,I accept your requedt at"+
            DateTime.Now.ToShortDateString()));
        //开始基于建立新的Socket连接,进行收发消息
        workingSocket.BeginReceive(
            //收发缓存区
            m_serverBuffer,
            //接受消息的开始位置
            0,
            //接受数据的长度
            m_serverBuffer.Length,
            //是否需要开启其他服务,None表示什么消息都接受
            SocketFlags.None,
            //接收到消息之后的回调
            ServerReceive,
            //当前套接字的状态
            workingSocket
        );
        //尾递归
        m_serverSocket.BeginAccept(ServerAccept,m_serverSocket);
    }
    //服务器收到消息的回调方法
    void ServerReceive(IAsyncResult ar){
        //获取到新的套接字
        Socket workingSocket = ar.AsyncState as Socket;
        //得到接收的字节个数
        int count = workingSocket.EndReceive(ar);
        //将接受到的内容转成字符串
        string msgResult =
                UTF8Encoding.UTF8.GetString(m_serverBuffer);
        //回调
        m_serverCallBack("接收到了"+count+"字节数据");
        m_serverCallBack(msgResult);

        //尾递归调用
        workingSocket.BeginReceive(
            m_serverBuffer,
            0,
            m_serverBuffer.Length,
            SocketFlags.None,
            ServerReceive,
            workingSocket
        );
    }
   //************************************************** */
    #region 客户端

    //客户端套接字
    Socket m_clientSocket;
    //客户端消息缓存区
    byte[] m_clientBuffer;
    //客户端的回调
    MyCallBack m_clientCallBack;

    //客户端连接服务器的方法
    //ip:要连接的服务器地址
    //port:端口号,要连接哪个应用
    //userCallback:客户端各种回调
    public void ClinetConnect(string ip,int port,
        MyCallBack userCallback){
        //初始化客户端套接字
        m_clientSocket = new Socket(
            //IP类型
            AddressFamily.InterNetwork,
            //套接字类型
            SocketType.Stream,
            //协议类型
            ProtocolType.Tcp
        );
        //初始化客户端缓存区
        m_clientBuffer = new byte[1024];
        //开始连接服务器
        //IPAddress.Parse:解析IP
        m_clientSocket.Connect(IPAddress.Parse(ip),port);
        //将连接的回调传递进来
        m_clientCallBack = userCallback;
        m_clientCallBack("连接服务器成功!!");

        //客户端开始准备接受服务器的回复
        m_clientSocket.BeginReceive(
            m_clientBuffer,
            0,
            m_clientBuffer.Length,
            SocketFlags.None,
            //客户端接收消息的回调
            ClientReceive,
            m_clientSocket
        );
    }
    //接收到服务器回应的回调方法
    void ClientReceive(IAsyncResult ar){
        //得到新的套接字
        Socket workingSocket = ar.AsyncState as Socket;
        //接收到的数据的长度
        int count = workingSocket.EndReceive(ar);
        //将接受到的数据转成字符串
        string msgResult = UTF8Encoding.UTF8.
                        GetString(m_clientBuffer);
        //回调
        m_clientCallBack("收到了"+count+"字节的数据");
        m_clientCallBack(msgResult);

        //重置一下buffer
        m_clientBuffer = new byte[1024];
        //开始递归接收
        m_clientSocket.BeginReceive(
            m_clientBuffer,
            0,
            m_clientBuffer.Length,
            SocketFlags.None,
            ClientReceive,
            workingSocket
        );
    }

    #endregion

}

简单的测试

服务器测试

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ServerScripts : MonoBehaviour {
    //定义用来接受服务器各种回调信息的字符串
    string m_currentMsg ;
    void Awake()
    {
        Application.runInBackground=true;
    }
    void Start () {
        //初始化服务器
        NetworkManager.Instance.ServerInit((string msg)=>{m_currentMsg = msg;});
        print(m_currentMsg);
    }
    void OnGUI()
    {
        //将服务器的回调信息展示在labal
        GUILayout.Label(m_currentMsg);
    }
    // Update is called once per frame
    void Update () {
        
    }
}

客户端测试

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ClientScript : MonoBehaviour {
        string m_currentMsg;

    // Use this for initialization
    void Start () {
        NetworkManager.Instance.ClinetConnect("127.0.0.1",34567,(string msg)=>{m_currentMsg = msg;});
    }

    void OnGUI()
    {
        GUILayout.Label(m_currentMsg);
    }
    // Update is called once per frame
    void Update () {
        
    }
}

将服务器的场景打包测试先开启服务器 , 然后再unity 运行客户端

链接上服务器


上述ip地址为服务器开启电脑的服务器

 连接后再创建脚本可以实现简单的文字收发消息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值