当前位置: 首页 > news >正文

【Unity】搭建HTTP服务器并解决IP无法访问问题解决

一、核心目标与背景

在Unity中搭建本地HTTP服务器,可以用于实现Web与游戏交互、本地数据接口测试、跨设备通信等场景。但在实际部署中,开发者常遇到以下问题:

​本机IP无法访问:服务绑定localhost时,局域网设备无法连接。
​HTTP 400 Bad Request:因Host校验、路径映射或协议问题导致请求失败。
​跨平台兼容性差:Android/iOS因权限或安全策略无法访问服务。
本文将基于Unity的HttpListener,从服务器搭建到问题解决,提供完整方案。

二、HTTP服务器搭建步骤

1. 创建HTTP服务器脚本

using System.Net;
using System.Threading;
using UnityEngine;public class HttpServer : MonoBehaviour {private HttpListener listener;private Thread serverThread;private string serverUrl = "http://0.0.0.0:8080/"; // 允许所有IP访问void Start() {try {listener = new HttpListener();listener.Prefixes.Add(serverUrl);listener.Start();serverThread = new Thread(HandleRequests);serverThread.Start();Debug.Log($"服务器已启动:{serverUrl}");} catch (HttpListenerException ex) {Debug.LogError($"启动失败:{ex.Message}");}}private void HandleRequests() {while (listener.IsListening) {try {var context = listener.GetContext();ThreadPool.QueueUserWorkItem(ProcessRequest, context);} catch { /* 正常关闭处理 */ }}}private void ProcessRequest(object state) {var context = (HttpListenerContext)state;var response = context.Response;// 处理跨域和Host校验response.AppendHeader("Access-Control-Allow-Origin", "*");response.AppendHeader("Access-Control-Allow-Methods", "GET, POST");try {// 示例:返回静态文件string filePath = Path.Combine(Application.streamingAssetsPath, context.Request.Url.LocalPath.TrimStart('/'));if (File.Exists(filePath)) {byte[] data = File.ReadAllBytes(filePath);response.OutputStream.Write(data, 0, data.Length);} else {response.StatusCode = 404;}} finally {response.Close();}}void OnDestroy() {listener?.Stop();serverThread?.Abort();}
}

三、常见问题与解决方案

1. ​IP无法访问

原因:
服务器绑定地址为localhost(仅限本机)。

防火墙或系统安全策略拦截。

未配置跨平台网络权限。

解决步骤:
​修改绑定地址:
a.将serverUrl设置为http://0.0.0.0:8080/。
b.*:8080
c.127.0.0.1:8080

​开放防火墙端口:

​Windows:控制面板 → 防火墙 → 高级设置 → 添加入站规则(TCP)。
​macOS:终端执行sudo pfctl -e。
​配置平台权限:
​Android:在AndroidManifest.xml中添加:

<uses-permission android:name="android.permission.INTERNET" />
<application android:usesCleartextTraffic="true" />

​iOS:在Info.plist中添加:

xml
<key>NSAppTransportSecurity</key>
<dict><key>NSAllowsArbitraryLoads</key><true/></dict>

2. ​HTTP 400 Bad Request

原因:
Host头校验失败。
URL路径或参数格式错误。
未正确处理跨域请求。
解决步骤:
​禁用Host校验:

// 在ProcessRequest中移除Host校验逻辑
// 或动态允许所有Host:
context.Request.Headers.Remove("Host");
​统一路径格式:
csharp
string requestPath = context.Request.Url.LocalPath.TrimStart('/').Replace("\\", "/");
​强制跨域支持:
csharp
response.AppendHeader("Access-Control-Allow-Origin", "*");

3. ​Android/iOS无法连接

原因:
未声明网络权限。
Android 9+默认禁止明文HTTP。
解决步骤:
​Android:确保AndroidManifest.xml包含:

<uses-permission android:name="android.permission.INTERNET" />
<application android:usesCleartextTraffic="true" />

​iOS:使用HTTPS或配置ATS例外。

四、最佳实践与优化

1. ​异步处理提升性能

private async void HandleRequestsAsync() {while (listener.IsListening) {var context = await listener.GetContextAsync();ProcessRequest(context);}
}

2. ​增强日志输出

Debug.Log($"请求路径:{context.Request.Url.LocalPath}");
Debug.Log($"客户端IP:{context.Request.RemoteEndPoint}");

3. ​动态路径映射

