??xml version="1.0" encoding="utf-8" standalone="yes"?>99视频在线,欧美极度另类性三渗透,久久米奇亚洲http://www.aygfsteel.com/canvas/category/31286.html谁谓沛_Q一苇杭?/description>zh-cnSat, 27 Oct 2012 15:44:52 GMTSat, 27 Oct 2012 15:44:52 GMT60JavaE序如何限?控制下蝲和上传速度)http://www.aygfsteel.com/canvas/articles/bandwidthlimiter.htmlBarrieBarrieThu, 18 Oct 2012 08:34:00 GMThttp://www.aygfsteel.com/canvas/articles/bandwidthlimiter.htmlhttp://www.aygfsteel.com/canvas/comments/389824.htmlhttp://www.aygfsteel.com/canvas/articles/bandwidthlimiter.html#Feedback0http://www.aygfsteel.com/canvas/comments/commentRss/389824.htmlhttp://www.aygfsteel.com/canvas/services/trackbacks/389824.html好久没有在这里写点东西了Q要L书写记录的习(fn)惯?br />
q里单的讨论一下java设计|络E序中如何控制上传和下蝲速度Q我们常见的FTPQHTTPQBT{协议都是TCP的,但是现在行的utorrent却基于UDP实现了自己UTP协议(UDP+拥塞控制)Q不用什么协议,站在I/O的角度来_(d)限速的控制思\都是一L(fng)?br />
思\很简单,如下Q?br />
1.假设下蝲或者上传速度上限是m (KB/s),那么发送一个固定的字节数据(假设是n字节)的时间花Ҏ(gu)Qn/mQ?br /> 2.假设现在要发送n字节的数据,那么理论所需的时间应该是n/mQ而在实际情况下,发送n字节的数据只p了tU,那么发送该发送线E就应该睡眠n/m-tU,q样基本实C速度的控制?br />
代码以TCPZ
速度控制
 1 package com.actiontec.net.bandwidth;
 2 
 3 /**
 4  * 
 5  * @author Le
 6  * 
 7  */
 8 public class BandwidthLimiter {
 9 
10     /* KB */
11     private static Long KB = 1024l;
12 
13     /* The smallest count chunk length in bytes */
14     private static Long CHUNK_LENGTH = 1024l;
15 
16     /* How many bytes will be sent or receive */
17     private int bytesWillBeSentOrReceive = 0;
18 
19     /* When the last piece was sent or receive */
20     private long lastPieceSentOrReceiveTick = System.nanoTime();
21 
22     /* Default rate is 1024KB/s */
23     private int maxRate = 1024;
24 
25     /* Time cost for sending CHUNK_LENGTH bytes in nanoseconds */
26     private long timeCostPerChunk = (1000000000l * CHUNK_LENGTH)
27             / (this.maxRate * KB);
28 
29     /**
30      * Initialize a BandwidthLimiter object with a certain rate.
31      * 
32      * @param maxRate
33      *            the download or upload speed in KBytes
34      */
35     public BandwidthLimiter(int maxRate) {
36         this.setMaxRate(maxRate);
37     }
38 
39     /**
40      * Set the max upload or download rate in KB/s. maxRate must be grater than
41      * 0. If maxRate is zero, it means there is no bandwidth limit.
42      * 
43      * @param maxRate
44      *            If maxRate is zero, it means there is no bandwidth limit.
45      * @throws IllegalArgumentException
46      */
47     public synchronized void setMaxRate(int maxRate)
48             throws IllegalArgumentException {
49         if (maxRate < 0) {
50             throw new IllegalArgumentException("maxRate can not less than 0");
51         }
52         this.maxRate = maxRate < 0 ? 0 : maxRate;
53         if (maxRate == 0)
54             this.timeCostPerChunk = 0;
55         else
56             this.timeCostPerChunk = (1000000000l * CHUNK_LENGTH)
57                     / (this.maxRate * KB);
58     }
59 
60     /**
61      * Next 1 byte should do bandwidth limit.
62      */
63     public synchronized void limitNextBytes() {
64         this.limitNextBytes(1);
65     }
66 
67     /**
68      * Next len bytes should do bandwidth limit
69      * 
70      * @param len
71      */
72     public synchronized void limitNextBytes(int len) {
73         this.bytesWillBeSentOrReceive += len;
74 
75         /* We have sent CHUNK_LENGTH bytes */
76         while (this.bytesWillBeSentOrReceive > CHUNK_LENGTH) {
77             long nowTick = System.nanoTime();
78             long missedTime = this.timeCostPerChunk
79                     - (nowTick - this.lastPieceSentOrReceiveTick);
80             if (missedTime > 0) {
81                 try {
82                     Thread.sleep(missedTime / 1000000,
83                             (int) (missedTime % 1000000));
84                 } catch (InterruptedException e) {
85                     e.printStackTrace();
86                 }
87             }
88             this.bytesWillBeSentOrReceive -= CHUNK_LENGTH;
89             this.lastPieceSentOrReceiveTick = nowTick
90                     + (missedTime > 0 ? missedTime : 0);
91         }
92     }
93 }
94 

下蝲控制
 1 package com.actiontec.net.bandwidth;
 2 
 3 import java.io.IOException;
 4 import java.io.InputStream;
 5 
 6 /**
 7  * @author Le
 8  *
 9  */
10 public class DownloadLimiter extends InputStream {
11     private InputStream is = null;
12     private BandwidthLimiter bandwidthLimiter = null;
13     
14     public DownloadLimiter(InputStream is, BandwidthLimiter bandwidthLimiter)
15     {
16         this.is = is;
17         this.bandwidthLimiter = bandwidthLimiter;
18     }
19     @Override
20     public int read() throws IOException {
21         if(this.bandwidthLimiter != null)
22             this.bandwidthLimiter.limitNextBytes();
23         return this.is.read();
24     }
25 
26     public int read(byte b[], int off, int len) throws IOException
27     {
28         if (bandwidthLimiter != null)
29             bandwidthLimiter.limitNextBytes(len);
30         return this.is.read(b, off, len);
31     }
32 }

同样Q上传控?/div>
 1 package com.actiontec.net.bandwidth;
 2 
 3 import java.io.IOException;
 4 import java.io.OutputStream;
 5 
 6 /**
 7  * @author Le
 8  *
 9  */
10 public class UploadLimiter extends OutputStream {
11     private OutputStream os = null;
12     private BandwidthLimiter bandwidthLimiter = null;
13     
14     public UploadLimiter(OutputStream os, BandwidthLimiter bandwidthLimiter)
15     {
16         this.os = os;
17         this.bandwidthLimiter = bandwidthLimiter;
18     }
19     
20     @Override
21     public void write(int b) throws IOException {
22         if (bandwidthLimiter != null)
23             bandwidthLimiter.limitNextBytes();
24         this.os.write(b);
25     }
26     
27     public void write(byte[] b, int off, int len) throws IOException {
28         if (bandwidthLimiter != null)
29             bandwidthLimiter.limitNextBytes(len);
30         this.os.write(b, off, len);
31     }
32 
33 }

对于一个TCP socket

1 ServerSocket socket = new ServerSocket();
2 //其它初始化略

 1 //从socket中以一定的速率L?br /> 2 //```java
 3 DownloadLimiter dl = new DownloadLimiter(socket.getInputStream(), new BandwidthLimiter(6250));
 4 is = new DataInputStream(dl);
 5 
 6 //L?/span>
 7 int len = is.readInt();
 8 ByteBuffer buffer = ByteBuffer.allocate(4 + len);
 9 buffer.putInt(len);
10 is.readFully(buffer.array(), 4, buffer.remaining());
11 //```
12 
13 //以一定的速率写数据到socket
14 //```java
15 UploadLimiter ul = new UploadLimiter(socket.getOutputStream(), new BandwidthLimiter(6250));
16 ul.write();
17 //```

在多U程环境下也可以使用上述的方法。最后附图是d理器的|络利用率图6250KB/sQ也是50000kb/s,附图中网l利用率也在5%左右Q所以应该这个做法还准)(j)


