相比较C++,JAVA在网络编程方面的优势是不言而喻的。想当初学习MFC网络方面的痛苦,现在看到java.net包中的类,感觉轻松多了。说 点题外话:在C++网络方面可以推荐给大家一个很好的开源项目POCO库,这个库在网络方面的功能只能用: 那是相当强大,有兴趣的可以去学习下。
在Android 实现联网(一)——package说明篇幅中 ,我们简要介绍了Android 网络方面的包,本篇幅我们漫游java.net包,按照网络方面的知识来逐步学习java网络编程,并给大家介绍一些小例子,边学习边写代码。
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这个异常。
看到这个类,不仅让我想起来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()); } }
套接字通信的基本思想比较简单,客户端建立一个到服务器的链接,一旦连接建立了,客户端就可以往套接字里写入数据,并向服务器发送数据;反过来,服 务器读取客户端写入套接字里的数据。几乎就那样简单,也许细节会复杂些,但是基本思想就这么简单。举个简单的例子如下:
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 (一种用于监听来自客户端的连接的套接字),在这里就不一一说 明。
在一般情况下,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在这方面就封装的不这么好,使用起来比较麻烦,对初学者来说理解起来比较困难。