??xml version="1.0" encoding="utf-8" standalone="yes"?>国产精品乱战久久久,99re8这里有精品热视频8在线,成年人视频在线看http://www.aygfsteel.com/wady/category/22586.html?/description>zh-cnThu, 24 Apr 2008 04:59:09 GMTThu, 24 Apr 2008 04:59:09 GMT60JavaU程控制的图像分割与合成http://www.aygfsteel.com/wady/articles/195439.htmlwadywadyThu, 24 Apr 2008 02:40:00 GMThttp://www.aygfsteel.com/wady/articles/195439.htmlhttp://www.aygfsteel.com/wady/comments/195439.htmlhttp://www.aygfsteel.com/wady/articles/195439.html#Feedback0http://www.aygfsteel.com/wady/comments/commentRss/195439.htmlhttp://www.aygfsteel.com/wady/services/trackbacks/195439.html
  1 Java囑փ处理与线E的q发控制

  1.1 Java囑փ处理

  Java语言提供了丰富的c?Class)、接?Interface)以及相应的调用方?Method)。用这些类或接口,可以定义自己的类或子c,充分利用Java面向对象的特性进行编E。在java.awt包中Q提供了专门的Imagec,它是1U抽象类Q可提供抽象的方法描l图片的一些共同特性。而在AppletcdTookitcM都提供了2UgetImage()Ҏ下蝲囑փQ分别根据绝对地址和相对地址查询所要下载的囑փ。通常采用相对地址的下载方法,它的语法定义及功能如下:

  1.public Image getImage(URL url,String name)

  功能Q根据相对地址下蝲囑փ?

  参数Qurl??URL(l一资源定位)基地址Q?name 囑փ文g名?

  获取囑փ后就可以调用GraphicscL供的drawImage()Ҏ昄囑փ?

  2.public drawImage(Image img,int x,int y,observer)

  功能Q在指定位置昄囑փ?

  参数Qimg 待显C图像,x 横坐标,y U坐标,observer 囑փ监视器,用来监视囑փ的下载情况,接受囑փ装蝲信息(当图像完全蝲入时q回TrueQ否则返回False)?br />
  在显C图像时Q通常希望获得对图像的控制Q从而以自己喜欢的各U方式实?a target="_blank">媒体播放。ؓ此,Java专门提供了用于跟t包括图像和声音{?a target="_blank">多媒?/a>对象的ImageObservercdMediaTrackerc,在本文程序中主要用到的是跟踪多幅囑փ状态的MediaTrackercR?

  1.2 Java多线Eƈ发功?

  目前Q线E?Thread)已经?a target="_blank">操作pȝ和应用开发系l所采用。线E是E序的单个控制流Q具有顺序程序的特点Q但是线E不?个程序,它仅仅是E序?个执行序列。线E具有很强的q发功能Q在同一时刻可能有多个线E同时处于执行状态。线E是动态的Q具有一定的生命周期Q分别经历从创徏、执行、阻塞直到消亡的q程。Java语言中提供了专门的Threadc,以支持直接的多线E编E。ThreadcL供了对线E的控制ҎQ如Start(),Stop(),Run()、Suspend()、resume()、Sleep()以及Run()Ҏ{等Q它们可以对U程的状态进行控制。ƈ可以q用SetPriority()Ҏ讄U程的运行优先顺序。Threadcȝ定义Ҏ如下Q?

  Thread(ThreadGroup group,Runable target,String name)

  SetPriority()用来讄U程的优先。线E优先?个介于MINPRIORITY(在类中定义ؓ1)和MAXPRIORITY(在类中定义ؓ10)之间的整数。线E不同的优先U决定了不同U程之间的切换?br />
2 Java囑փ分割与合成的法及实?

  JavaE序首先一个完整的囑փ下蝲Q然后将其分割成20个单元拼图,卛_??列。在本例中特地将W?0q图像单元设?个空白图像,以便拼图时用户交互操作用。这些参数分别定义在相应的变量中?

  final int XCELLS=5;  //每行拼图的数?
  final int YCELLS=4;//每列拼图的数?
  final int ALLCELLS=20;//分割元素的数?
  final int EMPTY=19;//第20单元Q即cellsQ?9Q置?
  //I白囑փ

  然后这些图像分割单元存?个CellcLlcellsQ]中,在这里CellcM含有囑փ以及它的起始位置和当前位|,其具体定义如下:

  class Cell
  {int sx,sy; //起始位置
  int cx,cy; //当前位置
  Image img; //单元囑փ
  public Cell(Image img,int x,int y) //CellcL造函?
  {this.img=img;
  sx=x;sy=y;} //lv始位|赋gؓx,y
  }

  ZҎ个图像分割单元进行状态跟t,q需要徏?个MediaTrackercȝ实体(instance)Q然后调用addImage()ҎQؓ每个要跟t的囑փ指定1个唯一的标识符。标识符军_了图像获取时的优先顺序ƈ使得囑փ能够独立完整地进行处理?

  MediaTracker tracker=new MediaTracker(this)
  //为当前用类建立1个MediaTracker实体Q用于跟t类
  //上的囑փ
  cellsQEMPTYQ?new Cell(createEmpty(),toPoint(EMPTY).x,toPoint(EMPTY).y);
  tracker.addImage(cellsQEMPTYQ?img,0);
  //调用createEmpty()Ҏ产生I白囑փQƈ加入到所跟踪
  //的cells数组?0单元
  void setPosition(int x,int y)  //讄单元囑փ当前位置
  {cx=x;cy=y;}

  各个囑փ单元的位|存放于位置数组position里:

  int positionQ]Q]=new intQXCELLsQEYCELLSQ?

  q样可以用CellcLlcellsQ]对图像的各个单元q行操作Q从而将各个单元囑փq行合成昄Qƈ通过positionQ]Q]数组改变各个单元的位|。ؓ了对各单元进行ƈ发操作,需要对U程加以控制Qƈ通过鼠标事g和按键事件控制进E的开始、睡眠和q行{状态变化,其实现方法如?仅以run()ҎZ)Q?

  Thread imageThread=null; //定义U程imageThread,初始
