unity简单本地服务器的创建

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 运行客户端

unity简单本地服务器的创建_第1张图片

链接上服务器

unity简单本地服务器的创建_第2张图片

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

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

你可能感兴趣的:(unity)