Barrie 2012-10-18 16:34 发表评论
]]>openlayers结(有参考项目代?http://www.aygfsteel.com/canvas/articles/how_to_do_with_openlayers.htmlBarrieBarrieMon, 11 Oct 2010 12:42:00 GMThttp://www.aygfsteel.com/canvas/articles/how_to_do_with_openlayers.htmlhttp://www.aygfsteel.com/canvas/comments/333731.htmlhttp://www.aygfsteel.com/canvas/articles/how_to_do_with_openlayers.html#Feedback21http://www.aygfsteel.com/canvas/comments/commentRss/333731.htmlhttp://www.aygfsteel.com/canvas/services/trackbacks/333731.html阅读全文

Barrie 2010-10-11 20:42 发表评论
]]>
appengine支持Java?/title><link>http://www.aygfsteel.com/canvas/articles/AppEngineJavaOverview.html</link><dc:creator>Barrie</dc:creator><author>Barrie</author><pubDate>Wed, 08 Apr 2009 06:40:00 GMT</pubDate><guid>http://www.aygfsteel.com/canvas/articles/AppEngineJavaOverview.html</guid><wfw:comment>http://www.aygfsteel.com/canvas/comments/264452.html</wfw:comment><comments>http://www.aygfsteel.com/canvas/articles/AppEngineJavaOverview.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/canvas/comments/commentRss/264452.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/canvas/services/trackbacks/264452.html</trackback:ping><description><![CDATA[刚刚dappengine的时候才发现开始支持java了?br /> 上午的时候还没有?br /> <br /> 对java的比较熟(zhn),但是q是喜欢比较z的python<br /> <br /> <a >http://code.google.com/intl/zh-CN/appengine/docs/java/overview.html</a><br /> <br /> <a >http://googleappengine.blogspot.com/2009/04/seriously-this-time-new-language-on-app.html</a><br /> <br /> q是注册试用后google appenginel发的邮?<br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #000000;">Hello</span><span style="color: #000000;">,</span><span style="color: #000000;"><br /> <br /> Thanks for signing up to try Google App Engine for Java!  Your account has now<br /> been activated</span><span style="color: #000000;">,</span><span style="color: #000000;"> so you can begin building applications with our new Java<br /> runtime.<br /> <br /> Please note that this is still an early look at our support for the Java<br /> language and you may encounter issues during development. We look forward to<br /> hearing your feedback! To learn more</span><span style="color: #000000;">,</span><span style="color: #000000;"> please visit:<br /> <br /> http://code.google.com/appengine/docs/java/overview.html<br /> <br /> To start creating applications with Google App Engine</span><span style="color: #000000;">,</span><span style="color: #000000;"> simply follow this link<br /> (you may need to sign in with your burgundy.loh@gmail.com Google Account) and<br /> verify your account with a mobile phone number if you have not already done so:<br /> <br /> http://appengine.google.com/<br /> <br /> If you are having trouble verifying your account via SMS please fill<br /> out the following form and your account will be reviewed and enabled<br /> as soon as possible:<br /> <br /> http://appengine.google.com/waitlist/sms_issues<br /> <br /> Thanks!<br /> The Google App Engine Team<br /> <br /> Java is a registered trademark of Sun Microsystems</span><span style="color: #000000;">,</span><span style="color: #000000;"> Inc.</span></div> <br /> <br /> <br /> <img src ="http://www.aygfsteel.com/canvas/aggbug/264452.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/canvas/" target="_blank">Barrie</a> 2009-04-08 14:40 <a href="http://www.aygfsteel.com/canvas/articles/AppEngineJavaOverview.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>中国各城?jng)的l纬度数?_到县U城?http://www.aygfsteel.com/canvas/articles/GS-China.htmlBarrieBarrieThu, 12 Mar 2009 12:34:00 GMThttp://www.aygfsteel.com/canvas/articles/GS-China.htmlhttp://www.aygfsteel.com/canvas/comments/259355.htmlhttp://www.aygfsteel.com/canvas/articles/GS-China.html#Feedback4http://www.aygfsteel.com/canvas/comments/commentRss/259355.htmlhttp://www.aygfsteel.com/canvas/services/trackbacks/259355.htmll北有斗-天文爱好者的乐园
~写q篇博文有几个目的:(x)
首先认识了两个单?br />
latitude  [lat·i·tude || 'lætɪtuːd /-tjuːd] n.  U度; 回旋余地, 自由; U度地区
longitude  [lon·gi·tude || 'lɑndʒɪtuːd /'lɒndʒɪtjuːd] n.  l度; l线

1.学习(fn)dom4j的简单用?br /> 2.做一个方便用的全国城市(jng)l纬度数据库
3.利用google天气api做一个全面的天气预报服务
4.学习(fn)用python~写webservice

内容Q?br /> 1.学习(fn)dom4j的简单用?br /> 攉了的l纬度都是按照城?jng)分开的单独的htm文gQ我已经处理qؓ(f)W合html4.0标准的html文g了,x有的标识都是成对的,q里可以下蝲q些文g(点击下蝲l纬度html?
(1)如何使用dom4jdxml文档
使用dom4jdxml文档代码片段

(2)如何遍历xml文档的所有结?br /> q样p入了q个xml文档Qƈ获得了这个xml文档对象的根l点Q由于xml文档是一个树(wi)形结构,q样很Ҏ(gu)遍历它所有的l点了?br /> q里Ҏ(gu)自己的需要,试使用了两U遍历方法,一U是Ҏ(gu)?wi)的l构~写递归E序Q一U就是直接用@环,q有都dom4j自带的visitor模式讉K也很好用Q这里有参考文档,可以看看(查看)

