【安卓开发】安卓网络编程

article/2025/9/20 21:26:26

目录

  • 一、安卓Socket客户端
  • 二、安卓Socket客户端优化(小车遥控器拓展)
  • 三、Android非UI线程修改空间程序崩溃问题
    • 一种新的解决办法:Handler类(倒计时软件)
  • 四、Android网络接收数据并刷新界面(综合练习)
  • 五、WebView控件之自制浏览器APP

一、安卓Socket客户端

.java

package com.example.ycy;import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}public void handlerMessage(){try {//1.创建客户端套接字,填充ip地址和端口号Socket client = new Socket("192.168.0.15",8888);//2.获取输出流,用来发送数据OutputStream out = client.getOutputStream();String message = "message from Andriod";//4.发送数据//用getBytes()方法将字符串转化为字节数组out.write(message.getBytes());} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public void sendMessage(View v){new Thread(new Runnable() {		//网络线程不能跑在主线程,需要再创建一个线程@Overridepublic void run() {// TODO Auto-generated method stubhandlerMessage();}}).start();}}

.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context=".MainActivity" ><Button android:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="sendMessage"android:text="发送消息"/></RelativeLayout>

效果显示:

在这里插入图片描述

注意:

网络访问不能在主线程(UI线程)中进行,否则程序会崩溃,要创建线程来发起网络访问。



二、安卓Socket客户端优化(小车遥控器拓展)

代码:

package com.example.ycy;import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}public void handlerMessage(final String message){new Thread(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubtry {//1.创建客户端套接字,填充ip地址和端口号Socket client = new Socket("192.168.0.15",8888);//2.获取输出流,用来发送数据OutputStream out = client.getOutputStream();						//4.发送数据//用getBytes()方法将字符串转化为字节数组out.write(message.getBytes());			} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}					}}).start();}public void sendMessage(View v){switch(v.getId()){case R.id.fw:handlerMessage("goForward");break;case R.id.bc:handlerMessage("goBack");break;case R.id.lf:handlerMessage("goLeft");break;case R.id.rt:handlerMessage("goRight");break;}}
}

效果显示:

在这里插入图片描述



三、Android非UI线程修改空间程序崩溃问题

如果我们想要不断刷新修改一个控件(比如文本控件)的内容,我们应该如何做呢?

既然要刷新,就必然会用到 sleep() 方法去睡眠等待刷新时间,但是在之前我们曾经出错过,sleep() 方法不能出现在 UI 线程里,否则程序会崩溃,那么我们就再创建一个线程来刷新修改控件内容:

.java

package com.example.ycy;import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;public class MainActivity extends Activity {public TextView textView;	//关联TextView控件@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);textView = (TextView) findViewById(R.id.textView);	//关联TextView控件}public void changeText(View v){new Thread(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubfor (int i = 0; i < 10; i++) {textView.setText("yangchenyanghandsome");try {Thread.sleep(3000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}).start();}}

.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context=".MainActivity" ><TextViewandroid:id="@+id/textView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/hello_world" /><Buttonandroid:id="@+id/button1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignLeft="@+id/textView"android:layout_below="@+id/textView"android:layout_marginTop="34dp"android:onClick="changeText"android:text="修改文本" /></RelativeLayout>

运行结果:

在这里插入图片描述

我们可以看到,程序又崩溃了。怎么办呢?

一种新的解决办法:Handler类(倒计时软件)

既然再新线程内不能修改控件,那么我们利用 Handler类 去处理 UI 线程和新线程无法处理的业务,就是在新线程中,我们将新线程不能处理的业务封装在重写了的 Handler类 中的 handleMessage() 方法中, 当在新线程中需要执行响应业务的时候,我们通过给 Handler 类的对象发送消息,触发这个事件,让handleMessage() 方法去处理响应的业务,这样就能解决这个问题,这里我们通过应用 Handler类 将以上功能修改为倒计时软件:

.java

package com.example.ycy;import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.TextView;public class MainActivity extends Activity {public TextView textView;	//关联TextView控件public Handler h;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);textView = (TextView) findViewById(R.id.textView);	//关联TextView控件h = new Handler(){	//匿名内部类,UI主线程的家里的电话,接到电话去处理一些其他进程无法处理的事件@Overridepublic void handleMessage(Message msg) {	//区分事件类型// TODO Auto-generated method stubsuper.handleMessage(msg);textView.setText(msg.what+"s");}};}public void changeText(View v){new Thread(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubfor (int i = 10; i >= 0; i--) {Message msg = new Message();	//为了传递参数imsg.what = i;//打电话把UI线程不能处理的事情交给UI线程的Handler去做h.sendMessage(msg);try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}).start();}}

.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context=".MainActivity"android:background="#000000"><TextViewandroid:id="@+id/textView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:textSize="50dp"android:textColor="#ffffff"android:text="10s" /><Buttonandroid:id="@+id/button1"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_centerHorizontal="true"android:onClick="changeText"android:background="#ffffff"android:text="Begin" /></RelativeLayout>

效果显示:

点击 Begin 前:

在这里插入图片描述

点击 Begin 后:

在这里插入图片描述

倒计时完毕:

在这里插入图片描述



四、Android网络接收数据并刷新界面(综合练习)

.java

package com.example.ycy;import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.TextView;public class MainActivity extends Activity {Handler handler;TextView tx;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);tx = (TextView) findViewById(R.id.tx);//这里是关于Handler处理文本框变化的代码handler = new Handler(){@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stubsuper.handleMessage(msg);Bundle b = msg.getData();	//先把Bundle获取String string = b.getString("msg");		//再把b中的msg读出来tx.setText(string);}};}public void handlerMessage(final String message, final Handler h){new Thread(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubtry {//1.创建客户端套接字,填充IP地址和端口号Socket client = new Socket("192.168.0.15",8880);//2.获取输出流,用来发送数据OutputStream out = client.getOutputStream();						//4.发送数据//用getBytes()方法将字符串转化为字节数组out.write(message.getBytes());		//5.接收数据InputStream in = client.getInputStream();byte[] data = new byte[128];int len = 0;len = in.read(data);String str = new String(data, 0, len);Message msg = new Message();	Bundle b = new Bundle();b.putString("msg", str);msg.setData(b);		//把b放在msg中h.sendMessage(msg);		//触发Handler处理机制} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}					}}).start();}public void sendMessage(View v){switch(v.getId()){case R.id.fw:handlerMessage("goForward",handler);break;} 	}   
}

.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#000000"tools:context=".MainActivity" ><Buttonandroid:id="@+id/fw"android:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="sendMessage" android:textColor="#ffffff"android:text="发起网络请求" /><TextView android:id="@+id/tx"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="35dp"android:layout_centerInParent="true"android:textColor="#ffffff"/></RelativeLayout>

效果显示:

在这里插入图片描述



五、WebView控件之自制浏览器APP

.java

package com.example.ycy;import android.os.Bundle;
import android.app.Activity;
import android.view.KeyEvent;
import android.view.Menu;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.EditText;
import android.widget.TextView;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);//关联浏览器控件final WebView wb = (WebView) findViewById(R.id.webView1);//关联输入框控件final EditText ed = (EditText) findViewById(R.id.ed);//创建浏览器客户端,防止页面访问浏览器发生跳转wb.setWebViewClient(new WebViewClient());//输入框调用动作监听方法ed.setOnEditorActionListener(new TextView.OnEditorActionListener() {@Override//重写动作监听条件public boolean onEditorAction(TextView arg0, int arg1, KeyEvent event) {// TODO Auto-generated method stub//获取输入框中的内容并转化为字符串String str = ed.getText().toString();//浏览页面wb.loadUrl(str);//如果监听到回车,返回truereturn (event.getKeyCode() == KeyEvent.KEYCODE_ENTER);}});           }
}

.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity" ><LinearLayout android:id="@+id/ll"android:layout_width="match_parent"android:layout_height="wrap_content"><EditText android:id="@+id/ed"android:layout_width="match_parent"android:layout_height="match_parent"android:hint="请输入网址"		/>	</LinearLayout><WebViewandroid:layout_below="@id/ll"android:id="@+id/webView1"android:layout_width="match_parent"android:layout_height="match_parent"/></RelativeLayout>

注意要在 AndroidMainfest 中加上网络访问权限:

<uses-permission android:name="android.permission.INTERNET"/>

在这里插入图片描述

效果显示:

在这里插入图片描述


http://chatgpt.dhexx.cn/article/mULnHXcC.shtml

相关文章

storm-executor-spout(2)

2121SCSDUSC storm-executor-spout&#xff08;2&#xff09; 用一个spout读取Twitter数据。采用拓扑并行化&#xff0c;多个spout从同一个流读取数据的不同部分。如果有多个流要读取&#xff0c;可以在任意组件内&#xff08;spouts/bolts&#xff09;访问TopologyContext。…

php读取excel效率,PhpSpreadsheet VS Box\Spout读取excel性能对比

phpspreadsheet版本:1.5.0 spout版本:2.7.3 在同样的环境下,运行代码,spout的在内存使用和时间花费上都占优,在phpspreadsheet读取失败的文档spout依然能正确完成读取。 spout代码 ini_set(memory_limit, 2G); var_dump(memory_get_usage()); var_dump(microtime()); $loa…

KafkaSpout 浅析

最近在使用storm做一个实时计算的项目,Spout需要从 KAFKA 集群中读取数据&#xff0c;为了提高开发效率&#xff0c;直接使用了Storm提供的KAFKA插件。今天抽空看了一下KafkaSpout的源码&#xff0c;记录下心得体会。 KafkaSpout基于kafka.javaapi.consumer.SimpleConsumer实现…

storm trident的多数据流,多spout

storm trident的多数据流&#xff0c;多spout (STORM)[storm, kafka] storm可以使用接收多个spout作为数据源&#xff0c;core storm与trident均可以&#xff0c;本文主要介绍trident的用法。 在trident中设置多个spout的基本思路是先建立多个spout&#xff0c;然后分别创建…

storm学习笔记(二)——Storm组件详解之Tuple、Spout

目录 Tuple元组 结构 生命周期 Spout数据源 结构 开发spout组件 Storm的核心概念包括&#xff1a;Stream、Spout、Bolt、Tuple、Task、Worker、Stream Grouping、Topology Stream是被处理的数据&#xff0c;Spout是数据源&#xff0c;Bolt是处理数据的容器&#xff0c;T…

java 纳秒 格式化_Java日期时间API系列35-----Jdk8中java.time包中的新的日期时间API类应用,微秒和纳秒等更精确的时间格式化和解析。...

通过Java日期时间API系列1-----Jdk7及以前的日期时间类中得知,Java8以前除了java.sql.Timestamp扩充纳秒,其他类最大只精确到毫秒;Java8 time包所有相关类都支持纳秒。下面是示意图: 图中的nano 是 一秒钟包含的纳秒值,0到999999999。毫秒,微秒和纳秒都是通过这个值计算得…

c语言计时程序 纳秒,前端Tips#4 - 用 process.hrtime 获取纳秒级的计时精度

视频讲解 文字讲解 如果去测试代码运行的时长&#xff0c;你会选择哪个时间函数&#xff1f; 一般第一时间想到的函数是 Date.now 或 Date.getTime。 1、先讲结论 之所以这么选&#xff0c;是基于 精度 和 时钟同步 两方面考虑的。 2、知识讲解 首先看一下 Date.now 的缺点 返回…

纳秒时代

1978年在英特尔公司的历史中是很不平凡的一年。这一年它满10岁了&#xff0c;员工数首次超过1万人。这一年&#xff0c;它卖掉了竞争激烈的电子表&#xff08;digital watch&#xff09;业务。最重要的是&#xff0c;在这一年6月&#xff0c;它推出了具有跨时代意义的8086芯片。…

linux内核纳秒精度时间,Linux时钟精度:毫秒?微妙?纳秒?

最近被内核时钟精度弄的很是郁闷。具体情况如下&#xff1a; 扫盲&#xff1a;1秒1000毫秒1000000微妙1000000000纳秒 首先&#xff1a;linux有一个很重要的概念——节拍&#xff0c;它的单位是(次/秒)。2.6内核这个值是1000&#xff0c;系统中用一个HZ的宏表征这个值。同时有全…

java 日期 纳秒_java8 ZonedDateTime 日期精度到纳秒

1秒 10E3毫秒 10E6 微妙 10E9 纳秒 使用java8 Instant 内部实际System.currentTimeMillis() 在模型上 可输出纳秒数据 重点是模型 时间戳转日期 public static ZonedDateTime ofInstant(Instant instant, ZoneId zone) { Objects.requireNonNull(instant, "instant&qu…

第九章:NAT(网络地址转换协议)

文章目录 一、NAT1、NAT介绍①公有网络地址②私有网络地址 2、NAT工作原理3、NAT功能 二、NAT的实现方式1、静态转换&#xff08;static Translation&#xff09;实验对比 2、动态转换2.1 ACL&#xff08;访问控制列表&#xff09;2.2 配置动态NAT实验效果 3、端口多路复用3.1 …

【NAT网络地址转换(私网公网地址、静态NAT、动态NAT、NAPT、Easy IP、NAT Server)】-20211215、20211216

目录 一、NAT产生背景 1.产生背景 2.私网地址、公网地址​ 私网IP地址&#xff0c;既可以一定上缓解ip的不足&#xff0c;在私网里&#xff0c;ip地址可以随意使用。 公网地址&#xff0c;在需要访问公网时&#xff0c;运用网络地址转换NAT技术&#xff0c;可以实现。 二…

什么是私网,公网?

我们常说的内网和外网&#xff0c;通常是相对于防火墙而言的&#xff0c;在防火墙内部叫做内网&#xff0c;反之就是外网。 在一定程度上外网等同于公网&#xff0c;内网等同于私网。公网地址 公网地址是指在因特网上直接可达的地址&#xff0c;如果你有一个公网地址&#xff0…

NAT——公私网地址转换

NAT—网络地址转换 NAT NAT又称为网络地址转换&#xff0c;用于实现私有网络和公有网络之间的转换 私有和公有网络地址 公有网络地址是指互联网上全球唯一的IP地址 私有网络地址是指内部网络或者主机的IP地址 IANA&#xff08;互联网数字分配机制&#xff09;规定将下列的IP地…

公网地址和私网地址问题

服务器映射用于将内网服务器的私网地址映射为公网地址&#xff0c;供Internet用户访问。选择“静态映射”类型可以将每一台服务器映射成一个独立的公网IP地址。“服务器负载均衡”类型可以将多台服务器映射成同一个公网地址&#xff0c;Internet用户在访问这个公网地址时&#…

私网地址与Internet地址

一、A、B、C三类地址 可用地址范围备注A类1.0.0.1-126.255.255.254B类128.1.0.1-191.255.255.254C类192.0.1.1-223.255.255.254D类224.0.0.1-239.255.255.254D类为多播地址 说明&#xff1a; 1. 每一个地址都是用网络位主机位组成的。 2. 全0的和全1的网络位和主机位都要去掉…

计算机网络 网络层 私网地址和公网地址及子网划分

公网地址 公有地址分配和管理由Inter NIC&#xff08;Internet Network Information Center 因特网信息中心&#xff09;负责。各级ISP使用的公网地址都需要向Inter NIC提出申请&#xff0c;有Inter NIC统一发放&#xff0c;这样就能确保地址块不冲突。 私网地址&#xff08;不…

为什么百度查到的ip和ipconfig查到的不一样;详解公网Ip和私网ip;详解网络分类ABC;

IP可以分为Public IP 和 Private IP,出现这种规划的原因在于IPv4所能表示的IP太少而电脑太多以至于不够用&#xff0c;然而只有Public IP才能直接连接上网络&#xff0c;所以对于那些公司&#xff0c;学校&#xff0c;政府机构等场所&#xff0c;就可以集中使用私有的IP进行管理…

挑战华为社招:掌握数据库其实很容易

前言 我的一个朋友,开发四年了,没跳过槽,四年时间也不过是从最开始的10K涨到了15K,经常和我吐槽工资低。去年8月份左右开始了他“骑驴找马”的行动,从各种地方找学习资料、刷面试题。值得庆幸的是,他出去找工作时疫情还不严重,异常顺利的面进了蚂蚁,薪资更是翻了几倍。…