一体机(广告投放机)开发
序言
当今社会广告随处可见,广告展现在大家面前也各尽不同,如电视、报纸、网络、车站、公车等等应有尽有,广告是无处不在,如不想见到广告那就不要出门、不要打开电脑手机、这样或许能暂时看不到广告。从这可见广告在人们生活中起到的作用,很多人都会根据广告去购买相关商品,所以现在才导致越来越多的企业不惜重金去打广告。然而广告又是人们非常讨厌的东西,比如在看电视时突然给你来一段广告,哎…广告泛滥的年代,你我都是广告受害者。
我今天给大家介绍一个广告一体机的实现思路,供大家一起交流学习,共同进步。也许我说的不是很好的思路,仅供参考。
一体广告机介绍
我所介绍的广告机就是一台大家可能都见过的,如机场、车站等等场所都能看见,它是一台立体的广告机,里面有一台电脑主机,一块比较大的触摸屏,这样可能就可以组装成一台一体机了。而我们的一体机还集成了发卡机(会员注册会将用户信息写入到卡片中,再发卡片)、POS机(进行交易)、UPS(备用电源)、摄像头(拍照)等等集成于一体的机器,显得功能好像比一般的广告机要强大很多是吧。
首先会轮播相应的图片,当有人触摸了屏幕,就会根据图片跳转到相应的网站,网站为相应的商品信息,这样可以在这个网站进行注册,购买商品等等操作,后续好像还可以实现试衣镜效果,就是选中衣服后根据拍摄的照片把你身体相应的尺寸再将衣服穿在身上,这样实现试衣镜的效果,O(∩_∩)O哈哈~,这就是我所介绍的一体广告机。
实现思路
一体广告机是一个基于C/S结构.net开发平台,主要以winform开发应用程序,针对win7操作系统,并默认嵌套某电子商务平台。
某电子商务平台的整个系统架构是一个基于BS结构的J2EE多层架构。面向用户访问层面的是由WEB门户组成。访问层下面是应用和业务集成层;为应用业务支撑的是应用服务器层。
服务器端:J2ee网站开发WebServic提供“广告图片下载”接口和远程“安装文件更新”接口。
客户端:访问远程“安装文件更新接口”实现自动更新功能,访问远程“广告图片下载接口”实现远程更新下载功能,并利用广告图片实现轮播功能。
一体机实现功能
- 自动开机功能
当一体机开机时,系统每天自动远行应用程序。应用程序运行时自动通过互联网访问网站的webservices远程接口,跟据该终机的地理位置参数,下载网站的广告图片,并加载到一体机的本地文件中,以准备程序运行广告的信息。
- 广告轮播功能
广告轮播功能,当系统定时远行轮播广告,当点击了该程序广告图片链接后,系统退出轮播广告应用,直接跳到相关链接的主界面。
- 自动更新功能
一体机还具备自动更新功能,当网站服务器上传了要更新的应用程序包以后,系统在一开始开机运行时检查网站程序包的更新版本号,如服务器的版本号比一体机版本号大,系统自动更新程序。
- 二维码生成与解码功能
一体机对网站的链接可进行二维码的加密,产生二维护图片显示在系统的右上角,利用二维码解码可还原当前的链接。难点:摄像头捕捉二维码,摄像成图及清晰度,系统对图片识别功能的问题,第二摄像会有背景图干扰,手机抓取系统较难区分二维图与背景。
一体机配置参数
一体机参数
<xml>
终端机ID =”1111”
地区ID=”222”
所在机场=”白云机场”
所在机场位置=”A1”
当前版本号=”1”
UserID=
</xml>
广告列表参数
<xml> <AD name=”广告名称” url=”广告所在链接” area=”区域”></AD> <AD name=”广告名称” url=”广告所在链接” area=”区域”></AD> <AD name=”广告名称” url=”广告所在链接” area=”区域”></AD> 区域=地区ID + 所在机场 </xml>
一体机运行流程
后台数据结构
一体机维护 |
|||
字段 |
名称 |
类型 |
说明 |
终端机 |
id |
int |
与用户表关联 |
地区编码 |
regionId |
int |
与地区表关联 |
所在机场 |
airport |
varchar |
|
机场位置 |
Place |
varchar |
|
版本号 |
version |
int |
|
广告维护 |
|||
字段 |
名称 |
类型 |
说明 |
广告名称 |
ADName |
varchar |
|
广告链接 |
ADUrl |
varchar |
|
地区编码 |
regionId |
int |
与地区表关联 |
所在机场 |
airport |
varchar |
|
功能模块
1上传更新包程序
程序维护通过系统后台上传前台的更新包,通过后台上传,并产生版本号,以便客户端当检测网站到有最新的更新包,从网站上下载解压后,更新到客户端机上。
2.一体机设置
一体机维护可添加,修改终端机的设置,不同终端机跟用户关联,每台终端机相关于一个用户,终端机所处位置设立,有助于我们区分终端机处在不同地区的,广告图片是跟据不同区域进行下载管理。
3.广告设置
广告设置主要以轮播广告为主,可添加,修改,删除广告图片,上传广告图片,以便前台终端从网站上相应的链接下载图片。
4. 网站接口
后台制作两个接口供前台调用(程序更新接口,图片下载更新接口)。
5.自动更新程序
前台在开机时,先调用自动运行程序,通过远程接口(WebServices),判断是否有更新程序及下载图片需要更新,从网站平台上更新必须数据,再启动主程序。
6.轮播广告
主程序包括轮播广告功能,跟据配置文件的列表,从指定的文件目录中图片定时显示在主屏幕上(可利用windows屏保功能),当接触到触摸屏后,停止广告轮播,跳到主程序的网站上。
7. 嵌入网站
主程序还包括嵌套网站,终端机直接连接网站链接,所有网站操作都在终端机上操作。
8. POS支付
主程序嵌入网站,当网站在进行销售时,用户选择立即支付时,网页可利用At启动应用程序的POS支付功能。
银联POS机接口,内置无线POS机分为刷卡器,打印机集成在一体机上,直接通过POS机对银行进行交易,交易数据从本地页面ActiveX控制进行数据传输,ActiveX通过获取用户输入的卡号、密码、金额通过银联加密机制进行加密,通过无线POS终端进行传送,传送成功后返回有效信息,ActiveX从上传到网站服务器上,表示支付成功。
我所使用的广告滚动使用的是flash来实现,调用了VS的Interop.ShockwaveFlashObjects.dll文件,这个VS自带的。首先是屏蔽flash右键的实现代码(主要作用是单击右键不会出现其他菜单,否则就会出现点击右键有其他菜单显示,这肯定不符合广告的要求的,所以必须要屏蔽flash右键,实现逻辑也是调用钩子去屏蔽右键):
#region * 屏蔽FLASH右键
//此段代码实现调用系统函数,来实现窗体
//加载flash时,可以屏蔽其右键
private const int GWL_WNDPROC = -4;
public delegate IntPtr FlaWndProc(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);
private IntPtr OldWndProc = IntPtr.Zero;
private FlaWndProc Wpr = null;
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr SetWindowLong(IntPtr hWnd, int nIndex, FlaWndProc wndProc);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr CallWindowProc(IntPtr wndProc, IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);
//给此控件一个特定消息值
private IntPtr FlashWndProc(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam)
{
if (msg == 516)
return (IntPtr)0;
return CallWindowProc(OldWndProc, hWnd, msg, wParam, lParam);
}
#endregion
FormLoad加载flash,并设定程序的分辨率(更加广告机的分辨率去设定,这样避免程序显示不正确,因为要控制广告机除了播放滚动的图片之外,就是跳转相应的网站,而不允许进行桌面,否则别人就会做很多其他操作了,所以这点必须要控制的,而且图片的分辨率也是这样的,所以这样就这样就固定死程序的分辨率了),并且加载swf文件,并开始play,实现flash滚动,实现代码如下:
this.Width = 1080;
this.Height = 1920;
this.Location = new Point(0, 0);
//--
this.timer1.Enabled = true;
this.timer1.Interval = 100;
this.timer1.Start();
//--
//屏蔽右键
this.Wpr = new FlaWndProc(this.FlashWndProc);
this.OldWndProc = SetWindowLong(axShockwaveFlash1.Handle, GWL_WNDPROC, Wpr);
//--加载FLASH
this.axShockwaveFlash1.Movie = Application.StartupPath + @"//Flash//apaperstudio.swf";
axShockwaveFlash1.Play();
//--
ReadUserInfo();//--读取用户信息
//--
LoadWeb();//--预加载网站
读取用户信息是XML文档,这样可以进行在现场进行配置,使用起来就比较方便。
/// <summary>
/// 读取用户信息
/// </summary>
protected virtual void ReadUserInfo()
{
//--从autorun.xml文件中读取配置文件
string autPath = "";
autPath = Application.StartupPath + @"//autorun.xml";//配置文件目录
if (!File.Exists(autPath))//判断程序目录是否存在配置文件
{
MessageBox.Show("配置文件不存在,请联系管理员!");
return;
}
XmlDocument xmldoc = new XmlDocument();
xmldoc.Load(autPath);//加载XML文件
XmlNodeList audList = xmldoc.SelectSingleNode("Root").ChildNodes;//获取Root节点的所有子节点
foreach (XmlNode xn in audList)//遍历所有子节点
{
XmlElement xe = (XmlElement)xn;//将子节点类型转换为XmlElement类型
userIDStr = xe.GetAttribute("UserID");//用户ID
}
}
XML文件如下:
<?xml version="1.0" encoding="UTF-8"?> <Root> <Para TerminalID="1111" AreaID="85" Airport="福田" AirportPlace="A1" UserID="adminUserId" Version="14" /> </Root>
预加载网站实现代码如下,这些数据都是通过升级程序下载到,并保存在本地,再供一体机程序调用:
/// <summary>
/// 预加载网站
/// </summary>
protected virtual void LoadWeb()
{
//--从ADXml.xml文件中读取广告列表
string autPath = "";
autPath = Application.StartupPath + @"//ADXml.xml";//广告列表目录
if (!File.Exists(autPath))//判断程序目录是否存在广告列表
{
MessageBox.Show("广告列表不存在,请联系管理员!");
return;
}
XmlDocument xmldoc = new XmlDocument();
xmldoc.Load(autPath);//加载XML文件
XmlNodeList audList = xmldoc.SelectSingleNode("ADRoot").ChildNodes;//获取ADRoot节点的所有子节点
foreach (XmlNode xn in audList)//遍历所有子节点
{
XmlElement xe = (XmlElement)xn;//将子节点类型转换为XmlElement类型
string url = xe.GetAttribute("url");//预加载的网址
webBrowser1.Navigate(url);
System.Threading.Thread.Sleep(5000);//--休眠5S
}
}
广告XML文件:
<?xml version="1.0" encoding="UTF-8"?> <ADRoot> <AD name="终端7" imgLink="attachments/imgs/ad/201111/016965953952723834xorg.jpg" url="www.darenbang.com/taoletao/front/activity/activityIndex.do" area="85" place="福田" /> <AD name="终10" imgLink="attachments/imgs/ad/201111/066067356307548920xorg.jpg" url="www.darenbang.com/taoletao/front/bbase/productSearch.do?type=2&Q_newProduct_SN_EQ=1" area="85" place="福田" /> <AD name="终端9" imgLink="attachments/imgs/ad/201111/012278613580213338xorg.jpg" url="www.darenbang.com/taoletao/front/index/channelsPage.do?categoryId=7" area="85" place="福田" /> <AD name="终端4" imgLink="attachments/imgs/ad/201111/052606357223467712xorg.jpg" url="www.darenbang.com" area="85" place="福田" /> <AD name="终端5" imgLink="attachments/imgs/ad/201111/023391954847731068xorg.jpg" url="www.darenbang.com/taoletao/front/activity/activityBuyer.do" area="85" place="福田" /> <AD name="终端6" imgLink="attachments/imgs/ad/201111/007393856959106082xorg.jpg" url="www.darenbang.com/taoletao/front/activity/activityFront.do" area="85" place="福田" /> </ADRoot>
点击FLASH图片跳转网站,再通过连接打开相应的网站,这个在flash代码进行了定义,所以使用cmd命令就可以打开相应的网站,再根据链接跳转到相应的网站,打开的网站也之前在我们的程序中进行打开,使用的是webBrowser控件,这样就控制只能打开我们所指定的网站。
#region * 点击FLASH图片跳转网站
private void axShockwaveFlash1_FSCommand(object sender, AxShockwaveFlashObjects._IShockwaveFlashEvents_FSCommandEvent e)
{
if (e.command == "cmd")
{
WebForm xForm = new WebForm(e.args.ToString() + "?id=" + userIDStr);//设定跳转的网站+用户ID
xForm.Show();
}
}
#endregion
程序启动时会调用Timer事件,启动程序升级,在相应的时间节点(可以设定多个时间检测是否需要升级)进行升级。
#region * 启动升级程序
ArrayList AutoTask = new ArrayList();
private void timer1_Tick(object sender, EventArgs e)
{
System.DateTime dtAuto = DateTime.Now;
AutoTask.Add("00:00:00");
for (int n = 0; n < AutoTask.Count; n++)
{
if (dtAuto.ToLongTimeString().Equals(AutoTask[n]))
{
System.Diagnostics.Process.Start(Application.StartupPath + @"\\AutoUpdater.exe"); //启动程序
this.Close();//--关闭升级程序
this.Dispose();
}
}
}
#endregion
升级程序会做几件事情:
1. 通过Webservice下载一体机的程序,根据版本号比较决定是否需要升级。
2. 通过Webservice下载一体机的广告图片,这样在相应的网站后台对图片进行维护,将广告数据保存在本地的XML文件中,供程序读取XML文件。
通过WebService下载数据,程序或广告图片,实现逻辑如下:
#region * 通过WebService下载数据
public virtual void DownloadWebServiceData()
{
//--绑定Webservice
ws = new AutoUpdater.WebService.AdvertisWebServicesService();
ws.Url = "http://www.fmafia.com/taoletao/AdvertisWebServices.jws?wsdl";
//--
//--从autorun.xml文件中读取配置文件
string autPath = "";
autPath = Application.StartupPath + @"//autorun.xml";//配置文件目录
if (!File.Exists(autPath))//判断程序目录是否存在配置文件
{
MessageBox.Show("配置文件不存在,请联系管理员!");
return;
}
xmldoc.Load(autPath);//加载XML文件
XmlNodeList audList = xmldoc.SelectSingleNode("Root").ChildNodes;//获取Root节点的所有子节点
foreach (XmlNode xn in audList)//遍历所有子节点
{
XmlElement xe = (XmlElement)xn;//将子节点类型转换为XmlElement类型
idStr = Convert.ToInt32(xe.GetAttribute("TerminalID"));//终端机ID
areaStr = Convert.ToInt32(xe.GetAttribute("AreaID"));//地区
placeStr = xe.GetAttribute("Airport");//机场
airportPlaceStr = xe.GetAttribute("AirportPlace");//机场位置
userIDStr = xe.GetAttribute("UserID");//用户ID
versionStr = Convert.ToInt32(xe.GetAttribute("Version"));//版本号
}
//--********************************************************************************************
//--图片下载
if (DownImage() == false) { return; };
//--********************************************************************************************
//--文件下载
if (DownFile() == false) { return; };
}
#endregion
图片的下载,webservice接口由Java实现的,C#程序直接调用接口程序即可:
#region * 图片下载
/// <summary>
/// 图片下载
/// </summary>
protected virtual Boolean DownImage()
{
//--**************************************************************************************************************************************
//--第二步从webservice下载广告数据
string xStr = "";
try
{
xStr = ws.getAdvertisList(areaStr, placeStr);
}
catch (Exception)
{
MessageBox.Show("读取远程数据失败!");
return false;
}
//--***************************************************************************************************************************************
//--String类型XML转成XML文档
XmlDocument doc = new XmlDocument();
try
{
doc.LoadXml(xStr);//加载XML文档
}
catch (Exception xEr)
{
MessageBox.Show(xEr.Message);
return false;
}
string xmlPath = "";
xmlPath = Application.StartupPath + @"\ADXml.xml";//保存XML的路径
//检测XML文件是否已存在
if (File.Exists(xmlPath))
{
File.Delete(xmlPath);//删除该文件
doc.Save(xmlPath);//保存XML文件
}
else
{
doc.Save(xmlPath);//保存XML文件
}
//--**************************************************************************************************************************************
//--根据下载的广告XML数据重新生成一个新的XML文档,新XML文档即用于FLASH的加载图片所用
if (File.Exists(xmlPath))
{
//--把广告XML文档数据写入临时Datatable1中
xDataTable1.Clear();
//--
xmldoc.Load(xmlPath);//加载本地XML文件
XmlNodeList nodeList = xmldoc.SelectSingleNode("ADRoot").ChildNodes;//获取ADRoot节点的所有子节点
foreach (XmlNode xn in nodeList)//遍历所有子节点
{
XmlElement xe = (XmlElement)xn;//将子节点类型转换为XmlElement类型
DataRow xDataRow1 = xDataTable1.NewRow();
xDataRow1[0] = xe.GetAttribute("name");
xDataRow1[1] = CompanyUrl + xe.GetAttribute("imgLink");//--加入链接地址,即为图片下载地址
xDataRow1[2] = xe.GetAttribute("url");
xDataRow1[3] = xe.GetAttribute("area");
xDataRow1[4] = xe.GetAttribute("place");
xDataTable1.Rows.Add(xDataRow1);
}
}
else
{
MessageBox.Show("广告数据并未存在,请联系管理员!");
return false;
}
//--**************************************************************************************************************************************
//--下载图片
if (xDataTable1 != null)
{
for (int i = 0; i < xDataTable1.Rows.Count; i++)//循环下载图片
{
//--
string ImagePath = "";
ImagePath = Application.StartupPath + @"\Flash\swf\" + xDataTable1.Rows[i]["Name"].ToString().Trim() + ".JPG";//检测图片是否已经存在
//检测图片文件是否已存在,如果已经存在不再进行下载,不存在则进行下载
if (!File.Exists(ImagePath))//检测文件是否存在
{
DownloadImage(xDataTable1.Rows[i]["Name"].ToString().Trim() + ".JPG", xDataTable1.Rows[i]["imgLink"].ToString().Trim());//调用数据下载方法
}
else
{
//如果图片文件已经存在,则不进行处理,自动跳过
}
}
}
//--***************************************************************************************************************************************
//--生成FLASH加载图片的XML文件
xmldoc = new XmlDocument();
//--加入XML生命段落
XmlDeclaration xmldecl;
xmldecl = xmldoc.CreateXmlDeclaration("1.0", "GB2312", null);//创建XML的头元素
xmldoc.AppendChild(xmldecl);//添加元素
//--加入一个根元素
xmlelem = xmldoc.CreateElement("", "imgList", "");
xmldoc.AppendChild(xmlelem);
//--
if (xDataTable1 != null)
{
//--循环DataTable写入XML文档中,用于FLASH的加载
for (int i = 0; i < xDataTable1.Rows.Count; i++)
{
//--在根节点中添加元素
XmlNode root = xmldoc.SelectSingleNode("imgList");
XmlElement xe1 = xmldoc.CreateElement("list");
xe1.SetAttribute("path", Application.StartupPath + @"\Flash\swf\" + xDataTable1.Rows[i]["Name"].ToString().Trim() + ".JPG");//FLASH加载图片地址
xe1.SetAttribute("info", "");//FLASH图片显示的描述,现不需要,暂时为空
xe1.InnerText = xDataTable1.Rows[i]["url"].ToString().Trim();//点击FLASH跳转的网站
root.AppendChild(xe1);
}
}
xmldoc.Save(Application.StartupPath.ToString() + @"\\Flash\\imgList.xml");//FLASH加载的XML
//--图片下载完成
return true;
}
#endregion
#region * 图片下载操作方法
/// <summary>
/// 图片下载操作方法
/// </summary>
/// <param name="FileName">图片名字</param>
/// <param name="Url">图片下载地址</param>
public virtual void DownloadImage(string FileName, string Url)
{
WebRequest request = WebRequest.Create(Url);
WebResponse response = request.GetResponse();
Stream reader = response.GetResponseStream();
string FilePath = Application.StartupPath + @"//Flash//swf";//存放图片的文件夹
//--检测文件夹是否存在
if (!Directory.Exists(FilePath))
{
//如果不存在就创建该文件夹
Directory.CreateDirectory(FilePath);
}
FileStream writer = new FileStream(FilePath + @"//" + FileName, FileMode.OpenOrCreate, FileAccess.Write);
byte[] buff = new byte[5120];//--5M的图片
int c = 0;
//实际读取的字节数
while ((c = reader.Read(buff, 0, buff.Length)) > 0)
{
writer.Write(buff, 0, c);
}
writer.Close();
writer.Dispose();
reader.Close();
reader.Dispose();
response.Close();
}
#endregion
以上可能显示比较多的是对XML的读写操作而已,相对而言比较简单。
文件下载的实现逻辑:
#region * 文件下载
/// <summary>
/// 文件下载
/// </summary>
protected virtual Boolean DownFile()
{
//--**************************************************************************************************************************************
//--第一步从webservice下载更新程序
string xFileStr = "";//定义下载文件的路径
try
{
xFileStr = ws.getUpdatePack(versionStr);//从webservice读取下载信息
}
catch(Exception)
{
MessageBox.Show("读取远程数据失败!");
return false;
}
string xFileSavePath = "";//定义保存文件的路径
xFileSavePath = Application.StartupPath + @"\\YTJ.exe";
if (xFileStr != null)//--需更新文件
{
string xFileDowmLoadPath = CompanyUrl + xFileStr;//下载文件的路径
if (File.Exists(xFileSavePath))//检测文件是否存在,如果存在则删除
{
//先杀死进程中的文件
System.Diagnostics.Process[] ps = System.Diagnostics.Process.GetProcesses();
foreach (System.Diagnostics.Process p in ps)
{
if (p.ProcessName.ToLower() == "ytj")
{
p.Kill();//杀死进程
break;
}
}
//--
Thread.Sleep(2000);//--休眠2秒
File.Delete(xFileSavePath);//--删除文件
//--
DownloadFile(xFileSavePath, xFileDowmLoadPath);//文件下载
UpdateVersion();//版本号的更新
//--
}
else//不存在直接创建
{
DownloadFile(xFileSavePath, xFileDowmLoadPath);//文件下载
UpdateVersion();//版本号的更新
}
}
else
{
//--如果文件的版本号相同,则不需要进行下载操作
//--不需要更新文件,可直接打开应用程序
}
//启动程序
//启动应用程序之前先杀死进程中的文件,防止程序多次打开
System.Diagnostics.Process[] pss = System.Diagnostics.Process.GetProcesses();
foreach (System.Diagnostics.Process p in pss)
{
if (p.ProcessName.ToLower() == "ytj")
{
p.Kill();
break;
}
}
System.Diagnostics.Process.Start("YTJ.exe"); //启动程序
this.Close();//--关闭升级程序
this.Dispose();
//--
//--****************************************************************************************************************************************
//--文件更新完成
return true;
}
/// <summary>
/// 版本号的更新
/// </summary>
protected virtual void UpdateVersion()
{
//--文件更新后,配置文件XML文档中的版本号增加"1"。
//--修改版本号
//--从autorun.xml文件中读取配置文件
string autPath = "";
autPath = Application.StartupPath + @"//autorun.xml";//配置文件目录
if (!File.Exists(autPath))//判断程序目录是否存在配置文件
{
MessageBox.Show("配置文件不存在,请联系管理员!");
return;
}
xmldoc.Load(autPath);//加载XML文件
XmlNodeList audList = xmldoc.SelectSingleNode("Root").ChildNodes;//获取Root节点的所有子节点
foreach (XmlNode xn in audList)//遍历所有子节点
{
XmlElement xe = (XmlElement)xn;//将子节点类型转换为XmlElement类型
xe.SetAttribute("Version", Convert.ToString((versionStr + 1)));//修改版本号,并增加1
}
xmldoc.Save(autPath);//保存XML文件
}
#endregion
文件下载操作方法
#region * 文件下载操作方法
/// <summary>
/// 文件下载操作方法
/// </summary>
/// <param name="FileName">文件名</param>
/// <param name="Url">文件下载地址</param>
public virtual void DownloadFile(string xFile, string Url)
{
WebRequest request = WebRequest.Create(Url);
WebResponse response = request.GetResponse();
Stream reader = response.GetResponseStream();
FileStream writer = new FileStream(xFile, FileMode.OpenOrCreate, FileAccess.Write);
byte[] buff = new byte[10240];//--10M的文件
int c = 0;
//实际读取的字节数
while ((c = reader.Read(buff, 0, buff.Length)) > 0)
{
writer.Write(buff, 0, c);
}
writer.Close();
writer.Dispose();
reader.Close();
reader.Dispose();
response.Close();
}
#endregion
通过以上的介绍,也许很多人会觉得这实现起来非常简单,一些相对简单的代码即可实现了,不过你有没有好好想想,怎么实现动态的图片显示在flash里面,并且一点击flash图片调转到相应的网站,这又是怎么实现的,这也许就是实现一体广告机的关键之处,当年我在做这个地方可是花费了很多时间,查阅了很多资料才知道,flash还可以编程,这其中就是通过这个实现的,不知你能否想得到,如果你能想得到那证明你就是高手了,O(∩_∩)O哈哈~不知道的话希望今天看了我的博文能在你以后的工作中的使用到,也许这只是其中一种实现方法,也许你有更好的方法,如有希望你能够提供给我,大家一起学习进步。
首先是通过程序的下载,会将相应的信息写入到XML中,XML文件如下:
<?xml version="1.0" encoding="GB2312"?> <imgList> <list path="D:\java\C#\YTJ\$DLL\Flash\swf\终端7.JPG" info="">http://www.cnblogs.com/luoyuhao/</list> <list path="D:\java\C#\YTJ\$DLL\Flash\swf\终10.JPG" info="">http://www.cnblogs.com/luoyuhao/</list> <list path="D:\java\C#\YTJ\$DLL\Flash\swf\终端9.JPG" info="">http://www.cnblogs.com/luoyuhao/</list> <list path="D:\java\C#\YTJ\$DLL\Flash\swf\终端4.JPG" info="">http://www.cnblogs.com/luoyuhao/</list> <list path="D:\java\C#\YTJ\$DLL\Flash\swf\终端5.JPG" info="">http://www.cnblogs.com/luoyuhao/</list> <list path="D:\java\C#\YTJ\$DLL\Flash\swf\终端6.JPG" info="">http://www.cnblogs.com/luoyuhao/</list> <list path="D:\java\C#\YTJ\$DLL\Flash\swf\g02.JPG" info="">http://www.cnblogs.com/luoyuhao/</list> <list path="D:\java\C#\YTJ\$DLL\Flash\swf\g03.JPG" info="">http://www.cnblogs.com/luoyuhao/</list> <list path="D:\java\C#\YTJ\$DLL\Flash\swf\test.JPG" info="">http://www.cnblogs.com/luoyuhao/</list> </imgList>
为了显得不是打广告,所有的链接都进行了替换,还有就是图片的路径是绝对路径,好像这里不能用相对路径,这好像是flash的原因,使用了绝对路径就显示不出图片了。
由于现在电脑未安装flash编辑工具,所以就不能贴上flash相应的实现代码了,后续等我能打开flash的文件后再将实现代码贴出来,一起和大家交流学习,请大家关注,不好意思了。