IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> 一个简单的C#HTTP服务器(含Unity通信调用) -> 正文阅读

[游戏开发]一个简单的C#HTTP服务器(含Unity通信调用)

为什么会有这个需求呢,是这样的,我们希望在手机端能够实时的把日志汇报到一个测试用的服务器上。因为本人是客户端,而且也不想占用服务器资源。因此就想自己尝试一下能不能直接用C#实现一个简单的http服务器,搜了一些资料后发现。一种是用Socket实现,一种是用HttpListener实现。Socket的实现不够直观明朗,但是更灵活。因为我的需求就是期望客户端那用简单的http请求就可以把游戏内日志汇报上来,因此简单易用是第一需求。

原作者找不到了,这是我找到的那个参考

https://www.h3399.cn/201709/136120.html

在他的基础上,我经过修改测试,整理了一个可用的代码如下:

我是VS2019的一个WinForm工程

    class SimpleHttpServer
    {
        private HttpListener _listener;
        public SendOrPostCallback Handler = null;
        public SynchronizationContext UiContext = null;

        private void RequestHandler(IAsyncResult result)
        {
            try
            {
                HttpListenerContext context = _listener.EndGetContext(result);
                byte[] buffer = new byte[8096];
                using (Stream stream = context.Request.InputStream)
                {
                    int count = 0;
                    while ((count = stream.Read(buffer, 0, buffer.Length)) > 0)
                    {
                        UiContext.Send(Handler, Encoding.UTF8.GetString(buffer, 0, count));
                    }
                }
                StreamWriter sw = new StreamWriter(context.Response.OutputStream, Encoding.UTF8);
                context.Response.ContentType = "text/html";
                context.Response.ContentEncoding = Encoding.UTF8;
                context.Response.Close();
            }
            catch (Exception e)
            {
                //
            }
            finally
            {
                if (_listener.IsListening)
                {
                    _listener.BeginGetContext(RequestHandler, new object());
                }
            }
        }

        public void Start()
        {
            _listener = new HttpListener();
            _listener.Prefixes.Add("http://+:10086/");
            _listener.Start();
            _listener.BeginGetContext(RequestHandler, new object());
        }

        public void Close()
        {
            _listener.Stop();
            _listener.Abort();
        }
    }

请注意,这里我什么也没有返回,因为我需要的就是仅接受到消息就OK

启用的时候,在界面初始化的时候,调用Start()方法即可,然后测试可以在浏览器上输入局域网的IP地址测试

例如http://192.168.xx.xx:10086

这里10086也是自己随便定义的一个端口,如果显示一个空白的页面,证明消息就收到了。

try内是服务器收到请求的处理,因为我是用Winform做的,涉及到一个UI线程同步问题,因此用了SynchronizationContext?来处理。实际上可以根据自己的需求去处理这个string字段

在Unity里,可以用UnityWebRequest来简单模拟,这样调用

using (UnityWebRequest unityWebRequest = new UnityWebRequest(_uri, UnityWebRequest.kHttpVerbPOST))
{
    unityWebRequest.uploadHandler = new UploadHandlerRaw(Encoding.UTF8.GetBytes(log))
    {
        contentType = "application/x-www-form-urlencoded"
    };

    unityWebRequest.timeout = 3;
    unityWebRequest.useHttpContinue = false;
    yield return unityWebRequest.SendWebRequest();
}

log就是我们要发送的日志内容本身。

需要注意的一点是,运行服务器的主机一定要关掉防火墙,或者加入白名单,不然会有可能造成别的机器无法访问的问题。另外我只测试了内网。外网的情况下,可能需要IP映射

附:

在安卓上测试也是OK的,还没在Ios上测试,后续测试过了也补充进来

另外,unity可以通过

Application.logMessageReceivedThreaded += OnLogHandle

方法来监听所有日志,在应用里,只需要添加自己处理日志的方法即可。为了不阻塞游戏,请做个缓存队列~不然经常卡死unity。试想,如果你在错误日志处理里也出错,这个错误又会触发错误日志处理,就直接死循环了。反正要注意下这个问题

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-08-25 12:33:10  更:2021-08-25 12:33:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/3 18:18:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码