思路:先整理好所有域名后辍的whois主机地址,把他做成xml打包进APP,查域名的时候获取这个XML对应的主机地址,再用socket连接到这个地址,发送/接收信息(这个XML文件在assets下)。
先上截图:
(这个whois.xml是我十年前做的,我发了很长时间收集了大部分可靠的WHOIS主机,在这里这个文件才最有价值)
=============================================================================================================================================
MainActivity代码:
class="brush:java;gutter:true;">package cn.net.vb.whois.whois; import android.app.ProgressDialog; import android.os.Handler; import android.os.Message; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import java.util.List; public class MainActivity extends ActionBarActivity { private static final int DEFAULT_PORT = 43; TextView tv1; String strinfo; EditText txtdomain; //装载Beauty类型的链表,其内容由XML文件解析得到 private List<Beauty> beautyList; private ProgressDialog pd; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv1 = (TextView) findViewById(R.id.tv1); txtdomain = (EditText) findViewById(R.id.txtdomain); //开始按钮 Button button1 = (Button) findViewById(R.id.button1); button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //提示框,这样写在WINFORM是动画是动不了的,但Activity可以 pd = ProgressDialog.show(MainActivity.this, "请稍等", "正在从whois主机获取信息"); //启动线程 mHandler(txtdomain.getText().toString()); } }); } //获取XML里的WHOIS主机 private String get_whois_xml_server(String domain) { String result = ""; String[] arr; String tld=""; String serv=""; try { //通过assertmanager的open方法获取到beauties.xml文件的输入流 InputStream is = getResources().getAssets().open("whois.xml"); // 这个文件在assets下 //初始化自定义的实现类BeautyParserImpl BeautyParserImpl pbp = new BeautyParserImpl(); //调用pbp的parse()方法,将输入流传进去解析,返回的链表结果赋给beautyList beautyList = pbp.parse(is); } catch (Exception e) { e.printStackTrace(); } for (Beauty b : beautyList) { result = b.toString(); //看Beauty.java文件,arr[0]是域名后辍,arr[1]就是主机名 arr=result.split("==="); //在JAVA中,判断字符串相等要用equals,而不是像其它程序那样用==,习惯害死人 if(getTLD(domain).equals(arr[0].toString())){ serv =arr[1].toString(); break; } } return serv; } //子线程,当接收到WHOIS信息就关半那个提示框 private void mHandler(final String strname) { Thread thread = new Thread() { @Override public void run() { Message message = handler2.obtainMessage(); message.arg1 = 1; message.obj = getwhois(strname).toString(); handler2.sendMessage(message); pd.dismiss();// 关闭ProgressDialog } }; thread.start(); thread = null; } //更新UI final Handler handler2 = new Handler() { @Override public void handleMessage(Message msg) { tv1.setText(String.valueOf(msg.obj.toString())); } }; //用Socket连接到WHOIS服务器获取信息 private String getwhois(String domain) { try { //获取xml里的whois地址 String whoisaddress = get_whois_xml_server(domain); Log.i("whois_server=======",whoisaddress.toString()); //创建socket,并指定主机和端口 Socket socket = new Socket(whoisaddress, DEFAULT_PORT); String lineSeparator = "\r\n"; PrintWriter out = new PrintWriter(socket.getOutputStream()); out.println(domain); out.flush(); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); StringBuilder ret = new StringBuilder(); String line; while ((line = in.readLine()) != null) { ret.append(line + lineSeparator); } socket.close(); //Log.i("WHOIS_info======:", ret.toString()); return ret.toString(); } catch (IOException e) { e.printStackTrace(); return e.getMessage().toString(); } } //获取域名后辍 private String getTLD(String domain) { final int index; return (domain == null || (index = domain.lastIndexOf('.') + 1) < 1) ? domain : (index < (domain.length())) ? domain.substring(index) : ""; } // 读取assets文件 /* private void assetsRead(){ String fileName = "whois.xml"; String ret = ""; try { InputStream is = getResources().getAssets().open(fileName); int len = is.available(); byte []buffer = new byte[len]; is.read(buffer); ret = EncodingUtils.getString(buffer, "utf-8"); is.close(); } catch (Exception e) { e.printStackTrace(); } tv1 = (TextView) findViewById(R.id.tv1); tv1.setText(ret); }*/ @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }
总结:
1、socket 肯定是不能运行在主线程上的,所以要创建一个新线程来运行socket
2、android解析XML好麻烦,不懂的同学请复制网上实例(我是直接从网上复制的) http://www.cnblogs.com/devinzhang/archive/2012/01/16/2323668.html
3、按习惯我都是把XML直接转成datatable,,,,可JAVA没有datatable,很郁闷,很不习惯。
4、不知为何,,,JAVA要不断的try,否则编译不过
项目源文件下载:http://files.cnblogs.com/files/LCX/whois.rar
APP下载:http://files.cnblogs.com/files/LCX/whois.apk
有兴趣的同学可以下载到真机测试