Android网络编程

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

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;  }  
}


转载于:https://my.oschina.net/xiahuawuyu/blog/67818

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/302420.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mac 启动mysql多实例_实践:mysql单机多实例部署(mac)

背景&#xff1a;在自己电脑搭建或测试分布式服务框架时&#xff0c;经常会用多个数据库实例模拟多个环境的情况&#xff0c;因此我把搭建多实例mysql的过程记录下来&#xff0c;方便互相学习和沟通。1.搭建环境1) mac 电脑&#xff0c;版本 10.15.62) mysql版本 8.0.202.搭建…

毫无疑问的是.NET 在信创常用软件适配清单之中

2020年8月份写了一篇文章《.NET Core也是国产化信息系统开发的重要选项》&#xff0c; 这又过去了大半年了&#xff0c;在信创领域发生了很大的变化&#xff0c;今天写这篇文章主要是想从信创常用软件适配清单 看一看.NET 在信创里面的情况。信创常用软件适配清单 是由中国电子…

学习Python编程的19个资源

全世界只有3.14 % 的人关注了数据与算法之美用Python编写代码一点都不难&#xff0c;事实上它一直被赞誉为最容易学的编程语言。如果你准备学习web开发&#xff0c; Python是一个不错的开始&#xff0c;甚至想做游戏的话&#xff0c;用Python来开发游戏的资源也有很多。这是快速…

读《精益商业思维》

五一假期读了程浩的《精益商业思维》&#xff0c;程浩是迅雷的联合创始人之一&#xff0c;现在是职业投资人&#xff0c; 全篇从创业者的角度&#xff0c;也从投资人的角度解析了创业的方法论。书中有大量的互联网公司的案例&#xff0c;都是我们耳熟能详的一些互联网企业&…

mysql中两根竖线什么意思_五线谱中两根竖线是什么意思?

五线谱中的竖线叫做终止线&#xff0c;写在乐曲结束处的右边一条略粗的双纵线。音乐总是由强拍和弱拍交替进行的&#xff0c;这种交替不能杂乱无章、任意安排&#xff0c;而是按照一定的规律构成最小的节拍组织一小节&#xff0c;然后以此为基础循环往复。比如&#xff0c;当两…

三张图读懂机器学习 :基本概念、五大流派与九种常见算法

全世界只有3.14 % 的人关注了数据与算法之美机器学习正在进步&#xff0c;我们似乎正在不断接近我们心中的人工智能目标。语音识别、图像检测、机器翻译、风格迁移等技术已经在我们的实际生活中开始得到了应用&#xff0c;但机器学习的发展仍还在继续&#xff0c;甚至被认为有可…

go 切片取最后一个元素_深挖 Go 之 forrange 排坑指南

今年做个 Dig101 系列&#xff0c;挖一挖技术背后的故事。Dig101: dig more, simplified more and know moregolang 常用的遍历方式&#xff0c;有两种&#xff1a;for 和 for-range。而 for-range 使用中有些坑常会遇到&#xff0c;今天我们一起来捋一捋。文章目录0x01 遍历取…

SqlServer SqlParser 介绍及基本使用

SqlServer SqlParser 介绍及使用示例Intro最近发现在 Nuget 上有一个 SqlServer 的 SqlParser&#xff0c;利用 SqlParser 我们做到可以解析 SQL 的每一部分 &#xff0c;nuget 包是公开的&#xff0c;可以拿来即用&#xff0c;只是缺少使用示例&#xff0c;很多功能需要自己去…

如何使用TensorFlow玩转深度学习?

自 2015 年 11 月 9 号发布之后&#xff0c;TensorFlow 逐渐成为人工智能领域最广泛运用的深度学习框架。那么TensorFlow框架到底是什么&#xff1f;TensorFlow 是一个大规模机器学习的开源框架&#xff0c;提供了多种深度神经网络的支持。不仅 Google 在自己的产品线使用 Tens…

大学,我是怎么边学编程边赚钱的?

我是如何在大学时就靠编程赚钱的&#xff1f;大家好&#xff0c;我是鱼皮&#xff0c;前段时间看到一位朋友的问题&#xff1a;穷极客一枚&#xff0c;正值大学&#xff0c;很想自己解决生活问题&#xff0c;不再向父母要钱。计算机相关专业&#xff0c;喜欢编程&#xff0c;觉…

