android平台有三种网络接口可以使用,他们分别是:java.net.*(标准java接口)、org.apache接口和android.net.*(android网络接口)。下面分别介绍这些接口的功能和作用。
1.标准java接口
java.net.*提供与联网有关的类,包括流、数据包套接字(socket)、internet协议、常见http处理等。比如:创建url,以及urlconnection/httpurlconnection对象、设置链接参数、链接到服务器、向服务器写数据、从服务器读取数据等通信。这些在java网络编程中均有涉及,我们看一个简单的socket编程,实现服务器回发客户端信息。
服务端:
public class server implements runnable{ @override public void run() { socket socket = null; try { serversocket server = new serversocket(18888); //循环监听客户端链接请求 while(true){ system.out.println("start..."); //接收请求 socket = server.accept(); system.out.println("accept..."); //接收客户端消息 bufferedreader in = new bufferedreader(new inputstreamreader(socket.getinputstream())); string message = in.readline(); //发送消息,向客户端 printwriter out = new printwriter(new bufferedwriter(new outputstreamwriter(socket.getoutputstream())),true); out.println("server:" + message); //关闭流 in.close(); out.close(); } } catch (ioexception e) { e.printstacktrace(); }finally{ if (null != socket){ try { socket.close(); } catch (ioexception e) { e.printstacktrace(); } } } } //启动服务器 public static void main(string[] args){ thread server = new thread(new server()); server.start(); } }
客户端,mainactivity
public class mainactivity extends activity { private edittext edittext; private button button; /** called when the activity is first created. */ @override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); edittext = (edittext)findviewbyid(r.id.edittext1); button = (button)findviewbyid(r.id.button1); button.setonclicklistener(new onclicklistener() { @override public void onclick(view v) { socket socket = null; string message = edittext.gettext().tostring()+ "\r\n" ; try { //创建客户端socket,注意:不能用localhost或127.0.0.1,android模拟器把自己作为localhost socket = new socket("<span style="font-weight: bold;">10.0.2.2</span>",18888); printwriter out = new printwriter(new bufferedwriter(new outputstreamwriter (socket.getoutputstream())),true); //发送数据 out.println(message); //接收数据 bufferedreader in = new bufferedreader(new inputstreamreader(socket.getinputstream())); string msg = in.readline(); if (null != msg){ edittext.settext(msg); system.out.println(msg); } else{ edittext.settext("data error"); } out.close(); in.close(); } catch (unknownhostexception e) { e.printstacktrace(); } catch (ioexception e) { e.printstacktrace(); } finally{ try { if (null != socket){ socket.close(); } } catch (ioexception e) { e.printstacktrace(); } } } }); } }
布局文件:
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <textview android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <edittext android:layout_width="match_parent" android:id="@+id/edittext1" android:layout_height="wrap_content" android:hint="input the message and click the send button" ></edittext> <button android:text="send" android:id="@+id/button1" android:layout_width="fill_parent" android:layout_height="wrap_content"></button> </linearlayout>
启动服务器:
javac com/test/socket/server.java java com.test.socket.server
运行客户端程序:
结果如图:
注意:服务器与客户端无法链接的可能原因有:
没有加访问网络的权限:<uses-permission android:name="android.permission.internet"></uses-permission>
ip地址要使用:10.0.2.2
模拟器不能配置代理。
2。apache接口
对于大部分应用程序而言jdk本身提供的网络功能已远远不够,这时就需要android提供的apache httpclient了。它是一个开源项目,功能更加完善,为客户端的http编程提供高效、最新、功能丰富的工具包支持。
下面我们以一个简单例子来看看如何使用httpclient在android客户端访问web。
首先,要在你的机器上搭建一个web应用myapp,只有很简单的一个http.jsp
内容如下:
<%@page language="java" import="java.util.*" pageencoding="utf-8"%> <html> <head> <title> http test </title> </head> <body> <% string type = request.getparameter("parameter"); string result = new string(type.getbytes("iso-8859-1"),"utf-8"); out.println("<h1>" + result + "</h1>"); %> </body> </html>
然后实现android客户端,分别以post、get方式去访问myapp,代码如下:
布局文件:
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <textview android:gravity="center" android:id="@+id/textview" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <button android:text="get" android:id="@+id/get" android:layout_width="match_parent" android:layout_height="wrap_content"></button> <button android:text="post" android:id="@+id/post" android:layout_width="match_parent" android:layout_height="wrap_content"></button> </linearlayout>
资源文件:
strings.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">通过按钮选择不同方式访问网页</string> <string name="app_name">http get</string> </resources>
主activity:
public class mainactivity extends activity { private textview textview; private button get,post; /** called when the activity is first created. */ @override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); textview = (textview)findviewbyid(r.id.textview); get = (button)findviewbyid(r.id.get); post = (button)findviewbyid(r.id.post); //绑定按钮监听器 get.setonclicklistener(new onclicklistener() { @override public void onclick(view v) { //注意:此处ip不能用127.0.0.1或localhost,android模拟器已将它自己作为了localhost string uri = "http://192.168.22.28:8080/myapp/http.jsp?parameter=以get方式发送请求"; textview.settext(get(uri)); } }); //绑定按钮监听器 post.setonclicklistener(new onclicklistener() { @override public void onclick(view v) { string uri = "http://192.168.22.28:8080/myapp/http.jsp"; textview.settext(post(uri)); } }); } /** * 以get方式发送请求,访问web * @param uri web地址 * @return 响应数据 */ private static string get(string uri){ bufferedreader reader = null; stringbuffer sb = null; string result = ""; httpclient client = new defaulthttpclient(); httpget request = new httpget(uri); try { //发送请求,得到响应 httpresponse response = client.execute(request); //请求成功 if (response.getstatusline().getstatuscode() == httpstatus.sc_ok){ reader = new bufferedreader(new inputstreamreader(response.getentity().getcontent())); sb = new stringbuffer(); string line = ""; string nl = system.getproperty("line.separator"); while((line = reader.readline()) != null){ sb.append(line); } } } catch (clientprotocolexception e) { e.printstacktrace(); } catch (ioexception e) { e.printstacktrace(); } finally{ try { if (null != reader){ reader.close(); reader = null; } } catch (ioexception e) { e.printstacktrace(); } } if (null != sb){ result = sb.tostring(); } return result; } /** * 以post方式发送请求,访问web * @param uri web地址 * @return 响应数据 */ private static string post(string uri){ bufferedreader reader = null; stringbuffer sb = null; string result = ""; httpclient client = new defaulthttpclient(); httppost request = new httppost(uri); //保存要传递的参数 list<namevaluepair> params = new arraylist<namevaluepair>(); //添加参数 params.add(new basicnamevaluepair("parameter","以post方式发送请求")); try { //设置字符集 httpentity entity = new urlencodedformentity(params,"utf-8"); //请求对象 request.setentity(entity); //发送请求 httpresponse response = client.execute(request); //请求成功 if (response.getstatusline().getstatuscode() == httpstatus.sc_ok){ system.out.println("post success"); reader = new bufferedreader(new inputstreamreader(response.getentity().getcontent())); sb = new stringbuffer(); string line = ""; string nl = system.getproperty("line.separator"); while((line = reader.readline()) != null){ sb.append(line); } } } catch (clientprotocolexception e) { e.printstacktrace(); } catch (ioexception e) { e.printstacktrace(); } finally{ try { //关闭流 if (null != reader){ reader.close(); reader = null; } } catch (ioexception e) { e.printstacktrace(); } } if (null != sb){ result = sb.tostring(); } return result; } }
运行结果如下:
3.android.net编程:
常常使用此包下的类进行android特有的网络编程,如:访问wifi,访问android联网信息,邮件等功能。这里不详细讲。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。
如对本文有疑问, 点击进行留言回复!!
Error running app: Default Activity Not Found
如何用HMS Nearby Service给自己的App添加近距离数据传输功能
BlockChain:2020年7月10日世界人工智能大会WAIC《链智未来 赋能产业区块链主题论坛》(四)
网友评论