Java是一个开放、标准、通用的网络程序运行平台,用Java编写的应用程序可以适用于多种不同的平台和终端而无需修改程序,同样,基于WAP的手机也可以使用Java的平台或与后端服务器进行交互来完成各种复杂的功能。你有没有想过,坐在汽车里或者走在路上就可以轻轻松松的管理你复杂的互联网络或局域网络。使用Java Servlet就可以解决这个问题。
下面是一个可以让你在支持WAP的手机上监听你的网络的简单的Java servlet程序,类似于dos下的ping命令。这个程序相当在你的主机上执行了ping命令,并在你的手机上显示结果。 用法如: http://host/servlet/WAPping 或者把IP地址作为一个参数传给主机,如: http://host/servlet/WAPping?IP_address
你可以在配置文件中更改常用的设置, Servlet程序必须以配置文件名为初始的参数,参数描述了一个文本文件名,文件中存放你设定的信息。
对于 Tomcat 中的web.xml,可以设置:
<servlet>
<servlet-name>WAPping</servlet-name>
<servlet-class>WAPping</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>config file path
</init-param>
</servlet>
在配置文件中,空行和以# 或 file://开头的行都将被忽略,目前支持下列参数:
# prefix 是用于主机命令,默认值为空
# 对于基于NT体系的主机,必须设置prefix=command.com /c
prefix=command.com /c
# ping的选项,默认值为空
# 例如3 显示请求并解释地址到主机名:
ping=-n 3 -a
配置文件示例:
#
# WAP ping settings
#
# prefix
prefix=command.com /c
# ping
ping=-a -n 3
程序清单:(编译后文件名为WAPping.class,放入你的主机的Servlet目录下)
import java.io.*;
import java.util.Hashtable;
import java.util.Random;
import javax.servlet.*;
import javax.servlet.http.*;
public class WAPping extends HttpServlet
{
public void init(ServletConfig servletco
nfig)
throws ServletException
{
super.init(servletconfig);
NEWLINE = System.getProperty("line.separator");
separator = System.getProperty("file.separator");
configuration = new Hashtable();
readConfig(getInitParameter("config"), configuration);
}
public void doPost(HttpServletRequest httpservletrequest, HttpServletResponse httpservletresponse)
throws ServletException, IOException
{
doGet(httpservletrequest, httpservletresponse);
}
public void doGet(HttpServletRequest httpservletrequest, HttpServletResponse httpservletresponse)
throws ServletException, IOException
{
String str= "";
String str1 = "";
str = HttpUtils.getRequestURL(httpservletrequest).toString();
int i;
if((i = str.indexOf("?")) > 0)
str= str.substring(0, i);
str1 = httpservletrequest.getQueryString();
if(httpservletrequest.getHeader("Accept").indexOf("wap.wml") >= 0)
{
wmlClient(str, str1, httpservletrequest, httpservletresponse);
return;
}
else
{
httpservletresponse.setContentType("text/html");
PrintWriter printwriter = httpservletresponse.getWriter();
printwriter.println("");
printwriter.println("<br><br><center>不能检测到WAP客户机</center>");
printwriter.println("</html>");
printwriter.flush();
printwriter.close();
return;
}
}
private void wmlClient(St
ring str, String str1, HttpServletRequest httpservletrequest, HttpServletResponse httpservletresponse)
throws IOException
{
httpservletresponse.setContentType("text/vnd.wap.wml");
PrintWriter printwriter = httpservletresponse.getWriter();
printwriter.println("<?xml version=\"1.0\"?>");
if(str1 == null)
printwriter.println(MainWmlCard(str));
else
if(str1.equals(""))
{
printwriter.println(MainWmlCard(str));
}
else
{
String str2 = getFromQuery(str1, "act=");
if(str2.equals("3"))
printwriter.println(writeWmlCommand(s,httpservletrequest.getParameter("cmd")));
else
printwriter.println(writeWmlCommand(str, str1));
}
printwriter.flush();
printwriter.close();
}
private String MainWmlCard(String str)
{
StringBuffer stringbuffer = new StringBuffer("");
stringbuffer.append("<wml>" + NEWLINE);
stringbuffer.append("<head>" + NEWLINE);
stringbuffer.append("<meta http-equiv=\"Cache-Control\" content=\"max-age=0\" forua=\"true\"/>" + NEWLINE);
stringbuffer.append("</head>" + NEWLINE);
stringbuffer.append("<card id=\"mainshell\" title=\"WAPping Card\">" + NEWLINE);
stringbuffer.append("<do type=\"accept\" label=\"Exec\">" + NEWLINE);
stringbuffer.append("
" + NEWLINE);
stringbuffer.append("" + NEWLINE);
stringbuffer.append("" + NEWLINE);
stringbuffer.app
end("" + NEWLINE);
stringbuffer.append("<p align=\"center\"><b>WAP ping</b></p>" + NEWLINE);
stringbuffer.append("<p>Host><input type=\"text\" name=\"sCmd\" value=\"\" emptyok=\"false\"/></p>" + NEWLINE);
stringbuffer.append("</card>" + NEWLINE);
stringbuffer.append("</wml>" + NEWLINE);
return stringbuffer.toString();
}
private String getId()
{
String str = "";
synchronized(SessionIdLock)
{
long cTM = System.currentTimeMillis();
Random random = new Random();
str = String.valueOf(cTM);
for(int i = cTM; i <= 6; i++)
str = str + (int)(1.0D + 6D * random.nextDouble());
}
return str;
}
private String getFromQuery(String str, String str1)
{
if(str == null)
return "";
int i;
if((i = str.indexOf(str1)) < 0)
return "";
String str2 = str.substring(i + str1.length());
if((i = str2.indexOf("&")) < 0)
return str2;
else
return str2.substring(0, i);
}
private String writeWmlCommand(String str, String str1)
throws IOException
{
StringBuffer stringbuffer = new StringBuffer();
String str2;
if(str1 == null)
str2 = "";
else
str2 = str1;
stringbuffer.append("<wml>" + NEWLINE);
stringbuffer.append("<head>" + NEWLINE);
stringbuffer.append("<meta http-equiv=\"Cache-Control\" content=\"max-age=0\" forua=\"true\"/>" + NEWLINE);
stringbuffer.append("<
/head>" + NEWLINE);
stringbuffer.append("<card id=\"execshell\" title=\"WAPping Card\">" + NEWLINE);
stringbuffer.append("<do type=\"accept\" label=\"Ok\">" + NEWLINE);
stringbuffer.append("<go href=\"" + str + "?" + "fct" + "=" + getId() + "\"/>" + NEWLINE);
stringbuffer.append("</do>" + NEWLINE);
str2 = str2.trim();
if(str2.length() == 0)
{
stringbuffer.append("<p>空的命令行</p>");
}
else
{
str2 = executeCmd((String)configuration.get("prefix") + " ping " + (String)configuration.get("ping") + " " + str2, "<br/>");
if(str2.length() > 900)
str2 = str2.substring(0, 900) + "...";
stringbuffer.append("<p>" + replaceDollar(str2) + "</p>");
}
stringbuffer.append("</card>" + NEWLINE);
stringbuffer.append("</wml>" + NEWLINE);
return stringbuffer.toString();
}
private String executeCmd(String str, String str1)
{
String str2 = "";
String str4 = str1 + "host>" + str;
try
{
Process process = Runtime.getRuntime().exec(s);
java.io.InputStream inputstream = process.getInputStream();
BufferedReader bufferedreader = new BufferedReader(new InputStreamReader(inputstream));
String str3;
while((str3 = bufferedreader.readLine()) != null)
str4 = str4 + str1 + prepareMsg(str3) + NEWLINE;
process.waitFor();
bufferedreader.close();
}
catch(Exception exception)
{
str4
= str4 + str1 + exception;
}
return str4;
}
public String getServletInfo()
{
return "WAP ping 程序";
}
private String prepareMsg(String str)
{
StringBuffer stringbuffer = new StringBuffer("");
if(str.length() == 0)
return "";
for(int i = 0; i < str.length(); i++)
{
char c = str.charAt(i);
if(c == '>')
stringbuffer.append(">");
else
if(c == '<')
stringbuffer.append("<");
else
if(c == '&')
stringbuffer.append("&");
else
if(c == '"')
stringbuffer.append(""");
else
stringbuffer.append(c);
}
return stringbuffer.toString();
}
private String replaceDollar(String str)
{
StringBuffer stringbuffer = new StringBuffer("");
for(int i = 0; i < str.length(); i++)
{
char c;
if((c = str.charAt(i)) == '$')
stringbuffer.append("$$");
else
stringbuffer.append(c);
}
return stringbuffer.toString();
}
private void readConfig(String str, Hashtable hashtable) file://读入参数文件
{
try
{
BufferedReader bufferedreader = new BufferedReader(new InputStreamReader(new FileInputStream(str)));
String str1;
while((str1 = bufferedreader.readLine()) != null)
{
str1 = str1.trim();
if(str1.length() > 0)
{
int i = str1.indexOf("=");
if(i > 0 && i < str1.length() - 1 && str1.charAt(0) != '#' && !str1.startsWith("//"))
hashtable.put(str1.substring(0, i).trim(), str1.substring(i + 1).trim());
}
}
}
catch(Exception _ex) { }
if((String)hashtable.get("prefix") == null)
hashtable.put("prefix", ""); file://如果“prefix”参数为空,则设prefix为默认值
if((String)hashtable.get("ping") == null)
hashtable.put("ping", ""); file://如果“ping”参数为空,则设ping为默认值
}
public WAPping()
{
}
private static Object SessionIdLock = new Object();
private static final int HOW_LONG = 6;
private static final int MAX_WML = 900;
private static final String DEFTITLE = "WAP ping";
private static final String DEFPREFIX = "";
private static final String DEFPING = "";
private static final String CONFIG = "config";
private static final String FICT = "fct";
private static final String CMD = "cmd";
private static final String ACTION = "act";
private static final String UPFRAME = "1";
private static final String DOWNFRAME = "2"
;
private static final String RUNCMD = "3";
private static final String HISTORY = "4";
private static final String PREFIX = "prefix";
private static final String PING = "ping";
private static String NEWLINE = "\n";
private static String separator = "/";
private static Hashtable configuration;
}