string filePath = Path.Combine(Application.streamingAssetsPath, "web", requestPath);

4. ​安全加固

限制IP访问范围:

if (!context.Request.RemoteEndPoint.Address.ToString().StartsWith("192.168.")) {response.StatusCode = 403;return;
}

使用HTTPS(需配置SSL证书)。

五、总结

核心配置项 关键值/操作 适用场景

服务器绑定地址 http://0.0.0.0:端口/ 允许所有IP访问

跨域响应头 Access-Control-Allow-Origin: * 解决CORS拦截

Android权限配置 INTERNET + 明文传输许可 Android 9+兼容

通过上述方案,可快速在Unity中搭建稳定的HTTP服务器,并解决IP访问、跨域和平台兼容性问题。建议结合实际场景选择安全策略,并通过日志和抓包工具(如Wireshark)进一步优化调试。

相关文章:

【Unity】搭建HTTP服务器并解决IP无法访问问题解决

一、核心目标与背景 在Unity中搭建本地HTTP服务器&#xff0c;可以用于实现Web与游戏交互、本地数据接口测试、跨设备通信等场景。但在实际部署中&#xff0c;开发者常遇到以下问题&#xff1a; ​本机IP无法访问&#xff1a;服务绑定localhost时&#xff0c;局域网设备无法连…...

如何远程访问svn中的URL

简介&#xff1a; 主要opencascade相关知识学习 格言&#xff1a; 万丈高楼平地起 要远程访问 SVN&#xff08;Subversion&#xff09;仓库中的 URL&#xff0c;通常需要以下步骤和注意事项&#xff1a; 1. 确认远程 SVN 服务器的访问协议 SVN 支持多种协议访问远程仓库&…...

Free Auto Clicker - 在任意位置自动重复鼠标点击

“想让鼠标自己动起来&#xff0c;解放双手去做更有趣的事&#xff1f;”Free Auto Clicker 就像你的数字小助手&#xff0c;能在任意位置自动重复点击鼠标。从玩游戏到刷网页&#xff0c;这款免费工具让你告别枯燥的重复操作&#xff0c;效率瞬间起飞&#xff01; 你有没有想…...

0005__PyTorch 教程

PyTorch 教程 | 菜鸟教程 离线包&#xff1a;torch-1.13.1cpu-cp39-cp39-win_amd64.whl https://download.pytorch.org/whl/torch_stable.html...

Unity Burst编译

官网文档&#xff1a;https://docs.unity3d.com/Packages/com.unity.burst1.8/manual/index.html Unity 之Burst 底层原理&#xff1a;https://zhuanlan.zhihu.com/p/623274986 Burst 编译器入门&#xff08;五&#xff09;&#xff1a;https://developer.unity.cn/projects/5e…...

软件测试中的BUG

文章目录 软件测试的生命周期BugBug 的概念描述 Bug 的要素案例Bug 级别Bug 的生命周期与开发产生争执怎么办&#xff1f;【高频面试题】先检查自身&#xff0c;Bug 是否描述的不清楚站在用户角度考虑并抛出问题Bug 的定级要有理有据提⾼自身技术和业务水平&#xff0c;做到不仅…...

LabVIEW基于IMAQ实现直线边缘检测

本程序基于 NI Vision Development 模块&#xff0c;通过 IMAQ Find Straight Edges 函数&#xff0c;在指定 ROI&#xff08;感兴趣区域&#xff09; 内检测多条直线边缘。用户可 动态调整检测参数 或 自定义ROI&#xff0c;实时观察识别效果&#xff0c;适用于 高精度视觉检测…...

C#:LINQ学习笔记01:LINQ基础概念

一、LINQ 架构体系 1. LINQ 的核心思想 统一查询模型&#xff1a;对对象、XML、数据库等不同数据源使用一致的语法。强类型检查&#xff1a;编译时类型安全&#xff0c;减少运行时错误。 2. 核心组件 技术数据源典型场景LINQ to Objects内存集合 (IEnumerable)过滤/排序集合…...

15Metasploit框架介绍

metasploit目录结构 MSF ——the metasploit framework 的简称。MSF高度模块化&#xff0c;即框架结构由多个module组成&#xff0c;是全球最受欢迎的工具 是一筐开源安全漏洞利用和测试工具&#xff0c;集成了各种平台上常见的溢出漏洞和流行sheellcode&#xff0c;并且保持…...

