Android中网络编程
来源:互联网 发布:php 魔术方法 get set 编辑:程序博客网 时间:2024/06/06 21:50
在Android中几种网络编程的方式:
(1)针对TCP/IP的Socket、ServerSocket
(2)针对UDP的DatagramSocket、DatagramPackage。这里需要注意的是,考虑到Android设备通常是手持终端,IP都是随着上网进行分配的。不是固定的。因此开发也是有一点与普通互联网应用有所差异的。
(3)针对直接URL的HttpURLConnection
(4)Google集成了Apache HTTP客户端,可使用HTTP进行网络编程。针对HTTP,Google集成了Appache Http core和httpclient 4版本,因此特别注意Android不支持httpclient 3.x系列,而且目前并不支持Multipart(MIME),需要自行添加httpmime.jar
(5)使用Web Service。Android可以通过开源包如jackson去支持Xmlrpc和Jsonrpc,另外也可以用Ksoap2去实现Webservice
(6) 直接使用WebView视图组件显示网页。基于WebView 进行开发,Google已经提供了一个基于chrome-lite的Web浏览器,直接就可以进行上网浏览网页。
一、我们先来看第一种,针对TCP/IP Socket、ServerSocket的形式。
TCP/IP是一种协议,是一种面向连接的、可靠的协议。Socket仅仅是对TCP、UDP网络接口的封装,不涉及上层协议。TCP、UDP传输特性不同,分别适用于不同类型的应用层协议,其中TCP有连接,延时较长,能保证服务质量;UDP无连接,需要应用程序进行数据分包、延时短,效率高,数据包可能丢失或到达对端发生顺序混乱。在Socket之上可以实现这些RFC标准的应用层协议,也可以自定义实现私有的应用层协议。
在JAVA编程中, 经常使用java.net和javax.net包来开发socket程序,下面列出所有常用的类,并简单介绍。关于详细的信息请参看JAVA文档。
Java.net
Java.net.Socket 客户端连接使用的TCP socket
Java.net.DatagramSocket 客户端和服务端共同使用的UDP socket
Java.net.ServerSocket 服务端TCP socket监听端口
Java.netInetAddress IP地址封装类
Java.net.DataGramPacket 通过DatagramSocket收发的数据包的封装类,包括数据和对端的IP地址、UDP端口
Javax.net
Javax.net.SocketFactory 客户端连接使用的T CP socket
Javax.net.ServerSocketFactory 服务端TCP socket监听端口
Javax.net.ssl.SSLSocketFactory SSL客户端Socket构造器
Javax.net.ssl.SSLServerFactory SSL服务端监听Socket构造器
示例代码: android+socket编程实例.rar
二、针对UDP的DatagramSocket、DatagramPackage
1.对于UDP服务端,首先启动侦听服务,然后得到数据包进行处理,组后根据获得数据包进行反馈。
2.UDP socket没有连接的概念,因此构造完成的DatagramSocket不会发出向对端的网络连接请求,在每一个发送的UDP数据包中包含目的地址和端口。因为UDP数据不会在对端进行重新组包,因此一次发送的数据长度必须加以限制。Socket.send(outputPacket);用于发送一个数据包;socket.receive(inputPacket);用于接收一个数据包。
示例代码:
服务器端:
public class UDPServer{
public static void main(String[] args) throws Exception{
DatagramSocket udpSocket = new DatagramSocket(8000);
while(true){
try{
// UDP数据读取
DatagramPacket packet = new DatagramPacket(new byte[512],512);
udpSocket.receive(packet);
String msg = new String(packet.getData()), 0,packet.getLength());
System.out.println(msg);
if(msg.equals("exit")){
break;
}
// UDP数据发送
SimpleDateFormat f = new SimpleDateFormat("MMM dd,yyyy kk:mm:ss");
String time = "现在的时间是:" + f.format(new Date());
packet.setData(time.getBytes());
udpSocket.send(packet);
}catch(Exception e){
e.printStackTrace();
}
}
udpSocket.close();
}
}
客户端:
public void client(){
InetAddress remoteIP;
try {
remoteIP = InetAddress.getByName("localhost");
DatagramSocket socket = new DatagramSocket();
} catch (UnknownHostException e1) {
e1.printStackTrace();
}
BufferedReader wt = new BufferedReader (new InputStreamReader(System.in));
System.out.println("input one line ,user \"exit\" to quit the server ");
while(true){
try{
// 读取输入
String str = wt.readLine();
byte[] outputData = str.getBytes();
// UDP socket 数据发送
DatagramPacket outputPacket = new DatagramPacket(outputData,outputData.length,remoteIP,8000);
socket.send(outputPacket);
if(str.equals("exit")){
//udp 数据读取
DatagramPacket inputPacket = new DatagramPacket(new byte[512],512);
socket.receive(inputPacket);
System.out.println(new String(inputPacket.getData(),0,inputPacket.getLength()));
}
}catch(Exception e){
e.printStackTrace();
}
}
socket.close();
}
三、针对直接URL的HttpURLConnection
这个就是把请求的方式从HttpClient换成HttpURLConnection就可以了。没什么可以说的,自己看看吧。
示例代码:无
四、Google集成了Apache HTTP客户端,可使用HTTP进行网络编程
这个不多说了,网络编程,必须会的。自己看代码吧。服务端我使用三种方式:S2SH、只用Struts2、Servlet。客户端就一种,只不过换个请求的URL。服务端和客户端交互使用了两种方式:XML、JSON,目前开放平台返回的数据都是支持这两种数据格式的。所以我也实现了这两种数据格式。其实还有一种格式,就是google的protocal buffer,这种形式在国内用的人比较少,我也没弄,感兴趣的同学看我提供的文档,自己研究吧。注意把里面的IP换成自己电脑的IP地址。
示例代码:
服务端:ServletTest1.rar、StrAnd.rar、WebAndroid.rar
客户端:WebAndroidClient.rar
参考网址:
http://www.cnblogs.com/zhangdong ... /04/19/2020688.html
http://blog.csdn.net/woshisap/article/details/6621571
http://www.360doc.com/content/11/0521/01/4154133_118259561.shtml
注意:在只使用Struts2的服务器端,可以这么配置:
<package name="struts-main" extends="json-default" >
<action name="*UserAction" class="userAction" method="{1}">
<result type="json"></result>
</action>
</package>
也可以这么配置:
<package name="struts-main" extends="struts-default" >
<action name="*UserAction" class="userAction" method="{1}">
<result name="register">/WEB-INF/page/register.jsp</result>
<result name="save">/WEB-INF/page/index.jsp</result>
</action>
</package>
但是其实返回数据的时候都是封装JSON字符串,没用到第一种形式的配置的功能。据说,用第一种配置方式,struts2可以自动把返回的数据封装成JSON字符串的形式,但是我没测试成功。。。。我返现返回什么格式还是什么格式,并没有把数据自动封装成JSON返回。
在使用S2SH的服务端,就不能用第一种方式配置。只能用第二种方式,然后服务端封装JSON返回客户端。如果用第一种方式配置,就会发生404错误。无法找到服务器端。
在使用Servlet的服务端,可以通过下面这种方式设置返回类型,但是其实没用,你设置了,它也不返回。你只能自己封装XML文件或者JSON字符串,然后返回。
response.setContentType("application/json;charset=utf-8");
(5)使用Web Service
我之前只听说过什么事webservice,因此主要是参考下面文章实现的DEMO,他给出了一些实例代码,不全,我给基本补全了。显示天气信息我都在LOG输出了,没有显示在界面上,如果大家觉得不爽,可以把信息直接显示在界面上就可以了。因为我被这个问题困扰了2天,弄的很崩溃,所以就没继续弄。大家自己看吧。
那么什么是webService呢?,它是一种基于SAOP协议的远程调用标准,通过webservice可以将不同操作系统平台,不同语言,不同技术整合到一起。在Android中,第三方公司提供了基于webservice的jar包:ksoap2-android-assembly-2.5.2-jar-with-dependencies.jar
http://www.cnblogs.com/zhangdong ... /04/19/2020688.html
http://www.cnblogs.com/ghj1976/archive/2011/04/26/2028904.html
示例代码:SoapAndroidTeset.rar、sserEx09.rar
(6) 直接使用WebView视图组件显示网页
这就是使用webview显示网页的问题,比较容易,大家自己看吧。我就不贴实例代码了。
(1)针对TCP/IP的Socket、ServerSocket
(2)针对UDP的DatagramSocket、DatagramPackage。这里需要注意的是,考虑到Android设备通常是手持终端,IP都是随着上网进行分配的。不是固定的。因此开发也是有一点与普通互联网应用有所差异的。
(3)针对直接URL的HttpURLConnection
(4)Google集成了Apache HTTP客户端,可使用HTTP进行网络编程。针对HTTP,Google集成了Appache Http core和httpclient 4版本,因此特别注意Android不支持httpclient 3.x系列,而且目前并不支持Multipart(MIME),需要自行添加httpmime.jar
(5)使用Web Service。Android可以通过开源包如jackson去支持Xmlrpc和Jsonrpc,另外也可以用Ksoap2去实现Webservice
(6) 直接使用WebView视图组件显示网页。基于WebView 进行开发,Google已经提供了一个基于chrome-lite的Web浏览器,直接就可以进行上网浏览网页。
一、我们先来看第一种,针对TCP/IP Socket、ServerSocket的形式。
TCP/IP是一种协议,是一种面向连接的、可靠的协议。Socket仅仅是对TCP、UDP网络接口的封装,不涉及上层协议。TCP、UDP传输特性不同,分别适用于不同类型的应用层协议,其中TCP有连接,延时较长,能保证服务质量;UDP无连接,需要应用程序进行数据分包、延时短,效率高,数据包可能丢失或到达对端发生顺序混乱。在Socket之上可以实现这些RFC标准的应用层协议,也可以自定义实现私有的应用层协议。
在JAVA编程中, 经常使用java.net和javax.net包来开发socket程序,下面列出所有常用的类,并简单介绍。关于详细的信息请参看JAVA文档。
Java.net
Java.net.Socket 客户端连接使用的TCP socket
Java.net.DatagramSocket 客户端和服务端共同使用的UDP socket
Java.net.ServerSocket 服务端TCP socket监听端口
Java.netInetAddress IP地址封装类
Java.net.DataGramPacket 通过DatagramSocket收发的数据包的封装类,包括数据和对端的IP地址、UDP端口
Javax.net
Javax.net.SocketFactory 客户端连接使用的T CP socket
Javax.net.ServerSocketFactory 服务端TCP socket监听端口
Javax.net.ssl.SSLSocketFactory SSL客户端Socket构造器
Javax.net.ssl.SSLServerFactory SSL服务端监听Socket构造器
示例代码: android+socket编程实例.rar
二、针对UDP的DatagramSocket、DatagramPackage
1.对于UDP服务端,首先启动侦听服务,然后得到数据包进行处理,组后根据获得数据包进行反馈。
2.UDP socket没有连接的概念,因此构造完成的DatagramSocket不会发出向对端的网络连接请求,在每一个发送的UDP数据包中包含目的地址和端口。因为UDP数据不会在对端进行重新组包,因此一次发送的数据长度必须加以限制。Socket.send(outputPacket);用于发送一个数据包;socket.receive(inputPacket);用于接收一个数据包。
示例代码:
服务器端:
public class UDPServer{
public static void main(String[] args) throws Exception{
DatagramSocket udpSocket = new DatagramSocket(8000);
while(true){
try{
// UDP数据读取
DatagramPacket packet = new DatagramPacket(new byte[512],512);
udpSocket.receive(packet);
String msg = new String(packet.getData()), 0,packet.getLength());
System.out.println(msg);
if(msg.equals("exit")){
break;
}
// UDP数据发送
SimpleDateFormat f = new SimpleDateFormat("MMM dd,yyyy kk:mm:ss");
String time = "现在的时间是:" + f.format(new Date());
packet.setData(time.getBytes());
udpSocket.send(packet);
}catch(Exception e){
e.printStackTrace();
}
}
udpSocket.close();
}
}
客户端:
public void client(){
InetAddress remoteIP;
try {
remoteIP = InetAddress.getByName("localhost");
DatagramSocket socket = new DatagramSocket();
} catch (UnknownHostException e1) {
e1.printStackTrace();
}
BufferedReader wt = new BufferedReader (new InputStreamReader(System.in));
System.out.println("input one line ,user \"exit\" to quit the server ");
while(true){
try{
// 读取输入
String str = wt.readLine();
byte[] outputData = str.getBytes();
// UDP socket 数据发送
DatagramPacket outputPacket = new DatagramPacket(outputData,outputData.length,remoteIP,8000);
socket.send(outputPacket);
if(str.equals("exit")){
//udp 数据读取
DatagramPacket inputPacket = new DatagramPacket(new byte[512],512);
socket.receive(inputPacket);
System.out.println(new String(inputPacket.getData(),0,inputPacket.getLength()));
}
}catch(Exception e){
e.printStackTrace();
}
}
socket.close();
}
三、针对直接URL的HttpURLConnection
这个就是把请求的方式从HttpClient换成HttpURLConnection就可以了。没什么可以说的,自己看看吧。
示例代码:无
四、Google集成了Apache HTTP客户端,可使用HTTP进行网络编程
这个不多说了,网络编程,必须会的。自己看代码吧。服务端我使用三种方式:S2SH、只用Struts2、Servlet。客户端就一种,只不过换个请求的URL。服务端和客户端交互使用了两种方式:XML、JSON,目前开放平台返回的数据都是支持这两种数据格式的。所以我也实现了这两种数据格式。其实还有一种格式,就是google的protocal buffer,这种形式在国内用的人比较少,我也没弄,感兴趣的同学看我提供的文档,自己研究吧。注意把里面的IP换成自己电脑的IP地址。
示例代码:
服务端:ServletTest1.rar、StrAnd.rar、WebAndroid.rar
客户端:WebAndroidClient.rar
参考网址:
http://www.cnblogs.com/zhangdong ... /04/19/2020688.html
http://blog.csdn.net/woshisap/article/details/6621571
http://www.360doc.com/content/11/0521/01/4154133_118259561.shtml
注意:在只使用Struts2的服务器端,可以这么配置:
<package name="struts-main" extends="json-default" >
<action name="*UserAction" class="userAction" method="{1}">
<result type="json"></result>
</action>
</package>
也可以这么配置:
<package name="struts-main" extends="struts-default" >
<action name="*UserAction" class="userAction" method="{1}">
<result name="register">/WEB-INF/page/register.jsp</result>
<result name="save">/WEB-INF/page/index.jsp</result>
</action>
</package>
但是其实返回数据的时候都是封装JSON字符串,没用到第一种形式的配置的功能。据说,用第一种配置方式,struts2可以自动把返回的数据封装成JSON字符串的形式,但是我没测试成功。。。。我返现返回什么格式还是什么格式,并没有把数据自动封装成JSON返回。
在使用S2SH的服务端,就不能用第一种方式配置。只能用第二种方式,然后服务端封装JSON返回客户端。如果用第一种方式配置,就会发生404错误。无法找到服务器端。
在使用Servlet的服务端,可以通过下面这种方式设置返回类型,但是其实没用,你设置了,它也不返回。你只能自己封装XML文件或者JSON字符串,然后返回。
response.setContentType("application/json;charset=utf-8");
(5)使用Web Service
我之前只听说过什么事webservice,因此主要是参考下面文章实现的DEMO,他给出了一些实例代码,不全,我给基本补全了。显示天气信息我都在LOG输出了,没有显示在界面上,如果大家觉得不爽,可以把信息直接显示在界面上就可以了。因为我被这个问题困扰了2天,弄的很崩溃,所以就没继续弄。大家自己看吧。
那么什么是webService呢?,它是一种基于SAOP协议的远程调用标准,通过webservice可以将不同操作系统平台,不同语言,不同技术整合到一起。在Android中,第三方公司提供了基于webservice的jar包:ksoap2-android-assembly-2.5.2-jar-with-dependencies.jar
http://www.cnblogs.com/zhangdong ... /04/19/2020688.html
http://www.cnblogs.com/ghj1976/archive/2011/04/26/2028904.html
示例代码:SoapAndroidTeset.rar、sserEx09.rar
(6) 直接使用WebView视图组件显示网页
这就是使用webview显示网页的问题,比较容易,大家自己看吧。我就不贴实例代码了。
阅读全文
1 0
- Android中网络编程
- Android网络编程(中)--- HttpClient
- Android开发中网络编程与常见功能优化总结
- Android开发中网络编程与常见功能优化总结
- Android网络编程中关于AsyncHttpClient获取cookie的问题
- Android开发中网络编程与常见功能优化总结
- Android开发中Web Service网络编程研究
- Android开发中网络编程与常见功能优化总结
- Android中Retrofit+OkHttp进行HTTP网络编程的使用指南
- Android 的网络编程
- Android 的网络编程
- Android 的网络编程
- Android 的网络编程
- Android 说说网络编程
- Android 的网络编程
- Android网络编程
- 探讨 Android 网络编程
- Android网络编程
- linux 安装phantomjs
- sigmoid和tanh求导的最终结果,以及Sigmoid函数与损失函数求导
- 递归和循环优缺点详解
- iOS 11种键盘布局总结
- c# var
- Android中网络编程
- 数据库读写分离 spring-common.xml和jdbcConfig.properties配置
- linux 压缩软链接引发的问题
- iOS UITextField 显示银行卡格式
- kangle建站出现403 Forbidden You don't have permission to browse.
- 文章标题
- PHP数组
- LeetCode 306 addtive number
- c++动态联编与静态联编