使用递归遍历

q里提供的xml文档层数?Q直接@环即?br />
直接循环遍历

关于visitor模式的用,请参看上面给出的参考文?br />
(3)创徏新的xml文档
创徏xml文档

整个合ƈ所有htmlؓ(f)一个xml的代码如?br />
完整的代?/span>

2.做一个方便用的全国城市(jng)l纬度数据库
l过上面的操作,一个完整的全国城市(jng)l纬度数据库做好了Q只不过它是xml格式的,看v来还不错Q?a title="下蝲q个数据? href="/Files/canvas/GI-China.zip">下蝲q个数据?/a>
生成的xml展示

3.利用google天气api做一个全面的天气预报服务
google提供的天气api可以有两U方式访问,
一U是
     http://www.google.com/ig/api?hl=zh-cn&weather=,,,30670000,104019996
30670000为纬度,104019996为经度,q个是把上面的xml中的l纬度乘以了10^6(10的六ơ方)Q这个方法有个好处,是可以Ҏ(gu)l纬度获得天气预报,自然预报地区也可变得_?br /> 另一U是
     http://www.google.com/ig/api?weather=Beijing
q个链接比较单,但是支持的城?jng)比较少Q所以还是用第一U方式比较好Q于是才整理好了所有城?jng)的l纬?br />
讉K上面的链接,googleq回的xml内容看v来是q样?br />
googleq回的xml