//gؓI?
  public void run()
  {imageThread.setPriority(Thread.MINPRIORITY);//讄U?
//E执行优先?

  try
    {imageThread.sleep(2000);//U程睡眠{待2000ms
    }catch(InterruptedException e){}
  first=changeArray();//调用changeArray()Ҏ随机改变?
//像单元位|?
  while(!loaded)//判断囑փ若未被跟t蝲入,则调用相?
//Ҏ跟踪q加载图?
    {repaint();
    try
     {imageThread.sleep(100);
     }catch(InterruptedException e){System.out.println(e);}
    }
  }

  changeArray()Ҏ用来随机地改变图像单元的位置Q其实现Ҏ如下Q?

  boolean changeArray()
  {
  int sourceQ]=new intQ?0Q?
  int fullQ]=new intQ?0Q?
  for(int i=0;i<ALLCELLS;i++)
    {
    int r=(int)(Math.random()*20);
    while(fullQrQ?=0)
    r=(r+(int)(Math.random()*20))%20;
    sourceQiQ?r;
    fullQrQ?1;
    }
  int pos=0;
  for(int i=0;i<ALLCELLS;i++,pos++)
    {
    Point p=toPoint(sourceQposQ?;
    cellsQposQ?setPosition(p.x,p.y);
    positionQp.xQEp.yQ?pos;
    }
  x=cellsQEMPTYQ?cx;
  y=cellsQEMPTYQ?cy;
  return(false);
  }

  当applet执行后点击鼠标,U程p启动Q开始装载图像ƈ执行changeArray()随机选择1个位|来Ud囑փ单元Q此时可以用键盘移动图像上的Q意单元到M位置。在q里q有一个重要内容就是怎样图像分割成许多的单元,我们可以通过引用CropImageFilterҎ来分割图像,它是1个分割图像过滤器。其实现Ҏ如下Q?

  Image crop(int pos)
  {//pos参数用函数给出的囑փ单元位置?
  Point p=toPoint(pos);//位|号转化为坐标Ş?
  ImageFilter filter=new CropImageFilter(xside*p.x,yside*p.y,xside,yside);
  //在给定坐标和长宽的绝对矩形区域内创徏分割囑փq?
  //滤器实体filter
  ImageProducer producer=new FilteredImageSource(baseImage.getSource(),filter;)

  //由原囑փ和分割图像过滤器实体创徏新的囑փ

  //产生器producer
  return createImage(producer);//由图像生器producer产生
//囑փq返?
  }

  通过以上步骤Q整个图像的分割与合成显C就完成了。本E序主要利用了crop()、changeArray()、mousedown()、Thread(){方法以及几个表C程序运行状态的布尔变量实现了一个线E控制和动感囑փ相结合的囑փ处理q程?

wady 2008-04-24 10:40 发表评论
]]>
多反向代理[Squid]下获取客L真实IP地址 http://www.aygfsteel.com/wady/articles/195426.htmlwadywadyThu, 24 Apr 2008 02:31:00 GMThttp://www.aygfsteel.com/wady/articles/195426.htmlhttp://www.aygfsteel.com/wady/comments/195426.htmlhttp://www.aygfsteel.com/wady/articles/195426.html#Feedback0http://www.aygfsteel.com/wady/comments/commentRss/195426.htmlhttp://www.aygfsteel.com/wady/services/trackbacks/195426.htmlrequest.getRemoteAddr()Q这U方法在大部分情况下都是有效的。但是在通过了Apache,Squid{反向代理Y件就不能获取到客L的真实IP地址了?br />
  q段旉在做IPl计的程序设计,׃服务器作了集,使用了反向代理YӞ?a >http://192.168.1.110:2046/的URL反向代理?a >http://www.xxx.com/的URLӞ?strong>request.getRemoteAddr()Ҏ获取的IP地址是:127.0.0.1 或 192.168.1.110Q而ƈ不是客户端的真实QP。这是什么原因呢Q?br />
  q是反向代理的原因。经q代理以后,׃在客L和服务之间增加了中间层,因此服务器无法直接拿到客L的IPQ服务器端应用也无法直接通过转发h的地址q回l客L。但是在转发h的HTTP头信息中Q增加了XQFORWARDEDQFOR信息。用以跟t原有的客户端IP地址和原来客Lh的服务器地址。当我们讉Khttp://www.xxx.com/index.jsp/Ӟ其实q不是我们浏览器真正讉KC服务器上的index.jsp文gQ而是先由代理服务器去讉Khttp://192.168.1.110:2046/index.jspQ代理服务器再将讉K到的l果q回l我们的览器,因ؓ是代理服务器去访问index.jsp的,所以index.jsp中通过request.getRemoteAddr()的方法获取的IP实际上是代理服务器的地址Qƈ不是客户端的IP地址?br />
  于是可得得客L真实IP地址的方法一Q?br />
