安卓网络编程(Socket、WebView控件)

目录

  • JavaSocket服务端开发
  • JavaSocket客户端开发
  • 安卓Socket客户端开发
  • 接收消息显示到控件上(解决安卓线程无法修改控件问题)
  • Android网络接收数据并刷新界面显示
  • 安卓webView
  • 智能家居你APP页面开发

JavaSocket服务端开发

在这里插入图片描述

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;public class Test {public static void main(String[] args) {//创建套接字,ip,端口号try {//try...catch是JAVA内部错误管理机制,写完new ServerSocket就会自动提示 点击add就自动添加进来  ServerSocket socket = new ServerSocket(8888);System.out.println("socket套接字创建成功,等待连接");//不断和新客户端建立连接while(true){//死循环写法  和C区别final Socket con = socket.accept();System.out.println("有客户端接入");//new Thread(...).start()  有客户端接入就创建线程去对接new Thread(new Runnable() {//写完自动跳出这个run函数 补全这个线程要做的事情	public void run() {// TODO Auto-generated method stubInputStream in;try {//由于con的定义是在try外面的 鼠标放在上面,点击改变作用域  前面自动出现final关键字in = con.getInputStream();//获取输入流,用来读取数据  类似C中读取fdint len = 0;//定义写到try...catch里面 注意作用域byte[] data = new byte[128];len = in.read(data);//读取放到data里面//输出data中从0到第len个字节 因为data中有128字节,防止输出多余乱码System.out.println("读到消息:"+new String(data,0,len));//输出里面直接写data输出可能会乱码} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}).start();}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}

运行代码验证:
在这里插入图片描述

JavaSocket客户端开发

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;public class Test {public static void main(String[] args) {try {//try...catch也是自动产生的错误捕捉机制Socket client = new Socket("192.168.1.11", 8080);//这样就和客户端建立连接了OutputStream out = client.getOutputStream();//获得数据发送通道Scanner sc = new Scanner(System.in);String message = sc.next();//获取字符串用next() 如果客户端发送的内容有空格,空格及后面的字符串就收不到了out.write(message.getBytes());//发送通道,发送数据  会提示你API的使用方法,根据规则进行填充就行//接收客户端的消息InputStream in = client.getInputStream();//获得数据接受通道int len;byte[] data = new byte[128];len = in.read(data);//接受通道接受数据System.out.println("获得服务端返回数据是:"+new String(data,0,len));} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}

上面写的socket通信代码,只能发送、接收一次,这没关系,因为安卓机制就是UI不断刷新,点击APP按键就建立一次新的连接了。

安卓Socket客户端开发

运行效果:
在这里插入图片描述

activity_main.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" ><Buttonandroid:id="@+id/fh"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_above="@+id/turnLeft"android:layout_centerHorizontal="true"android:onClick="sendMessage"android:text="前进" /><Buttonandroid:id="@+id/turnR"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@+id/fh"android:layout_marginLeft="32dp"android:layout_toRightOf="@+id/fh"android:onClick="sendMessage"android:text="右转" /><Buttonandroid:id="@+id/back"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignLeft="@+id/fh"android:layout_alignParentBottom="true"android:layout_marginBottom="175dp"android:onClick="sendMessage"android:text="后退" /><Buttonandroid:id="@+id/turnLeft"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_above="@+id/back"android:layout_marginBottom="61dp"android:layout_toLeftOf="@+id/fh"android:onClick="sendMessage"android:text="左转" /></RelativeLayout>

MainActivity.java

package com.example.socket.sgkbc;import android.app.Activity;
import android.os.Bundle;
import android.view.View;import com.example.socket.sgkbc.nets.NetUtils;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}public void sendMessage(View v) {switch (v.getId()) {case R.id.fh:NetUtils.sendMessageHandler("gofoward");break;case R.id.back:NetUtils.sendMessageHandler("goback");break;case R.id.turnLeft:NetUtils.sendMessageHandler("goLeft");break;case R.id.turnR:NetUtils.sendMessageHandler("goRight");break;}}}

NetUtils.java

package com.example.socket.sgkbc.nets;import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;public class NetUtils {public static void sendMessageHandler(final String command) {new Thread(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubtry {Socket client = new Socket("192.168.101.158", 8888);OutputStream out = client.getOutputStream();// 获得数据发送通道out.write(command.getBytes());// 发送通道,发送数据} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}).start();}}

接收消息显示到控件上(解决安卓线程无法修改控件问题)

问题引入:
1、在安卓里开辟线程,要另起新建线程(不要直接使用ui的线程)。前面页面跳转有讲到,要在ui线程外操控ui,否则会崩溃。
2、新创建的线程只能修改一次控件内容(使用textView.setText(…)),安卓的线刷机制下用循环去不停改变控件显示内容会提示崩溃,只有初始线程可以。我们在网络通信里面需要不停去修改text控件的显示内容,我们需要解决非UI线程控制控件这个问题。解决的办法就是是使用Handler这个类。

下面我们来制作一个倒计时软件,实现非UI线程对控件的修改。

activity_main.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" ><TextViewandroid:id="@+id/textView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:textSize="40dp"android:textColor="#ffffff"android:textStyle="bold"android:text="10s" /><Buttonandroid:id="@+id/button1"android:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="testFunc"android:text="begin" /></RelativeLayout>

MainActivity.java

package com.example.sgkbc;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 {public TextView textView;//定义控件 为了关联到控件    ctl+shift+O 控件导包public Handler h;//导包ctl+shift+o 选择OS的那个包@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//根据提示类型强转			textView = (TextView) findViewById(R.id.textView); //通过ID关联到控件h = new Handler(){//有点像UI主线程的家里的电话,处理一些其他进程无法处理的事件。@Overridepublic void handleMessage(Message msg) {//一旦“接到电话”就会被调用// TODO Auto-generated method stubsuper.handleMessage(msg);textView.setText(msg.what+"s");//设置text控件显示内容}};}public void testFunc(View V){//new Thread(new Runnable() {} ).start();	new Thread(new Runnable() {//安卓里开辟线程  要另起新建线程//(不要直接使用ui的线程) 前面页面跳转有讲到 ui线程外操控ui@Overridepublic void run() {for (int i = 10; i >=0 ; i--) {	Message msg = new Message();msg.what = i;//"打电话"  将要处理的事件交给UI线程的Handler去做。 有点像进程间通信h.sendMessage(msg);try {//每隔一秒发一次消息 通知你修改UIThread.sleep(1000);//sleep的try...catch机制  安卓的sleep都是线程机制实现的 } catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}).start();	} }

点击begin,开始倒计时10秒。运行效果如下:
在这里插入图片描述

另外,我们不断点击begin,可以不断使用这个定时器,我们并没有把按钮控件放到一个循环里面,这是因为安卓的不断刷新界面机制。

Android网络接收数据并刷新界面显示

activity_main.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/fh"android:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="sendMessage"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>

MainActivity.java

package com.example.socket.sgkbc;import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.TextView;import com.example.socket.sgkbc.nets.NetUtils;public class MainActivity extends Activity {Handler handler;TextView tx;//定义控件  为了关联到xml中的Text控件@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//强制转换 根据提示tx = (TextView) findViewById(R.id.tx);//关联到这个控件 通过ID号handler = new Handler(){@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stubsuper.handleMessage(msg);Bundle b = msg.getData();String string  = b.getString("msg");tx.setText(string);}};}public void sendMessage(View v) {switch (v.getId()) {case R.id.fh:NetUtils.sendMessageHandler("gofoward",handler);break;}}}

NetUtils.java

package com.example.socket.sgkbc.nets;import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;import android.os.Bundle;
import android.os.Handler;
import android.os.Message;public class NetUtils {//“打电话”public static void sendMessageHandler(final String command, final Handler h) {new Thread(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubtry {Socket client = new Socket("192.168.0.7", 8888);OutputStream out = client.getOutputStream();// 获得数据发送通道out.write(command.getBytes());// 发送通道,发送数据int len;InputStream in = client.getInputStream();//获得数据接收通道byte[] data = new byte[128];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);//msg通过setData把Bundle放进来h.sendMessage(msg);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}).start();}}

运行效果:
在这里插入图片描述

安卓webView

显示网址、上网,也可用作显示视频监控画面等。
参照博文:Android WebView 的使用(超详细用法)

控件位置:
在这里插入图片描述

首先需要打开internet访问权限:
方法一:直接敲代码
在这里插入图片描述
方法二:手动添加权限,上面的权限代码将自动填充。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

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>

在这里插入图片描述
java代码:

package com.example.sgkbc.baidu;import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;
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);//系统默认会通过手机浏览器打开网页,为了能够直接通过WebView显示网页,则必须设置wb.setWebViewClient(new WebViewClient());final EditText ed = (EditText) findViewById(R.id.ed);ed.setOnEditorActionListener(new TextView.OnEditorActionListener() {@Overridepublic boolean onEditorAction(TextView arg0, int arg1, KeyEvent event) {// TODO Auto-generated method stubString str = ed.getText().toString();wb.loadUrl(str);//加载的网址 return (event.getKeyCode() == KeyEvent.KEYCODE_ENTER); }});}}

运行:输入百度网址,回车效果如下。
在这里插入图片描述

智能家居你APP页面开发

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

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

相关文章

(转)iOS Wow体验 - 第五章 - 利用iOS技术特性打造最佳体验

本文是《iOS Wow Factor:Apps and UX Design Techniques for iPhone and iPad》第五章译文精选&#xff0c;其余章节将陆续放出。上一篇&#xff1a;Wow体验 - 第四章 - 为应用的上下文环境而设计 关于本套译文分享的详情及目录结构&#xff0c;请参考iOS Wow体验 - 译文分享说…

fetch 自动加cookie_WEBUI自动化开发(第五章)

Requests是Python的非常常用的HTTP的库&#xff0c;主要用于网络爬虫和接口自动化测试。下面使用Requests最新版本&#xff0c;通过pip install requests安装。pip install requestsCollecting requests Downloading requests-2.25.0-py2.py3-none-any.whl (61 kB) |███…

结构体对齐计算方式

目录法则一&#xff1a;结构体成员的偏移量必须是成员大小的整数倍(数组除外)法则二&#xff1a;结构体大小必须是所有成员大小的整数倍(数组、结构体除外)带数组的结构体大小计算带结构体的结构体大小计算带联合体的结构体大小计算pragma pack(4)向4对齐对齐方式确实很浪费空间…

【计算机算法设计与分析】——5.4最优二分检索树

&#xff08;n为结点个数&#xff09; 为成本差额 转载于:https://www.cnblogs.com/chihaoyuIsnotHere/p/9815498.html

dataframe常用操作_Pandas | Dataframe的merge操作,像数据库一样尽情join

点击上方蓝字&#xff0c;关注并星标&#xff0c;和我一起学技术。今天是pandas数据处理第8篇文章&#xff0c;我们一起来聊聊dataframe的合并。常见的数据合并操作主要有两种&#xff0c;第一种是我们新生成了新的特征&#xff0c;想要把它和旧的特征合并在一起。第二种是我们…

2.空间配置器

SGI 特殊的空间配置器 std::alloc 一般而言&#xff0c;我们习惯的C内存配置操作和释放操作是这样的 class Foo{…..} Foo* pf new Foo; delete pf; new包含两阶段操作 &#xff08;1&#xff09;调用 ::operator new 配置内存 &#xff08;2&#xff09;调用 Foo::Foo() …

Github的简单使用(网页版)

目录Git和GithubGithub基础概念注册Github账号创建仓库及文件新建仓库新建文件文件的编辑和删除编辑或修改文件删除文件文件的上传文件的查找及下载文件的查找文件的下载IssuesFork开源项目贡献流程Git和Github 什么是Git Git是一个免费、开源的版本控制软件 什么是版本控制…

常用到的正则表达式

2019独角兽企业重金招聘Python工程师标准>>> 常用的正则表达式 1、匹配只含有英文字母和阿拉伯数字 ^[a-zA-Z0-9-]$ 2、匹配电子邮件地址 ^[_a-z0-9-](\.[_a-z0-9-])*[a-z0-9-](\.[a-z0-9-])*$ 3、匹配中文字符 [\u4e00-\u9fa5] 4、匹配国内座机电话号码 (\d{3}-|\d…

CSDN绑定GitHub账号

目录1.点击自己头像进入个人中心2.点击账号设置&#xff0c;选择绑定三方账号3.选择GitHub绑定绑定成功&#xff0c;主页获取勋章1.点击自己头像进入个人中心 2.点击账号设置&#xff0c;选择绑定三方账号 3.选择GitHub绑定 绑定成功&#xff0c;主页获取勋章

My97DatePicker在asp.net项目中的使用

1、去官网下载 My97DatePicker 包 http://www.my97.net/ 2、比如实现如下图所示功能 2.1 先把下载来的包添加到解决方案 2.2 然后在页面引用css文件和js文件 <link href"My97DatePicker/skin/WdatePicker.css" rel"stylesheet" type"text/css"…

机械秒表的使用方法_让console.log()不再是你的唯一选项js日志输出6种方法

几乎所有的javascript开发者最常使用的日志打印调试api都是console.log(),其实还有很多的选项供我们选择&#xff0c;笔者下面就为大家一一介绍.一、console.table()console.table()是我非常建议大家去使用的方法&#xff0c;它可以接受JSON或数组并以表格格式打印&#xff0c;…

Git的安装(附安装包)

更多干货推荐可以去牛客网看看&#xff0c;他们现在的IT题库内容很丰富&#xff0c;属于国内做的很好的了&#xff0c;而且是课程刷题面经求职讨论区分享&#xff0c;一站式求职学习网站&#xff0c;最最最重要的里面的资源全部免费&#xff01;&#xff01;&#xff01;点击进…

【10.20校内测试】【小模拟】【无向图建树判奇偶环】【树上差分】

Solution 和后面两道题难度差距太大了吧&#xff01;&#xff01; 显然就只是个小模拟&#xff0c;注意判0就行了。 Code #include<bits/stdc.h> using namespace std;char s[100005];int main() {freopen("expression.in", "r", stdin);freopen(&qu…

微信(QQ)截图时,无法保留鼠标右键菜单选项内容

问题描述 按下右键后弹出菜单&#xff0c;再按下QQ截图热键"Ctrl&#xff0b;Alt&#xff0b;A"&#xff08;微信"Ctrl&#xff0b;A"&#xff09;时&#xff0c;却发现菜单不见了。 微信的解决方法 先按下"Alt"键不放&#xff0c;再按住&quo…

使用WebClient请求WCF REST服务

2019独角兽企业重金招聘Python工程师标准>>> 接上篇”WCF实现REST服务“&#xff0c;服务端有了&#xff0c;我们看看客户端怎么访问&#xff0c;由于JS跨域的限制&#xff0c;这里通过WebClient做在后台代理来访问&#xff0c;话不多说&#xff0c;直接上代码。 1…

Git的工作流程简介

目录Git的工作区域Git的基本流程1.将工作区的代码添加到暂存区2.将暂存区的文件提交到本地仓库3.将暂存区的文件提交到远程仓库Git的工作区域 Git的基本流程 图形化方式操作 命令行模式&#xff08;Linux系统常用&#xff09;操作 1.将工作区的代码添加到暂存区 查看文件状态使…

git常用配置(指令)

1、配置用户名和邮箱 (1) 指令设置 $ git config --global user.name "username" $ git config --global user.email johndoeexample.com (2) 修改配置文件.gitconfig 2、配置ssh key免密登录 (1) 生成密钥 $ ssh-keygen -t rsa -C 1046407517qq.com (2) 在github添加…

PG git pull

2019独角兽企业重金招聘Python工程师标准>>> remote: Counting objects: 347, done. remote: Compressing objects: 100% (159/159), done. remote: Total 159 (delta 136), reused 0 (delta 0) Receiving objects: 100% (159/159), 23.16 KiB, done. Resolving del…

c51单片机led奇数偶数亮_两STM32单片机串口通讯实验

一、实验思路连接两个STM32单片机的串口引脚&#xff0c;单片机A进行发送&#xff0c;单片机B进行接收。单片机B根据接收到单片机A的指令来点亮或熄灭板载LED灯&#xff0c;通过实验现象来验证是否通讯成功。二、实验器材两套STM32F103C8T6单片机开发板、ST-Link下载器、杜邦线…

Git本地仓库文件的创建、修改和删除

目录基本信息设置1.设置用户名2.设置用户名邮箱Git仓库操作介绍1.创建一个新的文件夹2.在文件内初始化git仓库&#xff08;创建git仓库&#xff09;3.向仓库中添加文件1.创建一个文件2.将文件添加到暂存区3.将暂存区添加到仓库4.修改仓库文件1.修改文件2.然后把文件添加到暂存区…