Unity简单实现TCP服务端功能

Unity简单实现TCP服务端功能

前言

在过去的项目中,在涉及网络通信的项目中,我一直使用的是UDP通信,因为UDP通信开发起来比较方便,一直没有使用过TCP/IP进行通信,今天研究了一下,发现TCP/IP通信也没有想象的那么复杂。在网上找了一篇资料,自己按照上面开发了一下,发现关闭程序的时候程序会卡死,我研究了一下应该是开线程和端口没有关闭的问题,我将上面的脚本改进后写进这篇博客,记录一下。

步骤

1.新建一个工程,建立一个空物体,取名为tcpServer,如下图所示:
在这里插入图片描述
2.新建SocketServer.cs脚本,用于建立tcp/ip服务端功能,代码如下图所示:

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

public class SocketServer : MonoBehaviour
{
    int _port = 6000;
    string _ip = "127.0.0.1";
    Thread thread;

    void Start() 
    {
        StartServer();
    }

    // Use this for initialization
    public void StartServer()
    {
        bt_connnect_Click();
    }


    private void bt_connnect_Click()
    {
        try
        {
            //点击开始监听时 在服务端创建一个负责监听IP和端口号的Socket
            Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPAddress ip = IPAddress.Parse(_ip);
            //创建对象端口
            IPEndPoint point = new IPEndPoint(ip, _port);

            socketWatch.Bind(point);//绑定端口号
            Debug.Log("监听成功!");
            socketWatch.Listen(10);//设置监听,最大同时连接10台

            //创建监听线程
             thread = new Thread(Listen);
            thread.IsBackground = true;
            thread.Start(socketWatch);
        }
        catch { }

    }

    /// <summary>
    /// 等待客户端的连接 并且创建与之通信的Socket
    /// </summary>
    Socket socketSend;
    void Listen(object o)
    {
        try
        {
            Socket socketWatch = o as Socket;
            while (true)
            {
                socketSend = socketWatch.Accept();//等待接收客户端连接
                Debug.Log(socketSend.RemoteEndPoint.ToString() + ":" + "连接成功!");
                //开启一个新线程,执行接收消息方法
                Thread r_thread = new Thread(Received);
                r_thread.IsBackground = true;
                r_thread.Start(socketSend);
            }
        }
        catch { }
    }

    /// <summary>
    /// 服务器端不停的接收客户端发来的消息
    /// </summary>
    /// <param name="o"></param>
    void Received(object o)
    {
        try
        {
            Socket socketSend = o as Socket;
            while (true)
            {
                //客户端连接服务器成功后,服务器接收客户端发送的消息
                byte[] buffer = new byte[1024 * 1024 * 3];
                //实际接收到的有效字节数
                int len = socketSend.Receive(buffer);
                if (len == 0)
                {
                    break;
                }
                string str = Encoding.UTF8.GetString(buffer, 0, len);
                Debug.Log("服务器打印:" + socketSend.RemoteEndPoint + ":" + str);
                Send("我收到了");
            }
        }
        catch { }
    }

    /// <summary>
    /// 服务器向客户端发送消息
    /// </summary>
    /// <param name="str"></param>
    void Send(string str)
    {
        byte[] buffer = Encoding.UTF8.GetBytes(str);
        socketSend.Send(buffer);
    }

    public void SocketQuit()
    {
        //关闭线程
        if (thread != null)
        {
            thread.Interrupt();
            thread.Abort();
        }
        //最后关闭服务器
        if (socketSend != null)
            socketSend.Close();
        print("diconnect");
    }
    void OnApplicationQuit()
    {
        //退出时关闭连接
        SocketQuit();
    }
}

3.将SocketServer.cs脚本挂载到场景中的tcpServer物体上,如下图所示:
在这里插入图片描述
4.TCP服务端就开发完成了,运行项目,打开网络测试助手,参数设置如下图所示:
在这里插入图片描述
5.点击确定按钮,使用网络助手向TCP/IP服务端发送信息,发现TCP/IP服务端已经收到了信息,如下图所示:
在这里插入图片描述

相关链接

程序Demo