1 public String getIpAddr(HttpServletRequest request) {
2      String ip = request.getHeader("x-forwarded-for");
3      if(ip == null || ip.length() == 0{
4            ip = request.getRemoteAddr();
5        }

6        return ip;
7    }

  可是当我讉Khttp://www.xxx.com/index.jsp/Ӟq回的IP地址始终是unknownQ也q不是如上所C的127.0.0.1 或 192.168.1.110了,而我讉Khttp://192.168.1.110:2046/index.jspӞ则能q回客户端的真实IP地址Q写了个Ҏ去验证?br />
  
 1<%@ page import="java.util.*" %>
 2<table border=1 cellspacing=0 cellpadding=0 align=center> 
 3<tr> 
 4<th>Name</th> 
 5<th>Value</th> 
 6</tr> 
 7<% 
 8Enumeration enumNames; 
 9String strName,strValue; 
10
11enumNames = request.getHeaderNames(); 
12while(enumNames.hasMoreElements()){ 
13    strName = (String)enumNames.nextElement(); 
14    strValue = request.getHeader(strName); 
15    
%> 
16    <tr> 
17    <td><%=strName%></td> 
18    <td><%=strValue%></td> 
19    </tr> 
20    <% 
21
22
%>
23<tr>
24</table>
25


  出来的结果:X-Forwarded-For: unknown 。X-Forwarded-For实存在Q但其值却为unknownQl找原因。上|搜了搜Q原因出在了Squid上?br />
squid.conf 的配制文件 forwarded_for w认是为onQ如?forwarded_for 设成?off  则:

X-Forwarded-For: unknown

一查,发现forwarded_for 设ZoffQ原因找CQ把forwarded_for 设ZonQ重启后Q访?a >http://www.xxx.com/index.jsp/ 获得的IP是客L的真实IP?br />
  于是可得得客L真实IP地址的方法二Q?br />
 1    public String getIpAddr(HttpServletRequest request) {
 2        String ip = request.getHeader("x-forwarded-for");
 3        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
 4            ip = request.getHeader("Proxy-Client-IP");
 5        }

 6        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
 7            ip = request.getHeader("WL-Proxy-Client-IP");
 8        }

 9        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
10            ip = request.getRemoteAddr();
11        }

12        return ip;
13    }

14



  可是Q如果通过了多U反向代理的话,X-Forwarded-For的值ƈ不止一个,而是一Ԍp|I竟哪个才是真正的用L的真实IP呢?

  {案是取X-Forwarded-For中第一个非unknown的有效IP字符丌Ӏ?br />
  如:
  X-Forwarded-ForQ?92.168.1.110, 192.168.1.120, 192.168.1.130, 192.168.1.100
  用户真实IP为: 192.168.1.110



 

apache、lighttpd+resin、tomcat 取得客户端ip

 public String getIpAddr(HttpServletRequest request) {
 2        String ip = request.getHeader("x-forwarded-for");
 3        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
 4            ip = request.getHeader("Proxy-Client-IP");
 5        }

 6        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
 7            ip = request.getHeader("WL-Proxy-Client-IP");
 8        }

 9        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
10            ip = request.getRemoteAddr();
11        }

12        return ip;
13    }



wady 2008-04-24 10:31 发表评论
]]>
վ֩ģ壺 | ͻȪ| | Դ| ij| ƽң| | | | | | | ̨| ɽ| մ| ٲ| ٳ| | ƽ| | ʯɽ| ƽ| Ϫ| ʲ| | | | ϲ| | 㽭ʡ| | | º| Ϣ| ԭ| ɽ| ˫Ѽɽ| | ȷɽ| | |