对于q回的xml中的<icon data="/images/weather/cn_cloudy.gif"/>Q可以这h造链接获取google提供的图?br /> 取其中的cn_cloudy.gifQ然后放在http://www.google.cn/ig/images/weather/之后Q生成的链接?br />      http://www.google.cn/ig/images/weather/cn_cloudy.png
q样q个天气api基本构思好?br />
4.学习(fn)用python~写webservice(待箋……)
这个服务编写ؓ(f)一个webserviceQ决定用pythondQ所以要学习(fn)一下python?br />



Barrie 2009-03-12 20:34 发表评论
]]>
打造ICTCLAS JNI For Javahttp://www.aygfsteel.com/canvas/articles/jni-free-ictclas.htmlBarrieBarrieTue, 06 May 2008 06:40:00 GMThttp://www.aygfsteel.com/canvas/articles/jni-free-ictclas.htmlhttp://www.aygfsteel.com/canvas/comments/198704.htmlhttp://www.aygfsteel.com/canvas/articles/jni-free-ictclas.html#Feedback0http://www.aygfsteel.com/canvas/comments/commentRss/198704.htmlhttp://www.aygfsteel.com/canvas/services/trackbacks/198704.html声明:ICTCLAS以及(qing)我修改ICTCLAS JNI For Java的版权均归原作者所有,未经原作者允许,请勿作其它商业用?/font>
首先下蝲ICTCLAS Beta版本公开源代?点击下蝲
我用的是Visual studio 2005开发环境,源码使用VC6开发的Q现在把q个工程转移到VS2005下。我使用的方法比较笨Q基本上是属于体?暴力型的Q不q自p得爽可以了
在VS2005里新建Win32目FREEICTCLAS,在application Settings选项里选中Dll和Empty Project,然后新徏以下qo(h)?New Filter)Qƈ且将原项目的源码?qing)其目录l构copy到现在的win32目的目录下(qo(h)器和目目录C意?
C意?点击前面+号展开)

q样q个win32工程基本徏完了?br /> 观察ICTCLAS源代码后~写以下带有native声明的方法的javac,只实C头两个方法,W三个暂未实玎ͼ与ICTCLAS接口基本保持一?br /> 代码如下:
FreeICTCLAS.java(点击+展开)
然后在命令行输入Javac FreeICTCLAS.java~译FreeICTCLAS.java
生成FreeICTCLAS.class文g后,再用javah FreeICTCLAS生成FreeICTCLAS.hQ代码如下:(x)
/* DO NOT EDIT THIS FILE - it is machine generated */
#include 
<jni.h>
/* Header for class FreeICTCLAS */

