Unity网络服务器搭建

虽然unity出了Network,但是作为初学者还是有必要学习一下Socket,今天,给大家分享一个初级的小服务器搭建,当然是在Unity上实现的。
下面的的代码我都详细写了注释,本人也作为初学者可以留言交流。

[code]csharpcode:

using UnityEngine;
using System.Collections;
//添加引用
using System.Net;
using System.Net.Sockets;

//咱们这里写个委托用来把数据传出来
//不理解的童鞋可以把这行为理解为一种把服务器消息传出去的方式
public delegate void ServerCallBack(byte[] contex);

public class CreateServer {
    //写成单例,以方便在需要创建服务器时调用
    private static CreateServer _instance;
    private CreateServer() { }
    public static CreateServer GetInstance()
    {
        if (_instance==null)
        {
            _instance = new CreateServer();
        }
        return _instance;
    }

    private Socket serverSocket;//创建服务器Socket对象
    private ServerCallBack serverCallBack;//传出消息的委托对象
    public void InitServer(ServerCallBack CallBack)
{
//将委托对象传输进来
serverCallBack = CallBack;
//创建Sock,有两种重载,我用了三个参数的重载,分别是三个枚举(IP地址族,双向读写流的传输协议,Tcp传输控制协议)
serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//绑定网络节点,设置所有ip都可以连
serverSocket.Bind(new IPEndPoint(IPAddress.Any, 23456));
//设置监听端口,可以同时连接1000个客户端
serverSocket.Listen(1000);
//接受客户端的请求,下面的ServerAccept()是一个回调方法,
//用来服务器接受请求,看好是接受请求,不是接收数据

serverSocket.BeginAccept(ServerAccept, serverSocket);
} //在接受客户端请求后,需要回调用来接收数据方法 //所以我们在这里建一个临时存储数据的数组, private byte[] serverbuffer = new byte[1024]; /// <summary> /// 接受请求的回调方法 /// </summary> void ServerAccept(System.IAsyncResult ar) { //获取接受请求的套接字 serverSocket = ar.AsyncState as Socket; //在回调里结束接受请求 Socket workingSocket = serverSocket.EndAccept(ar); //接受完请求后,开始接收消息,看好是接收 //BeginReceive(用接收消息的数组,第0个字节开始接收,接受的字节数,Socket标识符,接收消息之后的回调接受数据的方法) workingSocket.BeginReceive(serverbuffer,0,serverbuffer.Length,SocketFlags.None,ServerReceive,workingSocket); //下面写了一个尾递归 //当接受完一个客户端的连接请求后,继续接受其他客户端的连接请求 workingSocket.BeginAccept(ServerAccept, serverSocket); } /// <summary> /// 接收数据的回调方法 /// </summary> /// <param name="ar"></param> void ServerReceive(System.IAsyncResult ar) { //获取接收消息的套接字 serverSocket = ar.AsyncState as Socket; //结束接受,这里返回接受数据字节数 int count = serverSocket.EndReceive(ar); //如果有数据,接收消息 if (count>0) { //将数据通过委托,传送到外界 serverCallBack(serverbuffer); } //下面再写一个尾递归 //服务器成功连接到客户端后,继续接收当前客户端发来的消息 serverSocket.BeginReceive(serverbuffer, 0, serverbuffer.Length, SocketFlags.None, ServerReceive, serverSocket); } }

 

[code]csharpcode:下面就可以在任何地方创建服务器了

    /// <summary>
    /// 创建服务器
    /// </summary>
    void Server()
      {
        //后台运行
        Application.runInBackground = true;
       
        CreateServer.GetInstance().InitServer(Print);
      }
    //public delegate void ServerCallBack(byte[] contex);这是上面的委托
    /// <summary>
    /// 下面是定义一个跟委托类型相同方法
    /// </summary>
    /// <param name="msg"></param>
    void Print(byte[] msg)
    {
       
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值