### 回答1: Unity 是一款强大的游戏开发引擎,但本身并不直接支持 WebSocket 服务端。但是,我们可以借助 Unity 的网络功能和一些第三方库来实现 WebSocket 服务端。 要实现 WebSocket 服务端,我们可以使用 .NET 库中的 HttpListener 类。首先,我们需要创建一个新的 C# 脚本,并在其中引入 System.Net 命名空间。然后,我们可以创建一个 HttpListener 对象,设置监听的地址和端口。例如: HttpListener httpListener = new HttpListener(); httpListener.Prefixes.Add("http://localhost:8080/"); 接下来,我们需要开始监听这个地址和端口: httpListener.Start(); 然后,我们可以使用异步方式等待客户端的连接: IAsyncResult result = httpListener.BeginGetContext(new AsyncCallback(ListenerCallback), httpListener); 在 ListenerCallback 回调函数中,我们可以获取客户端的连接和请求信息: void ListenerCallback(IAsyncResult result) { HttpListener listener = (HttpListener)result.AsyncState; HttpListenerContext context = listener.EndGetContext(result); // 处理客户端的请求 } 在处理客户端请求的过程中,我们可以根据不同的请求类型,实现相应的 WebSocket 逻辑。使用 .NET 中的 WebSocket 类,我们可以从 HttpListenerContext 中获取 WebSocket 对象,并执行诸如发送消息、接收消息等操作。 需要注意的是,为了实现完整的 WebSocket 逻辑,我们可能还需要处理握手过程中的协议判断、消息编码解码等细节。 综上所述,要在 Unity实现 WebSocket 服务端,我们可以利用 .NET 中的 HttpListener 类来监听客户端连接,并在处理请求过程中实现 WebSocket 的相关逻辑。这样就可以通过 Unity 实现 WebSocket 服务端了。 ### 回答2: Unity 是一款游戏开发引擎,通常用于开发各种类型的游戏。虽然 Unity 自身不支持直接实现 WebSocket 服务端,但我们可以通过使用插件或自定义脚本来实现。 首先,我们可以选择使用第三方插件或库,如 Best HTTP、WebSocket-Sharp 等来在 Unity实现 WebSocket 服务端。这些插件可以通过提供的 API 来创建、监听和处理 WebSocket 连接。我们可以根据项目需求选择最适合的插件,然后按照其文档进行配置和使用。 另外,如果我们希望自己编写 WebSocket 服务端,可以通过使用 Unity 提供的网络相关 API 来实现。首先,我们可以通过 Unity 的 NetworkTransport 类来创建一个基于 UDP 或 TCP 的网络连接。然后,我们可以使用 NetworkTransport.ReceiveFromHost() 方法来接收来自客户端的消息,并使用 NetworkTransport.SendToHost() 方法向客户端发送消息。使用这些 API,我们可以在 Unity实现一个简单的 WebSocket 服务端。 不过需要注意的是,WebSocket 是一种基于 TCP 的双向通信协议,与 HTTP 协议不同。在实现 WebSocket 服务端时,我们需要遵循 WebSocket 的协议规范,并正确处理握手、数据帧等操作。此外,我们还需要考虑并发连接、消息分发等问题,以确保 WebSocket 服务端的稳定性和可靠性。 总结来说,Unity 虽然不直接支持实现 WebSocket 服务端,但我们可以通过使用第三方插件或自定义脚本来实现。无论选择哪种方式,我们都需要理解 WebSocket 的协议规范,并根据需求正确配置和使用相关的插件或 API。 ### 回答3: 使用Unity实现WebSocket服务器可以通过Unity自带的Networking组件以及C#中的WebSocketSharp库来实现。下面是一个简单的步骤: 1. 在Unity中创建一个空的场景。然后创建一个空的游戏对象,并添加一个脚本来处理WebSocket服务器的逻辑。 2. 在脚本中导入WebSocketSharp库。你可以通过下载WebSocketSharp库的源代码,然后将其导入到Unity项目中,或者使用其他方法(如NuGet)从包管理器中引入。 3. 在脚本中添加WebSocket服务器的逻辑。你需要创建一个WebSocket服务器对象,并指定监听的端口号。例如: ``` using WebSocketSharp; using UnityEngine; public class WebSocketServer : MonoBehaviour { private WebSocketServer wsServer; private void Start() { wsServer = new WebSocketServer(12345); // 指定端口号 wsServer.Start(); wsServer.OnMessage += (sender, e) => { Debug.Log("Received message: " + e.Data); // 处理接收到的消息 }; wsServer.OnClose += (sender, e) => { Debug.Log("Connection closed"); // 处理连接关闭的逻辑 }; } private void OnDestroy() { if (wsServer != null) { wsServer.Stop(); wsServer = null; } } } ``` 4. 将脚本挂载到空的游戏对象上。然后按下Play按钮以在Unity中启动WebSocket服务器。 5. 在客户端上使用WebSocket连接到服务器。你可以使用浏览器的WebSocket API或其他WebSocket库来实现。提供服务器的IP地址和端口号,然后进行连接。 这样,你就可以通过Unity实现基本的WebSocket服务器。你可以根据具体的需求在OnMessage和OnClose事件中添加更多逻辑来处理消息和连接的关闭。同时需要注意,Unity的Networking组件也提供了一些网络功能,你也可以尝试使用这些组件来实现WebSocket服务器。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

波波斯维奇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值