独占设备的分配与回收_灵魂拷问:Java对象的内存分配过程是如何保证线程安全的?...

点击上方“linkoffer”&#xff0c;选择关注公众号高薪职位第一时间送达作者 l HollisJVM内存结构&#xff0c;是很重要的知识&#xff0c;相信每一个静心准备过面试的程序员都可以清楚的把堆、栈、方法区等介绍的比较清楚。上图&#xff0c;是一张在作者根据《Java虚拟机规范(…

Wtm Blazor来了!

快点关注我们吧BlazorBlazor从诞生到现在也有一段时间了&#xff0c;之前一直在观望&#xff0c;从dotnet5中Blazor的进步以及即将到来的dotnet6中的规划来看&#xff0c;Blazor的前途还是光明的&#xff0c;所以WtmBlazor来了&#xff01;Blazor的优势后台代码的高复用率。不论…

[Netty实践] 简单WebSocket服务实现

目录 一、介绍 二、依赖导入 三、基础类准备 四、Handler实现 五、WebSocketChannelInitializer实现 六、WebSocketServer实现 七、前端实现 八、测试 九、参考链接 一、介绍 关于WebSocket此处不进行过多介绍&#xff0c;本章主要着重通过Netty实现WebSocket通信服务…

这个爱喝酒的酒鬼可真是让人操碎了心

全世界只有3.14 % 的人关注了数据与算法之美最近又有一道数学难题重现江湖&#xff0c;在数学的江湖上掀起了腥风血雨。为了这道题&#xff0c;武林中也衍生出了三个门派&#xff01;分别有75%派&#xff0c;90%派&#xff0c;50%派。打完这么多派字&#xff0c;怎么莫名有点饿…

这几家5月还在急招.NET,都是30k以上!

最近常看到鼓吹财务自由的文章&#xff0c;甚至将5月18号(谐音&#xff1a;我要发)都演变成了财务自由日&#xff0c;号称通过理财快速达到财务自由... 荒谬&#xff01;财务自由本身就是伪命题&#xff0c;更不提啥小白理财就变身财务自由了&#xff0c;完全收智商税&#xff…

mysql binlog oplog_mongodb 学习之oplog

背景&#xff1a;原来一个同事问我主从mongodb数据库为什么数据差距很大,我让他察看一下两边有啥不一样&#xff0c;发现主的local库有13G从却很小&#xff0c;进入local之后du发现有一个collection前缀的文件有13g&#xff0c;说明是local数据库中一个集合太大了&#xff0c;推…

WPF实现Map加载

WPF开发者QQ群&#xff1a; 340500857 欢迎转发、分享、点赞&#xff0c;谢谢大家~。 接着上一篇效果预览&#xff1a;一、MainWindow.xaml代码如下&#xff1a;<Window x:Class"WpfBingMap.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml…

和哪个专业的男生谈恋爱最惨?

全世界只有3.14 % 的人关注了数据与算法之美艺术类专业艺术类的男生是最懂女孩们的心思&#xff0c;也是最浪漫的一类人群&#xff0c;弹琴唱歌跳舞画画样样擅长。这类男生所做的一切&#xff0c;皆可以把女孩们的心俘获到。但是呢&#xff0c;这类男孩的身边总是会有很多玩的很…

只能选择分卷文件的第一部分。_为机器学习模型选择正确的度量评估(第一部分)...

作者&#xff1a;Alvira Swalin编译&#xff1a;ronghuaiyang导读对不同的应用场景&#xff0c;需要不同的模型&#xff0c;对于不同的模型&#xff0c;需要不同的度量评估方式。本系列的第一部分主要关注回归的度量在后现代主义的世界里&#xff0c;相对主义的各种形式一直是最…

多项式乘法与快速傅里叶变换

全世界只有3.14 % 的人关注了数据与算法之美第一节、多项式乘法我们知道&#xff0c;有两种表示多项式的方法&#xff0c;即系数表示法和点值表示法。什么是系数表示法?所谓的系数表示法&#xff0c;举个例子如下图所示&#xff0c;A&#xff08;x&#xff09;6x^3 7x^2 - 10…