`
xiduxiaoyu
  • 浏览: 159410 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

【转】Android 实现联网(二)——java.net漫游

阅读更多

相比较C++,JAVA在网络编程方面的优势是不言而喻的。想当初学习MFC网络方面的痛苦,现在看到java.net包中的类,感觉轻松多了。说 点题外话:在C++网络方面可以推荐给大家一个很好的开源项目POCO库,这个库在网络方面的功能只能用: 那是相当强大,有兴趣的可以去学习下。

Android 实现联网(一)——package说明篇幅中 ,我们简要介绍了Android 网络方面的包,本篇幅我们漫游java.net包,按照网络方面的知识来逐步学习java网络编程,并给大家介绍一些小例子,边学习边写代码。

首先,IP地址

IP地址估计大家都明白,我们就直接来看java.net中的类吧。
InetAddress

 

详细介绍就不多说了,看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

在使用getByAddress ()函数的时候就必须捕获UnknownHostException这个异常。

然后,URL地址

URL-class

看到这个类,不仅让我想起来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类

socket-class

套接字通信的基本思想比较简单,客户端建立一个到服务器的链接,一旦连接建立了,客户端就可以往套接字里写入数据,并向服务器发送数据;反过来,服 务器读取客户端写入套接字里的数据。几乎就那样简单,也许细节会复杂些,但是基本思想就这么简单。举个简单的例子如下:

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,如下图所示:

URLConnection-class
使用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的一个完整流程如下,有兴趣的可以看下:

HTTP-Header

总结说明

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics