﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-小码哥</title><link>http://www.blogjava.net/canvas/</link><description>谁谓河广，一苇杭之</description><language>zh-cn</language><lastBuildDate>Fri, 01 May 2026 10:26:45 GMT</lastBuildDate><pubDate>Fri, 01 May 2026 10:26:45 GMT</pubDate><ttl>60</ttl><item><title>关于openlayers的一些说明</title><link>http://www.blogjava.net/canvas/archive/2012/11/13/about_openlayers.html</link><dc:creator>小码哥</dc:creator><author>小码哥</author><pubDate>Tue, 13 Nov 2012 01:25:00 GMT</pubDate><guid>http://www.blogjava.net/canvas/archive/2012/11/13/about_openlayers.html</guid><wfw:comment>http://www.blogjava.net/canvas/comments/391239.html</wfw:comment><comments>http://www.blogjava.net/canvas/archive/2012/11/13/about_openlayers.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/canvas/comments/commentRss/391239.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/canvas/services/trackbacks/391239.html</trackback:ping><description><![CDATA[以前做的openlayers的项目基本都是很水的，但是毕竟都结了，算是有一丁点的积累。不过做项目的时候也是边学便用，代码写得很糟糕，一直没想着留着。于是毕业了，换城市了，换了几次电脑，这些代码终于都没了（有些网友那里应该还有，我发送过几次给别人）。<br /><br /><div>鉴于有不少openlayers的爱好者跟我讨论openlayers的一些开发问题，我想我还是把以前的思路整理一下，对openlayers做些精简和开发，弄一个直接可以使用的简单库出来。<br /><br /></div><img src ="http://www.blogjava.net/canvas/aggbug/391239.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/canvas/" target="_blank">小码哥</a> 2012-11-13 09:25 <a href="http://www.blogjava.net/canvas/archive/2012/11/13/about_openlayers.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用gdb根据指令地址定位到C代码对应的行</title><link>http://www.blogjava.net/canvas/archive/2012/11/06/how_to_use_gdb_to_find_the_kernel_source_code.html</link><dc:creator>小码哥</dc:creator><author>小码哥</author><pubDate>Tue, 06 Nov 2012 07:18:00 GMT</pubDate><guid>http://www.blogjava.net/canvas/archive/2012/11/06/how_to_use_gdb_to_find_the_kernel_source_code.html</guid><wfw:comment>http://www.blogjava.net/canvas/comments/390882.html</wfw:comment><comments>http://www.blogjava.net/canvas/archive/2012/11/06/how_to_use_gdb_to_find_the_kernel_source_code.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/canvas/comments/commentRss/390882.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/canvas/services/trackbacks/390882.html</trackback:ping><description><![CDATA[最近做一些Kernel方面的工作，从一头雾水开始，多做些记录吧。<br /><br />addr2line也可以根据指令地址定位C代码对应的行，但是对于Kernel module却不是很方便，使用gdb就要容易得多。<br /><br />NOTE：<span style="color: red;">在使用gdb定位C代码之前需要开启-g选项编译内核或者module</span><div><br />例如有这样的Call Trace<br />Call Trace:<br />[&lt;8033265c&gt;] dump_stack+0x8/0x30<br />[&lt;8003abbc&gt;] warn_slowpath_common+0x70/0x98<br />[&lt;80041f10&gt;] local_bh_enable_ip+0x98/0xec<br />[&lt;c13f1c6c&gt;] ieee80211_alloc_node+0x29c/0x47c [umac]<br />[&lt;c13f1f70&gt;] ieee80211_reset_bss+0x58/0x154 [umac]<br />[&lt;c13f7c84&gt;] ieee80211_vap_attach+0x20/0x68 [umac]<br />[&lt;c14096cc&gt;] ath_vap_create+0x430/0x6b0 [umac]<br />[&lt;c13f7290&gt;] wlan_vap_create+0x58/0x210 [umac]<br />[&lt;c14686e8&gt;] osif_ioctl_create_vap+0x268/0x790 [umac]<br />[&lt;c14597b0&gt;] ath_ioctl+0x134/0x94c [umac]<br />[&lt;8022db50&gt;] dev_ioctl+0x28c/0x88<br /><br />现在想定位指令：<br />[&lt;80041f10&gt;] local_bh_enable_ip+0x98/0xec<br /><br />可以这样做：<br />$ mips-linux-gdb vmlinux<br /><br />GNU gdb 6.8<br />Copyright (coffee) 2008 Free Software Foundation, Inc.<br />License GPLv3+: GNU GPL version 3 or later &lt;http://gnu.org/licenses/gpl.html&gt;<br />This is free software: you are free to change and redistribute it.<br />There is NO WARRANTY, to the extent permitted by law.&nbsp; Type "show copying"<br />and "show warranty" for details.<br />This GDB was configured as "--host=i386-pc-linux-gnu --target=mips-linux-uclibc"...<br /><br />输入命令<br />(gdb) list *(local_bh_enable_ip+0x98)<br /><br />gdb返回结果<br />0x80041f10 is in local_bh_enable_ip (kernel/softirq.c:216).<br />211 <br />212 EXPORT_SYMBOL(_local_bh_enable);<br />213 <br />214 static inline void _local_bh_enable_ip(unsigned long ip)<br />215 {<br />216&nbsp; WARN_ON_ONCE(in_irq() || irqs_disabled());<br />217 #ifdef CONFIG_TRACE_IRQFLAGS<br />218&nbsp; local_irq_disable();<br />219 #endif<br />220&nbsp; /*<br />(gdb)</div><img src ="http://www.blogjava.net/canvas/aggbug/390882.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/canvas/" target="_blank">小码哥</a> 2012-11-06 15:18 <a href="http://www.blogjava.net/canvas/archive/2012/11/06/how_to_use_gdb_to_find_the_kernel_source_code.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>几个简单的Makefile</title><link>http://www.blogjava.net/canvas/articles/quick_makefile.html</link><dc:creator>小码哥</dc:creator><author>小码哥</author><pubDate>Tue, 06 Nov 2012 07:05:00 GMT</pubDate><guid>http://www.blogjava.net/canvas/articles/quick_makefile.html</guid><wfw:comment>http://www.blogjava.net/canvas/comments/390880.html</wfw:comment><comments>http://www.blogjava.net/canvas/articles/quick_makefile.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/canvas/comments/commentRss/390880.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/canvas/services/trackbacks/390880.html</trackback:ping><description><![CDATA[几个简单适合小程序的Makefile，可直接拷贝使用，自己mark一下，这样长时间不用Makefile也不用去看手册了<br /><br />0.只有一个文件<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">#&nbsp;变量的定义，方便使用<br />CC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;gcc<br />CCFLAGS&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">O2&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">s<br />BIN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;test<br />OBJ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;root_password_tool_win32.o<br /><br />$(BIN)&nbsp;:&nbsp;$(OBJ)<br />&nbsp;&nbsp;&nbsp;&nbsp;$(CC)&nbsp;$(CCFLAGS)&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">o&nbsp;test&nbsp;$(OBJ)<br /><br />$(OBJ)&nbsp;:&nbsp;root_password_tool_win32.c<br />&nbsp;&nbsp;&nbsp;&nbsp;$(CC)&nbsp;$(CCFLAGS)&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">c&nbsp;root_password_tool_win32.c<br /><br />.PHONY&nbsp;:&nbsp;clean<br />clean&nbsp;:<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">rm&nbsp;$(BIN)&nbsp;$(OBJ)<br /><br /></span></div><br /><br />1.简单编译命令行程序，$(CC)前面是tab，不是space<br /><br />一共五个文件：<br />test.c<br />md5.c md5.h<br />password.c password.h<br /><br />main函数在test.c中，test.c文件include了md5.h和password.h<br /><br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">CC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;gcc<br />CCFLAGS&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">O2&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">s<br />BIN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; "> password<br />OBJ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;md5.o&nbsp;password.o&nbsp;test.o<br /><br />$(BIN) :&nbsp;$(OBJ)<br />&nbsp;&nbsp;&nbsp;&nbsp;$(CC)&nbsp;$(CCFLAGS)&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">o&nbsp;password&nbsp;$(OBJ)<br /><br />md5.o&nbsp;:&nbsp;md5.c&nbsp;md5.h<br />&nbsp;&nbsp;&nbsp;&nbsp;$(CC)&nbsp;$(CCFLAGS)&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">c&nbsp;md5.c<br /><br />password.o&nbsp;:&nbsp;password.c&nbsp;password.h<br />&nbsp;&nbsp;&nbsp;&nbsp;$(CC)&nbsp;$(CCFLAGS)&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000;">c&nbsp;password.c<br /><br />test.o&nbsp;:&nbsp;test.c<br />&nbsp;&nbsp;&nbsp;&nbsp;$(CC)&nbsp;$(CCFLAGS)&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">c&nbsp;test.c<br /><br />.PHONY&nbsp;:&nbsp;clean<br />clean&nbsp;:<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">rm $(BIN) $(OBJ)<br /></span></div><br />make&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 编译得到password.exe，这里在windows下cigwin+mingw环境中编译<br />make clean&nbsp;&nbsp;&nbsp; # 清理编译生成的*.o等文件<br /><br />2.使用g++编译win32程序的Makefile，其中简写了一些，可以对比1看看不同之处<br />说明：<br />&nbsp;&nbsp;&nbsp; (0)指定静态库目录，连接静态库<span style="color: #000000; "></span>libcomctl32.a编译程序<br />&nbsp;&nbsp;&nbsp; (1)编译windows资源文件(使用mingw的windres)<br />&nbsp;&nbsp;&nbsp; (2)使用-mwindows编译选项去除弹出的cmd窗口<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">CC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;g</span><span style="color: #000000; ">++</span><span style="color: #000000; "><br /><br />#&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">O2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;optimization&nbsp;option<br />#&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;build&nbsp;small&nbsp;binary<br />#&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">mwindows&nbsp;:&nbsp;use&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">&nbsp;option&nbsp;to&nbsp;remove&nbsp;the&nbsp;popping&nbsp;cmd&nbsp;window<br />CCFLAGS&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">O2&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">s&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">mwindows<br />BIN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;test<br />WINDRES&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;windres<br />RES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;resource.o<br />OBJ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;main.o&nbsp;md5.o&nbsp;password.o&nbsp;$(RES)<br /><br />#&nbsp;where&nbsp;is&nbsp;your&nbsp;mingw&nbsp;library</span><span style="color: #000000; ">?</span><span style="color: #000000; "><br />LIBPATH&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">C:\Program&nbsp;Files\CodeBlocks\MinGW\lib\</span><span style="color: #000000; ">'</span><span style="color: #000000; "><br /><br />LIBS</span><span style="color: #000000; ">=-</span><span style="color: #000000; ">L$(LIBPATH)&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">lcomctl32<br /><br />RM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">rm&nbsp;<br /><br />$(BIN):&nbsp;$(OBJ)<br />&nbsp;&nbsp;&nbsp;&nbsp;$(CC)&nbsp;$(CCFLAGS)&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">o&nbsp;$(BIN)&nbsp;$(OBJ)&nbsp;$(LIBS)<br /><br />main.o:&nbsp;main.cpp<br /><br />md5.o:&nbsp;md5.cpp&nbsp;md5.h<br /><br />password.o:&nbsp;password.cpp&nbsp;password.h<br /><br />#&nbsp;编译资源文件<br />$(RES):&nbsp;resource.rc&nbsp;rpt.ico&nbsp;manifest<br />&nbsp;&nbsp;&nbsp;&nbsp;$(WINDRES)&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">o&nbsp;$(RES)&nbsp;resource.rc<br /><br />.PHONY:clean<br />clean:<br />&nbsp;&nbsp;&nbsp;&nbsp;$(RM)&nbsp;$(BIN)&nbsp;$(OBJ)<br /></span></div><br /><br />3.编译静态库<br />其中一些$&lt;，$^, $@是Makefile的自动化变量，详细了解可以看《跟我一起写Makefile》的第五章<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">CC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;g</span><span style="color: #000000; ">++</span><span style="color: #000000; "><br /><div>OBJS &nbsp; &nbsp; &nbsp; &nbsp; = utp.o utp_utils.o</div><br />#&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">g&nbsp;:&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;debug<br />CFLAGS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">g&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">O2&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">Wall&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">DPOSIX<br />TARGET&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;libutp.a<br /><br />.cpp.o:<br />&nbsp;&nbsp;&nbsp;&nbsp;$(CC)&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">c&nbsp;$(CFLAGS)&nbsp;$</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;<br />all:&nbsp;$(TARGET)<br /><br />libutp.a: $(OBJS)<br />&nbsp;&nbsp;&nbsp;&nbsp;ar&nbsp;cru&nbsp;$@&nbsp;$</span><span style="color: #000000; ">^</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;ranlib&nbsp;$@<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />.PHONY&nbsp;:&nbsp;clean<br />clean&nbsp;:<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">rm&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000;">.o&nbsp;$(TARGET)</span></div><br /><div>4.编译动态库<br />(0)windows下使用mingw编译dll动态库<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; "></span><div>CC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = g++<br />OBJS&nbsp;&nbsp;&nbsp; = utp.o utp_utils.o<br />CCFLAGS = -fno-exceptions -fno-rtti -Wall -g -lwsock<br />TARGET&nbsp; = libutp.dll<br /><br />all: $(TARGET)<br /><br />$(TARGET): $(OBJS)<br />&nbsp;&nbsp; &nbsp;-rm -f $(TARGET)<br />&nbsp;&nbsp; &nbsp;$(CC) -shared -o $(TARGET) $(OBJS) -lws2_32<br /><br />.cpp.o:<br />&nbsp;&nbsp; &nbsp;$(CC) -c -DPOSIX -fpic -I . -I utp_config_lib $(CCFLAGS) $&lt;<br /><br />.PHONY: clean<br />clean:<br />&nbsp;&nbsp; &nbsp;-rm -f $(OBJS) $(TARGET)</div><span style="color: #000000; "></span></div><br />(1)linux下编译so动态库<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">CC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;g</span><span style="color: #000000; ">++</span><span style="color: #000000; "><br />OBJS&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;utp.o&nbsp;utp_utils.o<br />CCFLAGS&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">fno</span><span style="color: #000000; ">-</span><span style="color: #000000; ">exceptions&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">fno</span><span style="color: #000000; ">-</span><span style="color: #000000; ">rtti&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">Wall&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">g<br />TARGET&nbsp;&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;libutp.so<br /><br />all:&nbsp;$(TARGET)<br /><br />$(TARGET):&nbsp;$(OBJS)<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">rm&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">f&nbsp;$(TARGET)<br />&nbsp;&nbsp;&nbsp;&nbsp;g</span><span style="color: #000000; ">++</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">shared&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">o&nbsp;$(TARGET)&nbsp;$(OBJS)<br /><br />.cpp.o:<br />&nbsp;&nbsp;&nbsp;&nbsp;g</span><span style="color: #000000; ">++</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">c&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">DPOSIX&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">fpic&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">I&nbsp;.&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">I&nbsp;utp_config_lib&nbsp;$(CCFLAGS)&nbsp;$</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; "><br /><br />.PHONY:&nbsp;clean<br />clean:<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">rm&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">f&nbsp;$(OBJS)&nbsp;CCFLAGS<br /></span></div><br /><br />5.编译多个目标，0-2均是编译单个目标<br />(0) 添加头文件目录<br />(1) 使用自己编译的静态库libutp.a<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><span style="color: #000000; ">CC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;g</span><span style="color: #000000; ">++</span><span style="color: #000000; ">&nbsp;<br />CFLAGS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">=</span>&nbsp;<span style="color: #000000; ">-</span><span style="color: #000000; ">g<br />LIBUTP_PATH&nbsp;</span><span style="color: #000000; ">=</span>&nbsp;<span style="color: #000000; ">/</span><span style="color: #000000; ">home</span><span style="color: #000000; ">/</span><span style="color: #000000; ">actiontec</span><span style="color: #000000; ">/</span><span style="color: #000000; ">workspace</span><span style="color: #000000; ">/</span><span style="color: #000000; ">code_reading</span><span style="color: #000000; ">/</span><span style="color: #000000; ">third_party</span><span style="color: #000000; ">/</span><span style="color: #000000; ">libutp</span><span style="color: #000000; ">/</span><span style="color: #000000; ">lib<br />INCLUDES&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">=</span>&nbsp;<span style="color: #000000; ">-</span><span style="color: #000000; ">I${LIBUTP_PATH}<br />LIBS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">=</span>&nbsp;<span style="color: #000000; ">-</span><span style="color: #000000; ">L$(LIBUTP_PATH)&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">lutp&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">lpthread&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">lrt<br />TARGET&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;all<br /><br />all:&nbsp;server&nbsp;client<br /><br />server:&nbsp;server.cpp<br />&nbsp;&nbsp;&nbsp;&nbsp;$(CC)&nbsp;$(CFLAGS)&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">o&nbsp;$@&nbsp;$</span><span style="color: #000000; ">^</span><span style="color: #000000; ">&nbsp;$(INCLUDES)&nbsp;$(LIBS)<br /><br />client:&nbsp;client.cpp<br />&nbsp;&nbsp;&nbsp;&nbsp;$(CC)&nbsp;$(CFLAGS)&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">o&nbsp;$@&nbsp;$</span><span style="color: #000000; ">^</span><span style="color: #000000; ">&nbsp;$(INCLUDES)&nbsp;$(LIBS)<br /><br />.PHONY&nbsp;:&nbsp;clean<br />clean:<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">rm&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">.o&nbsp;server&nbsp;client<br /></span></div></div>以上仅供参考<img src ="http://www.blogjava.net/canvas/aggbug/390880.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/canvas/" target="_blank">小码哥</a> 2012-11-06 15:05 <a href="http://www.blogjava.net/canvas/articles/quick_makefile.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java程序如何限速(控制下载和上传速度)</title><link>http://www.blogjava.net/canvas/articles/bandwidthlimiter.html</link><dc:creator>小码哥</dc:creator><author>小码哥</author><pubDate>Thu, 18 Oct 2012 08:34:00 GMT</pubDate><guid>http://www.blogjava.net/canvas/articles/bandwidthlimiter.html</guid><wfw:comment>http://www.blogjava.net/canvas/comments/389824.html</wfw:comment><comments>http://www.blogjava.net/canvas/articles/bandwidthlimiter.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/canvas/comments/commentRss/389824.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/canvas/services/trackbacks/389824.html</trackback:ping><description><![CDATA[<div>好久没有在这里写点东西了，要养成书写记录的习惯。<br /><br />这里简单的讨论一下java设计网络程序中如何控制上传和下载速度，我们常见的FTP，HTTP，BT等协议都是TCP的，但是现在流行的utorrent却基于UDP实现了自己UTP协议(UDP+拥塞控制)，不管使用什么协议，站在I/O的角度来说，限速的控制思路都是一样的。<br />
<br />
思路很简单，如下：<br />
<br />
1.假设下载或者上传速度上限是m (KB/s),那么发送一个固定的字节数据(假设是n字节)的时间花费是：n/m；<br />
2.假设现在要发送n字节的数据，那么理论所需的时间应该是n/m，而在实际情况下，发送n字节的数据只花费了t秒，那么发送该发送线程就应该睡眠n/m-t秒，这样就基本实现了速度的控制。<br />
<br />
代码以TCP为例<br />
速度控制<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">package</span><span style="color: #000000; ">&nbsp;com.actiontec.net.bandwidth;<br />
</span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; "><br />
</span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; "></span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;<br />
</span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;</span><span style="color: #808080; ">@author</span><span style="color: #008000; ">&nbsp;Le<br />
</span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;<br />
</span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #008000; ">&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />
</span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;BandwidthLimiter&nbsp;{<br />
</span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; "><br />
</span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;KB&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />
</span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;Long&nbsp;KB&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1024l</span><span style="color: #000000; ">;<br />
</span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; "><br />
</span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;The&nbsp;smallest&nbsp;count&nbsp;chunk&nbsp;length&nbsp;in&nbsp;bytes&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />
</span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;Long&nbsp;CHUNK_LENGTH&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1024l</span><span style="color: #000000; ">;<br />
</span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; "><br />
</span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;How&nbsp;many&nbsp;bytes&nbsp;will&nbsp;be&nbsp;sent&nbsp;or&nbsp;receive&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />
</span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;bytesWillBeSentOrReceive&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />
</span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; "><br />
</span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;When&nbsp;the&nbsp;last&nbsp;piece&nbsp;was&nbsp;sent&nbsp;or&nbsp;receive&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />
</span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;lastPieceSentOrReceiveTick&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;System.nanoTime();<br />
</span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #000000; "><br />
</span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;Default&nbsp;rate&nbsp;is&nbsp;1024KB/s&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />
</span><span style="color: #008080; ">23</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;maxRate&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1024</span><span style="color: #000000; ">;<br />
</span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #000000; "><br />
</span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;Time&nbsp;cost&nbsp;for&nbsp;sending&nbsp;CHUNK_LENGTH&nbsp;bytes&nbsp;in&nbsp;nanoseconds&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />
</span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;timeCostPerChunk&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">1000000000l</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;CHUNK_LENGTH)<br />
</span><span style="color: #008080; ">27</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.maxRate&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;KB);<br />
</span><span style="color: #008080; ">28</span>&nbsp;<span style="color: #000000; "><br />
</span><span style="color: #008080; ">29</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">30</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Initialize&nbsp;a&nbsp;BandwidthLimiter&nbsp;object&nbsp;with&nbsp;a&nbsp;certain&nbsp;rate.<br />
</span><span style="color: #008080; ">31</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
</span><span style="color: #008080; ">32</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;maxRate<br />
</span><span style="color: #008080; ">33</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;download&nbsp;or&nbsp;upload&nbsp;speed&nbsp;in&nbsp;KBytes<br />
</span><span style="color: #008080; ">34</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />
</span><span style="color: #008080; ">35</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;BandwidthLimiter(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;maxRate)&nbsp;{<br />
</span><span style="color: #008080; ">36</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.setMaxRate(maxRate);<br />
</span><span style="color: #008080; ">37</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080; ">38</span>&nbsp;<span style="color: #000000; "><br />
</span><span style="color: #008080; ">39</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">40</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Set&nbsp;the&nbsp;max&nbsp;upload&nbsp;or&nbsp;download&nbsp;rate&nbsp;in&nbsp;KB/s.&nbsp;maxRate&nbsp;must&nbsp;be&nbsp;grater&nbsp;than<br />
</span><span style="color: #008080; ">41</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;0.&nbsp;If&nbsp;maxRate&nbsp;is&nbsp;zero,&nbsp;it&nbsp;means&nbsp;there&nbsp;is&nbsp;no&nbsp;bandwidth&nbsp;limit.<br />
</span><span style="color: #008080; ">42</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
</span><span style="color: #008080; ">43</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;maxRate<br />
</span><span style="color: #008080; ">44</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;maxRate&nbsp;is&nbsp;zero,&nbsp;it&nbsp;means&nbsp;there&nbsp;is&nbsp;no&nbsp;bandwidth&nbsp;limit.<br />
</span><span style="color: #008080; ">45</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@throws</span><span style="color: #008000; ">&nbsp;IllegalArgumentException<br />
</span><span style="color: #008080; ">46</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />
</span><span style="color: #008080; ">47</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">synchronized</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;setMaxRate(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;maxRate)<br />
</span><span style="color: #008080; ">48</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">throws</span><span style="color: #000000; ">&nbsp;IllegalArgumentException&nbsp;{<br />
</span><span style="color: #008080; ">49</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(maxRate&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)&nbsp;{<br />
</span><span style="color: #008080; ">50</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">throw</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;IllegalArgumentException(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">maxRate&nbsp;can&nbsp;not&nbsp;less&nbsp;than&nbsp;0</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />
</span><span style="color: #008080; ">51</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080; ">52</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.maxRate&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;maxRate&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">?</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">&nbsp;:&nbsp;maxRate;<br />
</span><span style="color: #008080; ">53</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(maxRate&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)<br />
</span><span style="color: #008080; ">54</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.timeCostPerChunk&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />
</span><span style="color: #008080; ">55</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br />
</span><span style="color: #008080; ">56</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.timeCostPerChunk&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">1000000000l</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;CHUNK_LENGTH)<br />
</span><span style="color: #008080; ">57</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.maxRate&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;KB);<br />
</span><span style="color: #008080; ">58</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080; ">59</span>&nbsp;<span style="color: #000000; "><br />
</span><span style="color: #008080; ">60</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">61</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Next&nbsp;1&nbsp;byte&nbsp;should&nbsp;do&nbsp;bandwidth&nbsp;limit.<br />
</span><span style="color: #008080; ">62</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />
</span><span style="color: #008080; ">63</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">synchronized</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;limitNextBytes()&nbsp;{<br />
</span><span style="color: #008080; ">64</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.limitNextBytes(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);<br />
</span><span style="color: #008080; ">65</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080; ">66</span>&nbsp;<span style="color: #000000; "><br />
</span><span style="color: #008080; ">67</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">68</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Next&nbsp;len&nbsp;bytes&nbsp;should&nbsp;do&nbsp;bandwidth&nbsp;limit<br />
</span><span style="color: #008080; ">69</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
</span><span style="color: #008080; ">70</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;len<br />
</span><span style="color: #008080; ">71</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />
</span><span style="color: #008080; ">72</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">synchronized</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;limitNextBytes(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;len)&nbsp;{<br />
</span><span style="color: #008080; ">73</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.bytesWillBeSentOrReceive&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">&nbsp;len;<br />
</span><span style="color: #008080; ">74</span>&nbsp;<span style="color: #000000; "><br />
</span><span style="color: #008080; ">75</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;We&nbsp;have&nbsp;sent&nbsp;CHUNK_LENGTH&nbsp;bytes&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />
</span><span style="color: #008080; ">76</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.bytesWillBeSentOrReceive&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;CHUNK_LENGTH)&nbsp;{<br />
</span><span style="color: #008080; ">77</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;nowTick&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;System.nanoTime();<br />
</span><span style="color: #008080; ">78</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;missedTime&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.timeCostPerChunk<br />
</span><span style="color: #008080; ">79</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;(nowTick&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.lastPieceSentOrReceiveTick);<br />
</span><span style="color: #008080; ">80</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(missedTime&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)&nbsp;{<br />
</span><span style="color: #008080; ">81</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">&nbsp;{<br />
</span><span style="color: #008080; ">82</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(missedTime&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1000000</span><span style="color: #000000; ">,<br />
</span><span style="color: #008080; ">83</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">)&nbsp;(missedTime&nbsp;</span><span style="color: #000000; ">%</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1000000</span><span style="color: #000000; ">));<br />
</span><span style="color: #008080; ">84</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(InterruptedException&nbsp;e)&nbsp;{<br />
</span><span style="color: #008080; ">85</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
</span><span style="color: #008080; ">86</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080; ">87</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080; ">88</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.bytesWillBeSentOrReceive&nbsp;</span><span style="color: #000000; ">-=</span><span style="color: #000000; ">&nbsp;CHUNK_LENGTH;<br />
</span><span style="color: #008080; ">89</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.lastPieceSentOrReceiveTick&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;nowTick<br />
</span><span style="color: #008080; ">90</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;(missedTime&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">?</span><span style="color: #000000; ">&nbsp;missedTime&nbsp;:&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br />
</span><span style="color: #008080; ">91</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080; ">92</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080; ">93</span>&nbsp;<span style="color: #000000; ">}<br />
</span><span style="color: #008080; ">94</span>&nbsp;<span style="color: #000000; "></span></div>
</div>
<div><br />下载控制<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">package</span><span style="color: #000000; ">&nbsp;com.actiontec.net.bandwidth;<br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.io.IOException;<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.io.InputStream;<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; "></span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;</span><span style="color: #808080; ">@author</span><span style="color: #008000; ">&nbsp;Le<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #008000; ">&nbsp;*<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #008000; ">&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;DownloadLimiter&nbsp;</span><span style="color: #0000FF; ">extends</span><span style="color: #000000; ">&nbsp;InputStream&nbsp;{<br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;InputStream&nbsp;is&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;BandwidthLimiter&nbsp;bandwidthLimiter&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;DownloadLimiter(InputStream&nbsp;is,&nbsp;BandwidthLimiter&nbsp;bandwidthLimiter)<br /></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.is&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;is;<br /></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.bandwidthLimiter&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;bandwidthLimiter;<br /></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;@Override<br /></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;read()&nbsp;</span><span style="color: #0000FF; ">throws</span><span style="color: #000000; ">&nbsp;IOException&nbsp;{<br /></span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.bandwidthLimiter&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">)<br /></span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.bandwidthLimiter.limitNextBytes();<br /></span><span style="color: #008080; ">23</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.is.read();<br /></span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;read(</span><span style="color: #0000FF; ">byte</span><span style="color: #000000; ">&nbsp;b[],&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;off,&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;len)&nbsp;</span><span style="color: #0000FF; ">throws</span><span style="color: #000000; ">&nbsp;IOException<br /></span><span style="color: #008080; ">27</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">28</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(bandwidthLimiter&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">)<br /></span><span style="color: #008080; ">29</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bandwidthLimiter.limitNextBytes(len);<br /></span><span style="color: #008080; ">30</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.is.read(b,&nbsp;off,&nbsp;len);<br /></span><span style="color: #008080; ">31</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">32</span>&nbsp;<span style="color: #000000; ">}</span></div><br /><div>同样，上传控制</div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">package</span><span style="color: #000000; ">&nbsp;com.actiontec.net.bandwidth;<br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.io.IOException;<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.io.OutputStream;<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; "></span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;</span><span style="color: #808080; ">@author</span><span style="color: #008000; ">&nbsp;Le<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #008000; ">&nbsp;*<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #008000; ">&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;UploadLimiter&nbsp;</span><span style="color: #0000FF; ">extends</span><span style="color: #000000; ">&nbsp;OutputStream&nbsp;{<br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;OutputStream&nbsp;os&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;BandwidthLimiter&nbsp;bandwidthLimiter&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;UploadLimiter(OutputStream&nbsp;os,&nbsp;BandwidthLimiter&nbsp;bandwidthLimiter)<br /></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.os&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;os;<br /></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.bandwidthLimiter&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;bandwidthLimiter;<br /></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;@Override<br /></span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;write(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;b)&nbsp;</span><span style="color: #0000FF; ">throws</span><span style="color: #000000; ">&nbsp;IOException&nbsp;{<br /></span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(bandwidthLimiter&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">)<br /></span><span style="color: #008080; ">23</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bandwidthLimiter.limitNextBytes();<br /></span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.os.write(b);<br /></span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080; ">27</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;write(</span><span style="color: #0000FF; ">byte</span><span style="color: #000000; ">[]&nbsp;b,&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;off,&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;len)&nbsp;</span><span style="color: #0000FF; ">throws</span><span style="color: #000000; ">&nbsp;IOException&nbsp;{<br /></span><span style="color: #008080; ">28</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(bandwidthLimiter&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">)<br /></span><span style="color: #008080; ">29</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bandwidthLimiter.limitNextBytes(len);<br /></span><span style="color: #008080; ">30</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.os.write(b,&nbsp;off,&nbsp;len);<br /></span><span style="color: #008080; ">31</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">32</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">33</span>&nbsp;<span style="color: #000000; ">}</span></div><br /><div>对于一个TCP socket</div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">1</span>&nbsp;<span style="color: #000000; ">ServerSocket&nbsp;socket&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;ServerSocket();<br /></span><span style="color: #008080; ">2</span>&nbsp;<span style="color: #000000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">其它初始化略</span></div><br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">从socket中以一定的速率读数据<br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">```java</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">DownloadLimiter&nbsp;dl&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;DownloadLimiter(socket.getInputStream(),&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;BandwidthLimiter(</span><span style="color: #000000; ">6250</span><span style="color: #000000; ">));<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; ">is&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;DataInputStream(dl);<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">读数据</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #008000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;len&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;is.readInt();<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; ">ByteBuffer&nbsp;buffer&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;ByteBuffer.allocate(</span><span style="color: #000000; ">4</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;len);<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; ">buffer.putInt(len);<br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; ">is.readFully(buffer.array(),&nbsp;</span><span style="color: #000000; ">4</span><span style="color: #000000; ">,&nbsp;buffer.remaining());<br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">```<br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #008000; "><br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">以一定的速率写数据到socket<br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">```java</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">UploadLimiter&nbsp;ul&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;UploadLimiter(socket.getOutputStream(),&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;BandwidthLimiter(</span><span style="color: #000000; ">6250</span><span style="color: #000000; ">));<br /></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; ">ul.write(<img src="http://www.blogjava.net/Images/dot.gif" alt="" />);<br /></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">```</span></div><br /><div>在多线程环境下也可以使用上述的方法。最后附图是任务管理器的网络利用率图6250KB/s（也就是50000kb/s,附图中网络利用率也在5%左右，所以应该这个做法还算准确）<br /><img alt="" src="http://www.blogjava.net/images/blogjava_net/canvas/1.PNG" height="442" width="661" /></div></div><img src ="http://www.blogjava.net/canvas/aggbug/389824.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/canvas/" target="_blank">小码哥</a> 2012-10-18 16:34 <a href="http://www.blogjava.net/canvas/articles/bandwidthlimiter.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>把ubuntu配置成路由器+DHCP</title><link>http://www.blogjava.net/canvas/articles/router-dhcp.html</link><dc:creator>小码哥</dc:creator><author>小码哥</author><pubDate>Wed, 22 Aug 2012 14:30:00 GMT</pubDate><guid>http://www.blogjava.net/canvas/articles/router-dhcp.html</guid><wfw:comment>http://www.blogjava.net/canvas/comments/386071.html</wfw:comment><comments>http://www.blogjava.net/canvas/articles/router-dhcp.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/canvas/comments/commentRss/386071.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/canvas/services/trackbacks/386071.html</trackback:ping><description><![CDATA[<p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">资源：<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp; PC A: Ubuntu 12.04 LTS，两块网卡，分别为eth0和eth1，使用eth0连接<wbr>互联网<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp; PC B: Windows 7,&nbsp;一块网卡，为eth0<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; "><u></u>&nbsp;<u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">目标：<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;使得B通过A连接互联网(IPv4)，即实现A为路由器的功能<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; "><u></u>&nbsp;<u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">步骤：<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; "><u></u>&nbsp;<u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">PC A:<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp; (0)假设eth0已经配置好，PC可以通过eth0连接互联网<wbr>，配置eth1为，如/etc/network/<wbr>interface所示<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; "><u></u>&nbsp;<u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; auto lo<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iface lo inet loopback<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; auto eth0<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iface eth0 inet static<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; address 172.16.10.65<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gateway 172.16.10.254<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; netmask 255.255.0.0<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; auto eth1<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iface eth1 inet static<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; address 192.168.6.1<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; netmask 255.255.255.0<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; network 192.168.6.0<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; broadcast 192.168.6.255<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当然，我是删除了network-manager,<wbr>network-manager-gnome的才可以通过配置i<wbr>nterface这个文件来设置网络的<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;你也可以通过network-manager来配置。DNS服务<wbr>器可以通过/etc/resolv.conf来配置：<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nameserver 168.95.1.1 #这是我的DNS服务器，你可以配置成你可以访问的，如8.8.<wbr>8.8<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; "><u></u>&nbsp;<u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;重启你的网络服务或者重启PC A，以上设置就可以生效。<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp; (1)Linux系统自身就有IPv4包转发的功能，在/<wbr>etc/sysctl.conf进行配置，<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;打开IPv4转发功能:<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; net.ipv4.ip_forward=1<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; "><u></u>&nbsp;<u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;输入以下命令使得上面的设置生效(或者重启电脑)：<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; "><u></u>&nbsp;<u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sudo sysctl -p<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; "><u></u>&nbsp;<u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp; (2)通过iptable实现IPv4包转发<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; "><u></u>&nbsp;<u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sudo iptables -t nat -A POSTROUTING -s&nbsp;<a href="http://192.168.6.0/24" target="_blank" style="color: #1155cc; ">192.168.6.0/24</a>&nbsp;-o eth0 -j MASQUERADE<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; "><u></u>&nbsp;<u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;可以通过iptables-save将iptables rule都保存到文件中，在通过iptables-<wbr>restore读取rule到iptables中，<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;可以自己写一个脚本来实现iptables自动的载入rule，<wbr>或者找到iptables的配置文件来修改<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; "><u></u>&nbsp;<u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">PC B<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp; (0)将PC B的eth0与PC A的eth1用网线直接连接，配置PC B的eth0为：<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IP ADDRESS : 192.168.6.101<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SUBNET MASK: 255.255.255.0<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GATE WAY&nbsp;&nbsp; : 192.168.1.1i<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DNS Server : 168.95.1.1<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; "><u></u>&nbsp;<u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;这样PC B就可以通过PC A连接互联网了<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; "><u></u>&nbsp;<u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; "><u></u>&nbsp;<u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">增强配置：<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;路由器都可以自动给PC分配IP，而不需要手动配置IP，<wbr>这是通过DHCP来实现的。如果也要实现相同的功能，那<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;就需要在PC A上搭建一个DHCP服务器。<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; "><u></u>&nbsp;<u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp; (0)安装DHCP服务器<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sudo apt-get install isc-dhcp-common isc-dhcp-server<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp; (1)配置DHCP<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (i)修改/etc/default/isc-dhcp-<wbr>server<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; "><u></u>&nbsp;<u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INTERFACES="eth1"<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; "><u></u>&nbsp;<u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;(ii)修改/etc/dhcp/dhcpd.conf<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; "><u></u>&nbsp;<u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; subnet 192.168.6.0 netmask 255.255.255.0 {<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; range 192.168.6.100 192.168.6.200;<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; option routers 192.168.6.1;<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; option broadcast-address 192.168.6.255;<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;option domain-name-servers 168.95.1.1;<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; default-lease-time 600;<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; max-lease-time 7200;<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<u></u><u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; "><u></u>&nbsp;<u></u></p><p style="margin: 0px; color: #222222; font-family: arial, sans-serif; line-height: normal; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp; (2)PC B可以自动获取IP了，如果在PC A的eth1上接一个switch，接在switch上所有的P<wbr>C都可以获取IP了</p><img src ="http://www.blogjava.net/canvas/aggbug/386071.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/canvas/" target="_blank">小码哥</a> 2012-08-22 22:30 <a href="http://www.blogjava.net/canvas/articles/router-dhcp.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转载】JVM内存管理</title><link>http://www.blogjava.net/canvas/archive/2011/09/08/358321.html</link><dc:creator>小码哥</dc:creator><author>小码哥</author><pubDate>Thu, 08 Sep 2011 11:49:00 GMT</pubDate><guid>http://www.blogjava.net/canvas/archive/2011/09/08/358321.html</guid><wfw:comment>http://www.blogjava.net/canvas/comments/358321.html</wfw:comment><comments>http://www.blogjava.net/canvas/archive/2011/09/08/358321.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/canvas/comments/commentRss/358321.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/canvas/services/trackbacks/358321.html</trackback:ping><description><![CDATA[<div><a href="http://www.iteye.com/topic/802573">1、http://www.iteye.com/topic/802573</a><br /><a href="http://www.iteye.com/topic/802638">2、http://www.iteye.com/topic/802638</a></div><img src ="http://www.blogjava.net/canvas/aggbug/358321.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/canvas/" target="_blank">小码哥</a> 2011-09-08 19:49 <a href="http://www.blogjava.net/canvas/archive/2011/09/08/358321.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>改造openlayers构建轻量级专用地图信息系统（1）</title><link>http://www.blogjava.net/canvas/articles/openlayers-custom.html</link><dc:creator>小码哥</dc:creator><author>小码哥</author><pubDate>Mon, 15 Aug 2011 05:55:00 GMT</pubDate><guid>http://www.blogjava.net/canvas/articles/openlayers-custom.html</guid><wfw:comment>http://www.blogjava.net/canvas/comments/356500.html</wfw:comment><comments>http://www.blogjava.net/canvas/articles/openlayers-custom.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/canvas/comments/commentRss/356500.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/canvas/services/trackbacks/356500.html</trackback:ping><description><![CDATA[本文为一个openlayers项目的总结，其中可能有一些遗漏或描述得不准确的地方，望批评指正。<br />
本文目标：<br />
构建一个完全自定义的轻量级地图信息系统，以openlayers为基础，需要自定义地图的元素样式，包括图层切换的样式、地图导航的样式、地图标记的实现、自定义弹出框等等。该专用地图信息系统地图来源于google地图，包括普通地图图层、卫星影像图层、路面信息图层，另外自行画了一些局部区域的三维地图，本项目为企业内部项目，与互联网隔离，故不可使用google的地图api，则需要抓取google的相关地图资源（暂时使用google地图资源），利用openlayers构建轻量级专用地图信息系统，这里的轻量级是指使用tilecache接口实现地图图层（相关资料见前篇博文）<br />
实现的效果图如下：<br /><br />
<div align="center"><img src="http://www.blogjava.net/images/blogjava_net/canvas/捕获.PNG" alt="" border="0" height="669" width="1023" /><br />图1 后台管理页面<br /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/canvas/捕获2.PNG" alt="" border="0" height="668" width="1022" /><br />图2 前台展示页面（全屏显示）</div><br />
<br />
<span style="font-family: Comic Sans MS;">地图相关说明：</span><br />
<div>
<p style="margin-left:21.0000pt; text-indent:-21.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:14.0000pt; font-family:'Wingdings'; "></span><span style="font-size: 10pt; font-family: Comic Sans MS;">地图页面事件说明</span></p>
<p style="margin-left:21.0000pt; text-indent:-21.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Wingdings'; "></span><span style="font-size: 10pt; font-family: Comic Sans MS;">地图基本功能</span></p>
<p style="margin-left:21.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 10pt; font-family: Comic Sans MS;">(1)&nbsp;</span><span style="font-size: 10pt; font-family: Comic Sans MS;">左上角的地图浏览控件：包括地图的上下左右移动，地图的缩放</span></p>
<p style="margin-left:21.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 10pt; font-family: Comic Sans MS;">(2)&nbsp;</span><span style="font-size: 10pt; font-family: Comic Sans MS;">右上角三个选项，包括地图、航拍、三维，点击每个选项，出现相应的地图视图，其中地图、航拍使用google地图数据（下载google地图）</span></p>

<p style="margin-left:21.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 10pt; font-family: Comic Sans MS;">(3)&nbsp;</span><span style="font-size: 10pt; font-family: Comic Sans MS;">能够标注地图的行政区域</span></p>
<p style="margin-left:21.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 10pt; font-family: Comic Sans MS;">(4)&nbsp;</span><span style="font-size: 10pt; font-family: Comic Sans MS;">鼠标在地图上双击鼠标左键，放大地图一个级别，鼠标滚轮向前向后转动分别是放大缩小地图一个级别，鼠标右键点击，无响应事件</span></p>
<p style="margin-left:21.0000pt; text-indent:-21.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Wingdings'; "></span><span style="font-size: 10pt; font-family: Comic Sans MS;">展示平台功能</span></p>
<p style="margin-left:21.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 10pt; font-family: Comic Sans MS;">(1)</span><span style="font-size: 10pt; font-family: Comic Sans MS;">主界面视图</span></p>
<p style="margin-left:63.0000pt; text-indent:-21.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 10pt; font-family: Comic Sans MS;">a)&nbsp;</span><span style="font-size: 10pt; font-family: Comic Sans MS;">有若干个个图层，地图下面有各个图层的选项卡，点击每个选项，显示相应的内容</span></p>
<p style="margin-left:21.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 10pt; font-family: Comic Sans MS;">(2)</span><span style="font-size: 10pt; font-family: Comic Sans MS;">局部区域视图</span></p>
<p style="margin-left:63.0000pt; text-indent:-21.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 10pt; font-family: Comic Sans MS;">a)&nbsp;</span><span style="font-size: 10pt; font-family: Comic Sans MS;">选中标记（点），跳转到局部区域视图</span></p>
<p style="margin-left:63.0000pt; text-indent:-21.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 10pt; font-family: Comic Sans MS;">b)&nbsp;</span><span style="font-size: 10pt; font-family: Comic Sans MS;">点击标记（点），根据项目的相应设置，显示地图下方的选项卡，点击选项卡，显示响应的内容</span></p>
<p style="margin-left:63.0000pt; text-indent:-21.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 10pt; font-family: Comic Sans MS;">c)&nbsp;</span><span style="font-size: 10pt; font-family: Comic Sans MS;">鼠标放在标记（点）上时。出现提示框，鼠标移到提示框上面，可以点击相应的链接，点击链接之后，弹出一个对话框，并且锁住地图界面</span></p>
<p style="margin-left:21.0000pt; text-indent:-21.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:14.0000pt; font-family:'Wingdings'; "></span><span style="font-size: 10pt; font-family: Comic Sans MS;">地图数据说明</span></p>
<p style="margin-left:21.0000pt; text-indent:-21.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Wingdings'; "></span><span style="font-size: 10pt; font-family: Comic Sans MS;">地图基本数据</span></p>
<p style="margin-left:21.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 10pt; font-family: Comic Sans MS;">(1)</span><span style="font-size: 10pt; font-family: Comic Sans MS;">地图图片，要有连续的缩放级别的图，每个级别之间相差2倍</span></p>
<p style="margin-left:21.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 10pt; font-family: Comic Sans MS;">(2)</span><span style="font-size: 10pt; font-family: Comic Sans MS;">航拍图片，要有连续的缩放级别的图，每个级别之间相差2倍</span></p>
<p style="margin-left:21.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 10pt; font-family: Comic Sans MS;">(3)</span><span style="font-size: 10pt; font-family: Comic Sans MS;">三维图片，需要和地图图片、航拍图片保持一致的大小，和缩放级别和地理位置</span></p>
<p style="margin-left: 21pt; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10pt; font-family: Comic Sans MS;">(4)</span><span style="font-size: 10pt; font-family: Comic Sans MS;">地图效果图上面的使用的图标和弹出窗口图，需要原件，编写css需要使用</span></p><p style="margin-left: 21pt; margin-bottom: 0pt; margin-top: 0pt;"><br /><span style="font-size: 10pt; font-family: Comic Sans MS;"></span></p><div></div>
</div><img src ="http://www.blogjava.net/canvas/aggbug/356500.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/canvas/" target="_blank">小码哥</a> 2011-08-15 13:55 <a href="http://www.blogjava.net/canvas/articles/openlayers-custom.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mark一下学习计划</title><link>http://www.blogjava.net/canvas/archive/2011/05/11/mark2011.html</link><dc:creator>小码哥</dc:creator><author>小码哥</author><pubDate>Wed, 11 May 2011 14:26:00 GMT</pubDate><guid>http://www.blogjava.net/canvas/archive/2011/05/11/mark2011.html</guid><wfw:comment>http://www.blogjava.net/canvas/comments/350041.html</wfw:comment><comments>http://www.blogjava.net/canvas/archive/2011/05/11/mark2011.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/canvas/comments/commentRss/350041.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/canvas/services/trackbacks/350041.html</trackback:ping><description><![CDATA[为2011年mark一篇日志<br />
<br />
好久都没有做总结了，好久都没有做什么项目了，整天忙着上课，读论文，最近一段时间还开始忙着谈恋爱了。<br />
<br />
2011年开始这几个月读了数篇readings in database systems中超牛们的论文，对关系数据库知识也有了一定了解，而不是停留在以前仅仅会用关系数据库那个层次上了。还读了simpledb的源代码，minibase的源代码没有读完，也不想读了，很没意思，Jim Gray大神说关系数据库没啥搞头了，我觉得也是。Stonebraker大神也搞出了scidb，不搞传统的关系数据库了。<br />
<br />
好吧，我也不搞关系数据库了，开始跟进scidb吧。no-sql，not only-sql。我来了。<br />
<br />
<img src ="http://www.blogjava.net/canvas/aggbug/350041.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/canvas/" target="_blank">小码哥</a> 2011-05-11 22:26 <a href="http://www.blogjava.net/canvas/archive/2011/05/11/mark2011.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>openlayers小结(有参考项目代码)</title><link>http://www.blogjava.net/canvas/articles/how_to_do_with_openlayers.html</link><dc:creator>小码哥</dc:creator><author>小码哥</author><pubDate>Mon, 11 Oct 2010 12:42:00 GMT</pubDate><guid>http://www.blogjava.net/canvas/articles/how_to_do_with_openlayers.html</guid><wfw:comment>http://www.blogjava.net/canvas/comments/333731.html</wfw:comment><comments>http://www.blogjava.net/canvas/articles/how_to_do_with_openlayers.html#Feedback</comments><slash:comments>32</slash:comments><wfw:commentRss>http://www.blogjava.net/canvas/comments/commentRss/333731.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/canvas/services/trackbacks/333731.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 最近一段时间里，又做了一个跟openlayers相关的项目，但是到目前为止，我对openlayers还是不怎么了解，做东西也只是参考了openlayers的例子，以及自己的一些对openlayers用法的一些猜测。openlayers是一个用js实现的GIS前端框架，我的js目前还是打酱油的水平，要是没有jquery，那就基本写不了几行js代码了。js那是相当的强大，再加上VML\SVG、HTML...&nbsp;&nbsp;<a href='http://www.blogjava.net/canvas/articles/how_to_do_with_openlayers.html'>阅读全文</a><img src ="http://www.blogjava.net/canvas/aggbug/333731.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/canvas/" target="_blank">小码哥</a> 2010-10-11 20:42 <a href="http://www.blogjava.net/canvas/articles/how_to_do_with_openlayers.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>小记盛大校园牛人创新技术大赛</title><link>http://www.blogjava.net/canvas/archive/2010/09/18/snda.html</link><dc:creator>小码哥</dc:creator><author>小码哥</author><pubDate>Sat, 18 Sep 2010 09:13:00 GMT</pubDate><guid>http://www.blogjava.net/canvas/archive/2010/09/18/snda.html</guid><wfw:comment>http://www.blogjava.net/canvas/comments/332388.html</wfw:comment><comments>http://www.blogjava.net/canvas/archive/2010/09/18/snda.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/canvas/comments/commentRss/332388.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/canvas/services/trackbacks/332388.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 好久没有在blogjava上面写东西了，前段时间一直在忙两个项目，忙到没有时间做一些总结，还好项目进展都还不错。这段时间自己虽然搞得很忙，但是自己却感到非常的开心，我突然觉得这个世界好像都是属于我的：遇到了很多给我帮助的人，做了很多自己喜欢做的事，开始了自己特别向往的生活。&nbsp;&nbsp;<a href='http://www.blogjava.net/canvas/archive/2010/09/18/snda.html'>阅读全文</a><img src ="http://www.blogjava.net/canvas/aggbug/332388.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/canvas/" target="_blank">小码哥</a> 2010-09-18 17:13 <a href="http://www.blogjava.net/canvas/archive/2010/09/18/snda.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>