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)
    {
       
    }
### 如何搭建 Unity 服务器 #### 使用 WebSocket 实现通信 为了实现实时通信,UnityWebSocket 提供了一种通过 WebSocket 协议建立连接的方法。此库支持多种功能,包括但不限于发送和接收消息、管理连接状态等[^1]。 ```csharp using UnityEngine; using System.Net.WebSockets; public class WebSocketExample : MonoBehaviour { private ClientWebSocket socket = new ClientWebSocket(); void Start() { StartCoroutine(Connect()); } IEnumerator Connect() { yield return socket.ConnectAsync(new Uri("ws://example.com"), CancellationToken.None); Debug.Log("Connected to server"); } } ``` #### 创建本地 HTTP Web 服务器 对于需要提供静态文件或API接口的情况,在Unity中利用 `HttpListener` 可以快速构建起一个简单的HTTP服务端应用。只需编写相应的C#脚本来定义监听路径以及响应逻辑即可完成基本配置工作[^2]。 ```csharp using System; using System.IO; using System.Net; public class HttpServer : IDisposable { private readonly string _localIp = "http://localhost:8081/"; private readonly string _localFilePath = @"C:\Users\Desktop\html"; public void Run() { var listener = new HttpListener(); listener.Prefixes.Add(_localIp); listener.Start(); while (true){ var context = listener.GetContext(); ProcessRequest(context); } } private void ProcessRequest(HttpListenerContext context) { // 处理请求并返回相应的内容... } public void Dispose(){ // 清理资源... } } ``` #### 构建简易图片服务器 当涉及到多媒体内容分发时,则可以通过自定义协议栈来优化性能表现;同时引入诸如Protobuf这样的高效序列化工具能够有效减少带宽占用率,并提高系统的可扩展性和兼容性程度[^3]。 ```protobuf syntax = "proto3"; message ImageData{ int32 width=1; int32 height=2; bytes data=3; } // 序列化图像数据到字节数组 byte[] SerializeImage(Image image){ using(var ms=new MemoryStream()){ Serializer.Serialize(ms,image.ToProto()); return ms.ToArray(); } } ``` #### 部署至云端环境 如果希望将开发好的应用程序发布出去让更多玩家体验的话,那么就需要考虑将其迁移到远程主机之上运行了。借助像宝塔面板这样易于使用的控制台界面可以帮助开发者更便捷地管理和维护线上业务系统[^4]。 ```bash yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh ``` #### 利用 NetBox 工具简化流程 最后值得一提的是还有专门针对游戏行业的解决方案——NetBox框架,它不仅内置了许多实用的功能模块而且文档齐全容易上手学习掌握,非常适合初学者用来练习实践网络编程方面的技能[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值