unity 接收拼接数据进行纹理替换且保存相机纹理到rtsp server(一)
1 rtsp 协议后编码解码
rtsp协议的问题就是,拼接完成后,还需要编码,而unity里面再需要解码,需要的过程多了一步编码再解码,大大加重了
2 rtsp 协议后轻量编码
rtsp协议使用mjpeg进行图片传输。why?这样做的好处是解码端进行像素处理以后不用再进行h264和h265编码,而unity端也不用再解码一次,这样增加了程序运行效率
3 server
1 rtsp server
2 websocket server
c# c++ 都可以做websocket server,
使用c++ 做一个server
server 既能接收推流,又能接收流
4 unity client
unity 上建立一个两个plane,调整位置
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
//using NetM
public class test : MonoBehaviour
{// Start is called before the first frame updateprivate string msg = null;string[] file1Lines;void Start(){string path = Application.dataPath + "/rtsp.txt";path = path.Replace("/", "\\");//File静态类方式if (File.Exists(path)){Debug.Log("FileExists");file1Lines = File.ReadAllLines(path);foreach (string line in file1Lines){Debug.Log(line);}}else{Debug.Log("FileNotExists");File.CreateText(path);}//Texture2D m_resultTure = new Texture2D((int)widthSize, (int)heighSize, TextureFormat.RGB24, false);//Texture2D m_resultTure = GetComponent(texture1);//texture rigidbody2D = GetComponent(texture1);//rawImage = GetComponent<RawImage>();//rawImage.texture = texture;//NetManager.M_Instance.Connect("ws://127.0.0.1:8888"); //本机地址}private void OnGUI(){//绘制输入框,以及获取输入框中的内容//PS:第二参数必须是msg,否则在我们输入后,虽然msg可以获得到输入内容,但马上就被第二参数在下一帧重新覆盖。msg = GUI.TextField(new Rect(10, 10, 100, 20), msg);//绘制按钮,以及按下发送信息按钮,发送信息if (GUI.Button(new Rect(120, 10, 80, 20), "发送信息") && msg != null){NetManager.M_Instance.Send(msg);}//绘制按钮,以及按下断开连接按钮,发送断开连接请求if (GUI.Button(new Rect(210, 10, 80, 20), "断开连接")){Debug.Log("向服务器请求断开连接......");NetManager.M_Instance.CloseClientWebSocket();}}void Update(){}
}
4.1 websocket client
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Net.WebSockets;
using System.Threading;
using System.Text;public class NetManager
{#region 实现单例的代码//变量private volatile static NetManager m_instance; private static object m_locker = new object(); //属性public static NetManager M_Instance{get{//线程锁。防止同时判断为null时同时创建对象lock (m_locker){//如果不存在对象则创建对象if (m_instance == null){m_instance = new NetManager();}}return m_instance;}}#endregion//私有化构造private NetManager() { }//客户端webSocketprivate ClientWebSocket m_clientWebSocket;//处理接收数据的线程private Thread m_dataReceiveThread;//线程持续执行的标识符private bool m_isDoThread;private bool m_isConnected = false;/// <summary>/// ClientWebSocket,与服务器建立连接。/// </summary>/// <param name="uriStr"></param>public void Connect(string uriStr){try{//创建ClientWebSocketm_clientWebSocket = new ClientWebSocket();//初始化标识符m_isDoThread = true;//创建线程m_dataReceiveThread = new Thread(ReceiveData); //创建数据接收线程 m_dataReceiveThread.IsBackground = true; //设置为后台可以运行,主线程关闭时,此线程也会关闭(实际在Unity中并没什么用,还是要手动关闭)//设置请求头部//m_clientWebSocket.Options.SetRequestHeader("headerName", "hearValue");//开始连接var task = m_clientWebSocket.ConnectAsync(new Uri(uriStr), CancellationToken.None);task.Wait(); //等待//启动数据接收线程m_dataReceiveThread.Start(m_clientWebSocket);//输出提示if (m_clientWebSocket.State == WebSocketState.Open){Debug.Log("连接服务器完毕。");m_isConnected = true;}}catch (WebSocketException ex){Debug.LogError("连接出错:" + ex.Message);Debug.LogError("WebSokcet状态:" + m_clientWebSocket.State);CloseClientWebSocket();}}/// <summary>/// 持续接收服务器的信息。/// </summary>/// <param name="socket"></param>private void ReceiveData(object socket){//类型转换ClientWebSocket socketClient = (ClientWebSocket)socket;//持续接收信息while (m_isDoThread){//接收数据string data = Receive(socketClient);//数据处理(可以和服务器一样使用事件(委托)来处理)if (data != null){Debug.Log("接收的服务器消息:" + data);}//组装纹理//Texture2D tex2D = new Texture2D(100, 100);//tex2D.LoadImage(bytes);}Debug.Log("接收信息线程结束。");}/// <summary>/// 接收服务器信息。/// </summary>/// <param name="socket"></param>/// <returns></returns>private byte[] Receive(ClientWebSocket socket){try{//接收消息时,对WebSocketState是有要求的,所以加上if判断(如果不是这两种状态,会报出异常)if (socket != null && (socket.State == WebSocketState.Open || socket.State == WebSocketState.CloseSent)){byte[] arrry = new byte[1024]; //注意长度,如果服务器发送消息过长,这也需要跟着调整ArraySegment<byte> buffer = new ArraySegment<byte>(arrry); //实例化一个ArraySegment结构体//接收数据var task = socket.ReceiveAsync(buffer, CancellationToken.None);task.Wait();//等待//仅作状态展示。在客户端发送关闭消息后,服务器会回复确认信息,在收到确认信息后状态便是CloseReceived,这里打印输出。Debug.Log("socekt当前状态:" + socket.State);//如果是结束消息确认,则返回null,不再解析信息if (socket.State == WebSocketState.CloseReceived || task.Result.MessageType == WebSocketMessageType.Close){return null;}//如果是字符串//return Encoding.UTF8.GetString(buffer.Array, 0, task.Result.Count);return buffer.Array;}else{return null;}}catch (WebSocketException ex){Debug.LogError("接收服务器信息错误:" + ex.Message);CloseClientWebSocket();return null;}}/// <summary>/// 发送消息/// </summary>/// <param name="content"></param>public void Send(string content){try{//发送消息时,对WebSocketState是有要求的,加上if判断(如果不是这两种状态,会报出异常)if (m_clientWebSocket != null && (m_clientWebSocket.State == WebSocketState.Open || m_clientWebSocket.State == WebSocketState.CloseReceived)){ArraySegment<byte> array = new ArraySegment<byte>(Encoding.UTF8.GetBytes(content)); //创建内容的字节编码数组并实例化一个ArraySegment结构体var task = m_clientWebSocket.SendAsync(array, WebSocketMessageType.Binary, true, CancellationToken.None); //发送task.Wait(); //等待Debug.Log("发送了一个消息到服务器。");}}catch (WebSocketException ex){Debug.LogError("向服务器发送信息错误:" + ex.Message);CloseClientWebSocket();}}/// <summary>/// 关闭ClientWebSocket。/// </summary>public void CloseClientWebSocket(){//关闭Socketif (m_clientWebSocket != null && m_clientWebSocket.State == WebSocketState.Open){var task = m_clientWebSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None);Debug.Log("socekt状态:" + m_clientWebSocket.State);Debug.Log("close");}//关闭线程if (m_dataReceiveThread != null && m_dataReceiveThread.IsAlive){m_isDoThread = false; m_dataReceiveThread = null;}}
}
以上为websocket client, 接收到数据以后就可以替换纹理,接下去我们把里面的纹理图像保存出来,这样可以使用多个不同的camera 来保存不同角度和三维场景中不同的图像流。然后使用websocket 传输出去,形成一个rtsp server。
4.2 脚本start时候读取本地纹理
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using System;
public class canvasrtsp : MonoBehaviour
{// Start is called before the first frame update//public RawImage rawImage;//相机渲染的UI//public GameObject plane1;//相机渲染的GameObject//StartCoroutine(LoadTextureFromInternet("http://avatar.csdnimg.cn/1/E/6/2_u013012420.jpg"));//IEnumerator LoadTextureFromInternet(string path)//{// UnityWebRequest request = new UnityWebRequest(path);// //给request的downloadhandle赋值,new出来的UnityWebRequest不附加downloadhandle// //数据,不赋值的话访问不到下载出来的数据// DownloadHandlerTexture texture = new DownloadHandlerTexture(true);// request.downloadHandler = texture;// yield return request.Send();// if (string.IsNullOrEmpty(request.error))// {// pic = texture.texture;// }// Image tempImage = GameObject.Find("Image").GetComponent<Image>();// Sprite sp = Sprite.Create((Texture2D)pic, new Rect(0, 0, pic.width, pic.height), Vector2.zero);// tempImage.sprite = sp;// GameObject go = GameObject.Find("plane1");// go.GetComponent<MeshRenderer>().material.mainTexture = pic;//}Texture2D Base64ToRGBA32(string imageData, int offset = 0){Texture2D tex2D = new Texture2D(2, 2, TextureFormat.RGB24, false);imageData = imageData.Substring(offset);byte[] data = Convert.FromBase64String(imageData);tex2D.LoadImage(data);return tex2D;}void Start(){string path1 = @"F:\pic\b.png";FileStream fileStream = new FileStream(path1, FileMode.Open, FileAccess.Read);fileStream.Seek(0, SeekOrigin.Begin);byte[] bye = new byte[fileStream.Length];fileStream.Read(bye, 0, bye.Length);fileStream.Close();//创建textureTexture2D texture2D = new Texture2D(240, 144);texture2D.LoadImage(bye);//plane1.gameObject.SetActive(true);GameObject go = GameObject.Find("Plane");//GameObject go1 = GameObject.FindWithTag("ppp");GameObject go1 = GameObject.Find("Cube");//Debug.Log(texture2D.width, texture2D.height);go.GetComponent<MeshRenderer>().material.mainTexture = texture2D;go1.GetComponent<MeshRenderer>().material.mainTexture = texture2D;//T image = GetComponent("image1");}// Update is called once per framevoid Update(){}
}
5 保存相机纹理
增加一个camera capture函数,这个函数将当前相机所见保存成图像
Texture2D CaptureCamera(Camera camera, Rect rect){RenderTexture rt = new RenderTexture((int)rect.width, (int)rect.height, 0);//创建一个RenderTexture对象camera.targetTexture = rt;//临时设置相关相机的targetTexture为rt, 并手动渲染相关相机camera.Render();//ps: --- 如果这样加上第二个相机,可以实现只截图某几个指定的相机一起看到的图像。//ps: camera2.targetTexture = rt;//ps: camera2.Render();//ps: -------------------------------------------------------------------RenderTexture.active = rt;//激活这个rt, 并从中中读取像素。Texture2D screenShot = new Texture2D((int)rect.width, (int)rect.height, TextureFormat.RGB24, false);screenShot.ReadPixels(rect, 0, 0);//注:这个时候,它是从RenderTexture.active中读取像素screenShot.Apply();//重置相关参数,以使用camera继续在屏幕上显示camera.targetTexture = null;//ps: camera2.targetTexture = null;RenderTexture.active = null; //JC: added to avoid errorsGameObject.Destroy(rt);byte[] bytes = screenShot.EncodeToPNG();//最后将这些纹理数据,成一个png图片文件//string filename = Application.dataPath + "/Screenshot.png";string filename = "e:/qianbo2.png";System.IO.File.WriteAllBytes(filename, bytes);Debug.Log(string.Format("截屏了一张照片: {0}", filename));return screenShot;}
readpixel 方式
readpixel方式一定要注意等到 frameEnd 结束才能读取
WaitForEndOfFrame frameEnd = new WaitForEndOfFrame();IEnumerator CaptureScreenshot2(Rect rect){yield return frameEnd;Texture2D screenShot = new Texture2D((int)rect.width, (int)rect.height, TextureFormat.RGB24, false);//先创建一个的空纹理,大小可根据实现需要来设置
#pragma warning disable UNT0017 // SetPixels invocation is slowscreenShot.ReadPixels(rect, 0, 0);//读取屏幕像素信息并存储为纹理数据,
#pragma warning restore UNT0017 // SetPixels invocation is slowscreenShot.Apply();byte[] bytes = screenShot.EncodeToJPG();//然后将这些纹理数据,成一个png图片文件string filename = "e:/qianbo1.JPG";System.IO.File.WriteAllBytes(filename, bytes);Debug.Log(string.Format("截屏了一张图片: {0}", filename));//最后,我返回这个Texture2d对象,这样我们直接,所这个截图图示在游戏中,当然这个根据自己的需求的。//yield return screenShot;}
update
我们使用update 来测试我们的函数,按下空格,按下S,按下F,分别调用函数
void Update(){if (Input.GetKeyDown(KeyCode.Space)){int screenWidth = Screen.width;int screenHeight = Screen.height;RenderTexture rt = new RenderTexture(screenWidth, screenHeight, 24);Camera.main.targetTexture = rt;Camera.main.Render();RenderTexture.active = rt;//激活这个rt, 并从中中读取像素。Texture2D screenShot = new Texture2D(screenWidth, screenHeight, TextureFormat.RGB24, false);screenShot.ReadPixels(new Rect(0, 0, screenWidth, screenHeight), 0, 0);screenShot.Apply();byte[] bytes = screenShot.EncodeToJPG();//string path = Application.dataPath + "/../" + fileName + ".jpg";//string path = Application.dataPath + "/../" + fileName + ".jpg";string path = "e:/qianbo3.jpg" ;File.WriteAllBytes(path, bytes);Debug.Log(string.Format("space: {0}", path));}else if(Input.GetKeyDown(KeyCode.F)){Rect rect = new Rect(10, 10, 300, 200);CaptureScreenshot2(rect);//Debug.Log(string.Format("F: {0}", path));}else if (Input.GetKeyDown(KeyCode.S)){mainCamera = GameObject.Find("Main Camera");Rect rect = new Rect(0, 0, 300, 200);//获取主摄像机的Camera组件//mainCamera= GameObject.Find("MainCamera").GetComponent<Camera>();//Camera ca = Camera.main;CaptureCamera(Camera.main, rect);}}
以下为存储到磁盘的图像
rtsp 方式传输
我们将使用rtsp方式传送抓取到的纹理图像,使用mjpeg over rtsp, 将jpeg 传送到server,由server提供rtsp 服务,或者http服务,使用c++来写这个server,这个由下一次再讲了。
相关文章:
unity 接收拼接数据进行纹理替换且保存相机纹理到rtsp server(一)
1 rtsp 协议后编码解码 rtsp协议的问题就是,拼接完成后,还需要编码,而unity里面再需要解码,需要的过程多了一步编码再解码,大大加重了 2 rtsp 协议后轻量编码 rtsp协议使用mjpeg进行图片传输。why?这样做…...
视频讲解|3014 含分布式电源的配电网优化重构
目录 1 主要内容 2 讲解视频链接 3 部分程序 1 主要内容 该视频为程序目录中编号1034的讲解内容,该程序的链接为配电网优化重构matlab智能算法,本次重点讲解了基本环矩阵原理以及代码两步实现过程、如何利用基本环向量去创造可行解、粒子群优化过程、…...
分布式、锁、延时任务
1. redission redission 原理 Redis分布式锁-这一篇全了解(Redission实现分布式锁完美方案) 2.zk 2.1 指令 ls / / 下有哪些子节点 get /zookeeper 查看某个子节点内容 create /aa “test” delete /aa set /aa “test01” 2.2 创建节点 模式 默认创建永久 create -e …...
Mojo 语言官网
Mojo面向 AI 开发者的新型编程语言,无缝支持CPU、GPU,兼容Python,跟Python类似的语法,但是比Python快68000倍。目前Mojo仅支持Ubuntu,暂不支持Windows和Mac,可以在Mojo Playground先体验一下。 Mojo 语言…...
JTS:02 使用WKB操作数据
版本 org.locationtech.jts:jts-core:1.19.0 链接: github 代码 import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.geom.GeometryFactory; import org.locationtech.jts.geom.Point; import org.loca…...
stonedb部署实践
1.使用docker部署,会有一些问题,启动失败: xiuchenggongxiuchengdeMacBook-Pro stonedb % docker logs 27a92a0510fd _main[ -f …...
wsl使用apt install net-tools报错
前两天折腾了几个小时把wsl安装好了,后面准备安装ifconfig命令的时候发现网络有问题,总结处理过程如下: 1.修改/etc/wsl.conf文件,修改后wsl.conf文件内容如下: [boot] systemdtrue [network] generateResolvConffals…...
python 使用requests爬取百度图片并显示
爬取百度图片并显示 引言一、图片显示二、代码详解2.1 得到网页内容2.2 提取图片url2.3 图片显示 三、完整代码 引言 爬虫(Spider),又称网络爬虫(Web Crawler),是一种自动化程序,可以自动地浏览…...
DataSecurity Plus:守护企业数据安全的坚实堡垒
在当今数字化时代,数据被认为是企业最宝贵的资产之一。然而,企业面临着巨大的数据安全挑战,其中之一就是数据泄露。数据泄露可能导致敏感信息的丧失、法律责任的追究以及声誉受损。因此,保护企业数据安全已经成为每个组织的首要任…...
《树莓派4B家庭服务器搭建指南》第二十一期:安装开源远程桌面服务rustdesk, 内网丝滑,外网流畅控制
title: 《树莓派4B家庭服务器搭建指南》第二十一期:安装开源远程桌面服务rustdesk, 内网丝滑,外网流畅控制Windows,macOS,Linux设备 tags: 个人成长 categories:树莓派不吃灰 前段时间, 有一台老式MacBook Pro被我改造成了影视资源解码主机, 《树莓派4B家庭服务器搭…...
Redis 分布式锁
面试题: Redis除了拿来做缓存,你还见过基于Redis的什么用法? 1.数据共享,分布式Session 2.分布式锁 3.全局ID 4.计算器、点赞 5.位统计 6.购物车 7.轻量级消息队列:list、stream 8.抽奖 9.点赞、签到、打卡 10.差集交集…...
水循环原理VR实景教学课件开发
日本核污水排海让人们越来越重视海洋大气层水循环的安全,水循环是一个周而复始、循环往复的动态过程,为了将水循环过程以形象、生动地形式展示出来,水循环VR全景动态演示逐渐受到大家青睐。 传统的水循环教育方式通常是通过图片、动画或实地考…...
[小尾巴 UI 组件库] 全屏响应式轮播背景图(基于 Vue 3 与 Element Plus)
文章归档于:https://www.yuque.com/u27599042/row3c6 组件库地址 npm:https://www.npmjs.com/package/xwb-ui?activeTabreadme小尾巴 UI 组件库源码 gitee:https://gitee.com/tongchaowei/xwb-ui小尾巴 UI 组件库测试代码 gitee:…...
关于ESP32S3无法识别到端口问题
前言 (1)因为实习问题,需要使用ESP32BOX进行二次开发。一般来说,接触一款MCU,3天上手是基本操作。但是对于乐鑫的芯片,环境搭建是真的折磨人(苦笑),而且官方文档几乎没有…...
如何判断bug是前端bug还是后端bug
1.前后端bug 特征: 前端主要负责显示数据,后端主要负责处理数据、存储数据,前后端主要通过接口进行数据交换。 前端bug的特征: 界面显示类问题:如文字大小不一,控件颜色不搭,控件不整齐&#x…...
EasyExcel填充数据EasyExcel填充数据流下载 easyexcel填充excel下载 easyexcel填充
EasyExcel填充数据EasyExcel填充数据流下载 easyexcel填充excel下载 easyexcel填充 1、填充数据然后将文件输出给浏览器 1、填充数据然后将文件输出给浏览器 官网地址 官网的demo填充生成的是file文件, 实际需求用的最多的是 填充完数据将Excel输出给浏览器 填充模版Excel文…...
精通数据集成:轻易云数据集成平台应用实战与技术内幕
企业系统中数据交互的重要性不言而喻。一个系统如果孤立运行,即使积累了海量数据,仍然是一座信息孤岛。另一方面,一个积极参与数据交互的系统,成为各系统之间的“交际花”,具备中台的性质。 然而,大多数情况…...
“2023中国数字化服务之选”榜单发布,谷器数据荣耀登榜!
9月7日,行业权威媒体Internet Deep联合eNET研究院、德本咨询重磅发布了“2023中国数字化服务之选”榜单,经专家评审认定,谷器数据凭借领先的综合技术实力与产品应用创新能力荣耀登榜! 谷器数据生产制造数字化服务根据客户整体需求…...
iisfastchi漏洞复现
1.查看版本 2.在路径中写入 php脚本 发现使用不了 3.环境搭建 结局打开 把限制打开...
虚拟机Ubuntu操作系统常用终端命令(详细解释+详细演示)
虚拟机Ubuntu操作系统常用终端命令 本篇讲述了Ubuntu操作系统常用的三个功能,即归档,软链接和用户管理方面的相关知识。希望能够得到大家的支持。 文章目录 虚拟机Ubuntu操作系统常用终端命令二、使用步骤1.归档1.1创建档案包1.2还原档案包1.3归档并压缩…...
【力扣每日一题】2023.9.12 课程表Ⅳ
目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 今天是课程表系列题目的最后一题,因为我在题库里找不到课程表5了,所以今天的每日一题就是最后一个课程表了。 题…...
CentOS 安装HTTP代理服务器 Tinyproxy
Tinyproxy是一个小型的基于GPL的HTTP/SSL代理程序,非常适合小型网络而且便于快速部署。这个代理程序最大的优点就是占用系统资源比较少。这里使用的系统为CentOS7.6,可以直接 yum 方式安装。 yum install tinyproxy -y 如果提示找不到安装包࿰…...
PHPWord 模板输出checkbox复选框和checked已勾选状态,以及 模板替换时数据如何分行
PHPWord 模板输出checkbox复选框和checked已勾选状态,以及 模板替换时数据如何分行 期望目标 和 模板配置复选框代码数据分行显示在使用PHPWORD模板替换时,经常会有 动态渲染选择项 和 选择项需要被勾选的要求,以及动态数据分行显示等要求。 本文根据 空复选框、勾选复选框…...
vue学习之 v-for key
v-for key Vue使用 v-for渲染的元素列表时,它默认使用“就地更新”的策略。如果数据项的顺序被改变,Vue 将不会移动 DOM元素来匹配数据项的顺序,而是就地更新每个元素。创建 demo9.html,内容如下 <!DOCTYPE html> <html lang"…...
ARM接口编程—IIC总线(exynos 4412平台)
IIC总线简介 IIC总线是Philips公司在八十年代初推出的一种串行、半双工总线 主要用于近距离、低速的芯片之间的通信;IIC总线有两根双向的信号线一根数据线SDA用于收发数据,一根时钟线SCL用于通信双方时钟的同步;IIC总线硬件结构简单ÿ…...
ReactNative进阶(二十一)开源插件 react-native-device-info 获取设备信息
文章目录 一、前言二、拓展阅读 一、前言 项目开发过程中,需要获取设备信息,例如获取设备名称。可通过使用开源的第三方组件react-native-device-info,该组件适用于iOS和Android双平台。 在ReactNative项目中可通过npm命令下载 react-nativ…...
MySql学习笔记05——DML
DML 插入数据insert insert into 表名(字段名1,字段名2,字段名3...)values(值1,值2,值3);字段名和值要一一对应(顺序对应,数据类型对应) insert into t_student(no,name,sex,age,…...
halcon对图片进行处理基础
实例图片 C:\Users\Public\Documents\MVTec\HALCON-19.11-Progress\examples\images*读取图片 read_image (Image1, D:/c/image/1.png) *读取大小 get_image_size(Image1,Width, Height) *创建窗口 dev_close_window() dev_open_window(0, 0, Width, Height, black, WindowHan…...
element-ui在vue中如何实现校验两个复选框至少选择一个!
整体进行验证 想验证至少选择一个复选框,可以将这两个复选框视为一个整体进行验证。在 Element UI 中,可以使用自定义验证规则来实现这一点。 你可以在 rules 对象中定义一个自定义的验证规则来检查 isCheck1 和 isCheck2 至少有一个被选中。 以下是一…...
DeepinV20/Ubuntu安装postgresql方法
首先,建议看一下官方的安装文档PostgreSQL: Linux downloads (Ubuntu) PostgreSQL Apt Repository 简单的说,就是Ubuntu下的Apt仓库,可以用来安装任何支持版本的PgSQL。 If the version included in your version of Ubuntu is not the one…...
进一步加强区门户网站建设管理/网店运营推广中级实训
我的网站上有两个下拉菜单。使用的技术有javascript、php、mysql。City : [ ]Area : [ ]TODO:当用户选择城市时,我想查询城市中区域的数据库,并动态填充区域下拉菜单。当用户选择区域时,我想再次查询数据库中属于该特定区域和城市的结果。像这样的事情(一步一步)。------------…...
什么网站可以分享wordpress/seo技术306
远程桌面连接错误:由于安全设置错误,客户端无法连接到远程计算机。 解决方法: 按 Win R 运行输入:secpol.msc 依次打开本地策略 -> 安全选项 -> 系统加密:将 FIPS 兼容算法用于加密、哈希和签名。默认该项安全…...
大连网站优化方案/广州网页制作
此时只需要在配置文件my.cnf中加入以下语句: default-storage-engineINNODB character-set-serverutf8 collation-serverutf8_general_ci 然后重启数据库 再次查看: 问题即可解决!...
网站链接怎么做/百度权重工具
MySQL以以下规则描述比较操作如何进行转换:两个参数至少有一个是 NULL 时,比较的结果也是 NULL,例外是使用 <> 对两个 NULL 做比较时会返回 1,这两种情况都不需要做类型转换两个参数都是字符串,会按照字符串来比…...
男女做那事是什 网站/网站网络优化外包
Context initial new InitialContext(); Object objref initial.lookup("java:comp/env/ejb/SimpleConverter"); 一般情况下,intial.lookup("")中的参数就是你的JNDI名称。但是用的应用服务器,是把JNDI名放到java:comp/env/ej…...
开一个网站建设公司需要什么软件/东莞做好网络推广
mysql连接池的实现前言池化技术数据库连接池什么是数据库连接池为什么使用数据库连接池不使用连接池的执行过程使用连接池的执行过程数据库连接池运行机制连接池和线程池的关系线程池设计与代码实现线程池设计要点构造函数初始化获取连接池内的连接归还连接至连接池析构函数连接…...