#ifndef _Included_FreeICTCLAS
#define _Included_FreeICTCLAS
#ifdef __cplusplus
extern 
"C" {
#endif
/*
 * Class:     FreeICTCLAS
 * Method:    FreeICTCLAS_Init
 * Signature: (II)Z
 
*/

JNIEXPORT jboolean JNICALL Java_FreeICTCLAS_FreeICTCLAS_1Init
  (JNIEnv 
*, jobject, jint, jint);

/*
 * Class:     FreeICTCLAS
 * Method:    FreeICTCLAS_ParagraphProcess
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 
*/

JNIEXPORT jstring JNICALL Java_FreeICTCLAS_FreeICTCLAS_1ParagraphProcess
  (JNIEnv 
*, jobject, jstring);

/*
 * Class:     FreeICTCLAS
 * Method:    FreeICTCLAS_FileProcess
 * Signature: (Ljava/lang/String;Ljava/lang/String;)Z
 
*/

JNIEXPORT jboolean JNICALL Java_FreeICTCLAS_FreeICTCLAS_1FileProcess
  (JNIEnv 
*, jobject, jstring, jstring);

#ifdef __cplusplus
}

#endif
#endif
FreeICTCLAS.h拯到win32目所在目录中Q再其d到项目中Q接下来是~写FreeICTCLAS.cpp实现头文仉Ҏ(gu)
主要代码如下Q?br />
#include "FreeICTCLAS.h"
#include 
"util.h"
#include 
"globeVar.h"
#include 
<string.h>
#include 
<stdlib.h>
/*
* Class:     FreeICTCLAS
* Method:    FreeICTCLAS_Init
* Signature: (II)Z
*/

JNIEXPORT jboolean JNICALL Java_FreeICTCLAS_FreeICTCLAS_1Init
(JNIEnv 
*env, jobject obj, jint OperateType, jint OutputFormat)
{
    m_ICTCLAS.m_nOperateType 
= OperateType;
    m_ICTCLAS.m_nOutputFormat 
= OutputFormat;
    
return JNI_TRUE;
}

/*
* Class:     FreeICTCLAS
* Method:    FreeICTCLAS_ParagraphProcess
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/

JNIEXPORT jstring JNICALL Java_FreeICTCLAS_FreeICTCLAS_1ParagraphProcess
(JNIEnv 
*env, jobject obj, jstring sParagraph)
{
    
char *sResult,*sSource;
    sSource 
= jstringTochar(env, sParagraph);
    
if(m_ICTCLAS.m_nOutputFormat!=2)
        sResult
=new char [(strlen(sSource)+13)*3];
    
else
        sResult
=new char [(strlen(sSource)+13)*50];
    
    
if(!m_ICTCLAS.ParagraphProcessing(sSource,sResult))
        exit(
1);
    
else
        
return chartoJstring(env,sResult);
}

/*
* Class:     FreeICTCLAS
* Method:    FreeICTCLAS_FileProcess
* Signature: (Ljava/lang/String;Ljava/lang/String;)Z
*/

JNIEXPORT jboolean JNICALL Java_FreeICTCLAS_FreeICTCLAS_1FileProcess
(JNIEnv 
*env, jobject obj, jstring sSourceFilename, jstring sResultFilename)
{
    
return JNI_TRUE;
}

~译目Q在release目录中找到FreeICTCLAS.dllQ将其拷贝到FreeICTCLAS.class所在的目录?br /> 现在q行java FreeICTCLAS卛_看到中文分词的结果啦

怎么把ICTCLAS JNI for Javad到eclipse目中去?下次写吧?br /> 当你看到q句话的时候,你可以直接发邮g向我索要win32目和eclipse目 
BlogJava后台~辑器不好用Q^_^

Barrie 2008-05-06 14:40 发表评论
]]>
վ֩ģ壺 | ͩ| ̶| | ̩| | | | | Ž| ͩ| | | ˶| | Ͳ| | | | ֳ| ˮ| | | | | ͭϿ| | | | ˮ| | | ƽ| | ʯ| ʡ| | ˻| ®| ľ˹| |