NLP如何训练AI模型以理解知识

一、自然语言处理&#xff08;NLP&#xff09;的定义与核心目标 1. 什么是自然语言处理&#xff1f; NLP是计算机科学与人工智能的交叉领域&#xff0c;旨在让机器具备以下能力&#xff1a; • 理解&#xff1a;解析人类语言&#xff08;文本或语音&#xff09;的语法、语义和…...

【树莓派学习】树莓派3B+的安装和环境配置

【树莓派学习】树莓派3B的安装和环境配置 文章目录 【树莓派学习】树莓派3B的安装和环境配置一、搭建Raspberry Pi树莓派运行环境1、下载树莓派镜像下载器2、配置wifi及ssh3、SSH访问树莓派1&#xff09;命令行登录2&#xff09;远程桌面登录3&#xff09;VNC登录&#xff08;推…...

python连接neo4j的方式汇总

python连接neo4j的方式汇总 1.官方驱动&#xff08;neo4j&#xff09;特点代码示例 2. 全功能ORM&#xff08;py2neo&#xff09;特点代码示例 3. 领域驱动设计框架&#xff08;neomodel-odm&#xff09;特点代码示例 4. 异步高性能驱动&#xff08;asyncneo4j&#xff09;特点…...

Graph RAG 迎来记忆革命:“海马体”机制让问答更精准!

随着生成式 AI 技术的快速发展,RAG(Retrieval-Augmented Generation)和 Agent 成为企业应用大模型的最直接途径。然而,传统的 RAG 系统在准确性和动态学习能力上存在明显不足,尤其是在处理复杂上下文和关联性任务时表现不佳。近期,一篇论文提出了 HippoRAG 2,这一新型 R…...

Spring(三)容器-注入

一 自动注入Autowire 代码实现&#xff1a; package org.example.spring01.service;import org.springframework.stereotype.Service;Service public class UserService {}package org.example.spring01.controller;import lombok.Data; import lombok.ToString; import org.…...

剧本杀门店预约小程序:市场发展下的刚需

在剧本杀爆发式增长下&#xff0c;门店数字化运营的模式正在市场中逐渐展开&#xff0c;线下门店的竞争方向已发生了全新转变&#xff01; 目前&#xff0c;数字化发展已经成为了消费市场的刚需&#xff0c;利用网络的便捷性提高服务&#xff0c;优化运营&#xff0c;提高自身…...

stable-diffusion-webui 加载模型文件

背景 stable-diffusion-webui 安装完毕后&#xff0c;默认的模型生成的效果图并不理想&#xff0c;可以根据具体需求加载指定的模型文件。国内 modelscope 下载速度较快&#xff0c;以该站为例进行介绍 操作步骤 找到指定的模型文件 在 https://modelscope.cn/models 中查找…...

Ubuntu20.04双系统安装及软件安装(十一):向日葵远程软件

Ubuntu20.04双系统安装及软件安装&#xff08;十一&#xff09;&#xff1a;向日葵远程软件 打开向日葵远程官网&#xff0c;下载图形版本&#xff1a; 在下载目录下打开终端&#xff0c;执行&#xff1a; sudo dpkg -i SunloginClient(按tab键自动补全)出现报错&#xff1a; …...

华为云 | 快速搭建DeepSeek推理系统

DeepSeek&#xff08;深度求索&#xff09;作为一款国产AI大模型&#xff0c;凭借其高性能、低成本和多模态融合能力&#xff0c;在人工智能领域崛起&#xff0c;并在多个行业中展现出广泛的应用潜力。 如上所示&#xff0c;在华为云解决方案实践中&#xff0c;华为云提供的快速…...

printf 与前置++、后置++、前置--、后置-- 的关系

# 前置和前置-- 先看一段代码 大家是不是认为printf输出的是 2 3 3 2 1 1 但是实际输出的是 3 3 3 1 1 1 在这两行printf函数代码里&#xff0c;编译器会先计算 a 和 --a 的值&#xff0c;然后再 从右向左 开始输出。 printf函数中&#xff0c;如果有多个…...

centos7操作系统下安装docker,及查看docker进程是否启动

centos7下安装docker&#xff0c;需要用到的yun命令 &#xff08;yum命令用于添加卸载程序&#xff09; 1.设置仓库&#xff1a; yum-config-manager \--add-repo \http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 2.安装 Docker Engine-Community yum in…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...