【转】Android 实现联网(二)——java.net漫游
相比较C++,JAVA在网络编程方面的优势是不言而喻的。想当初学习MFC网络方面的痛苦,现在看到java.net包中的类,感觉轻松多了。说点题外话:在C++网络方面可以推荐给大家一个很好的开源项目POCO库,这个库在网络方面的功能只能用:那是相当强大,有兴趣的可以去学习下。
在Android 实现联网(一)——package说明篇幅中,我们简要介绍了Android 网络方面的包,本篇幅我们漫游java.net包,按照网络方面的知识来逐步学习java网络编程,并给大家介绍一些小例子,边学习边写代码。
首先,IP地址IP地址估计大家都明白,我们就直接来看java.net中的类吧。
?
详细介绍就不多说了,看2个简单的小例子如下:
String GetHostAddress (String strHostName){InetAddress address = null;try{address = InetAddress.getByName (strHostName);}catch(UnknownHostException e){System.out.println(e.getMessage());}return InetAddress.getHostAddress () ;}void GetAllIP (String strHostName){InetAddress[] add = null;try{add = InetAddress.getAllByName (strHostName);for(int i=0;i<addr.lenth;i++)System.out.println(addr[i]);}catch(UnknownHostException e){System.out.println(e.getMessage());}}?上面2个小例子很简单,但是有一点必须说明的,在写网络编程方面的,必须注意异常的捕获,网络异常是比较正常的现象,比如说当前网络繁忙,网络连接超时,更是“家常便饭”。因此在写网络编程的时候,必须养成捕获异常的好习惯,查看完函数说明后,必须要注意网络异常的说明。例如下图中的说明:

在使用getByAddress()函数的时候就必须捕获UnknownHostException这个异常。
然后,URL地址
看到这个类,不仅让我想起来MFC在网络编程方面的复杂,一个
BOOL AFXAPI AfxParseURL(LPCTSTR pstrURL, DWORD& dwServiceType,CString& strServer, CString& strObject, INTERNET_PORT& nPort);
函数,让人看起来就感觉不知道在说明,在编写MFC网络编程方面的时候一般都会自己写个URL类,而在JAVA中的直接提供了这个类,让初学者看起来明白多了。一个简单的例子如下:
Void EasyURL (String strURL){URL url = new URL(strURL);try{InputStream html = url.openStream ();int c;do{c= html.read();cf(c!=-1) System.out.println((char)c);}while(c!=-1)}catch(IOException e){System.out.println(e.getMessage());}}??
其次,套接字socket类
套接字通信的基本思想比较简单,客户端建立一个到服务器的链接,一旦连接建立了,客户端就可以往套接字里写入数据,并向服务器发送数据;反过来,服务器读取客户端写入套接字里的数据。几乎就那样简单,也许细节会复杂些,但是基本思想就这么简单。举个简单的例子如下:
void WebPing (String strURL){try{InetAddress addr;Socket sock = new Socket(strURL,80);Addr = sock.getInetAddress ();System.out.println(“Connceted to”+addr);Sock.close();}catch(IOException e){System.out.println(e.getMessage());}}??
如果使用本地主机(localhost)来测试这个程序,输出结果如下:
Connceted to localhost/127.0.0.1
InetAddress.toString()的隐含调用(println调用)自动输出主机名和IP地址。
至于其他套接字:DatagramSocket(通过UDP通信的套接字),MulticastSocket(一种用于多点传送的套接字)以及ServerSocket(一种用于监听来自客户端的连接的套接字),在这里就不一一说明。
最后,URLConncetion类在一般情况下,URL这个类就可以满足我们的需求,但是在一些特殊情况下,比如HTTP数据头的传递,这个时候我们就得使用URLConncetion,如下图所示:

使用URLConncetion,我们对网络的控制就增加了很多,举个例子如下:
void SendRequest (String strURL){URL url = URL(strURL);HttpURLConnection conn = (HttpURLConnection)url.openConnection ();conn.setDoInput (true);conn.setDoOutput (true);conn.setRequestProperty (“Content-type”,”application/xxx”);conn.connect ();System.out.println(Conn.getResponseMessage ());InputMessage is = Conn.getIputStream();int c;do{c = is.read();if(c!=-1) System.out.println((char)c);}while(c!=-1)}??
关于HTTP数据头方面的知识,前段时间在编写流媒体下载的时候学习了下HTTP数据头的结构,下面列举一个HTTP request/response的一个完整流程如下,有兴趣的可以看下:

通过类图并结合具体的例子,我们就把java.net包漫游的一遍,这不得不说JAVA在网络编程方面的确很简单。我个人觉得JAVA在网络方面的设计更加符合我们在学习网络课程中学习的理论知识,而MFC在这方面就封装的不这么好,使用起来比较麻烦,对初学者来说理解起来比较困难。