目录

  • 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页面开发

安卓网络编程(Socket、WebView控件)相关推荐

  1. 关于WebView 控件,你了解多少?

    大家需要知道,不管什么技术,最终在 App 里面显示网页,一定需要一个网页引擎,这样才能解析网页. 通常情况下,App 内部会使用 WebView 控件作为网页引擎.这是系统自带的控件,专门用来显示网 ...

  2. Android Native APP开发笔记:使用WebView控件加载网页

    文章目录 目的 基础使用 处理网页导航 加载本地网页 Web和Native之间交互 调试Web应用 处理页面重绘 总结 目的 WebView是一个比较常用的控件,功能上也比较单一,就是用来加载网页的, ...

  3. 【Android】WebView控件最全使用解析

    WebView控件最全使用解析 一.WebView 概述 二.WebView使用基础篇 2.1添加方式 2.2 加载远程网页 2.3 加载本地网页 2.4 加载HTML片段 2.5 WebView 常 ...

  4. Python网络编程socket

    网络编程之socket 看到本篇文章的题目是不是很疑惑,what is this?,不要着急,但是记住一说网络编程,你就想socket,socket是实现网络编程的工具,那么什么是socket,什么是 ...

  5. Android的WebView控件载入网页显示速度慢的究极解决方案

    Android的WebView控件载入网页显示速度慢的究极解决方案 [转载来源自http://hi.baidu.com/goldchocobo/] Android客户端中混搭HTML页面,会出现虽然H ...

  6. Android使用webview控件加载本地html,通过Js与后台Java实现数据的传递

    1.在布局文件中加WebView控件,在java中获取WebView对象. 2.加载本地html文件. webView.loadUrl("file:///android_asset/andr ...

  7. WPF编程,将控件所呈现的内容保存成图像的一种方法。

    WPF编程,将控件所呈现的内容保存成图像的一种方法. 原文:WPF编程,将控件所呈现的内容保存成图像的一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.ne ...

  8. 在UAP中如何通过WebView控件进行C#与JS的交互

    原文:在UAP中如何通过WebView控件进行C#与JS的交互 最近由于项目需求,需要利用C#在UWP中与JS进行交互,由于还没有什么实战经验,所有就现在网上百度了一下,但是百度的结果显示大部分都是在 ...

  9. Python网络编程(Socket)

    Python网络编程(Socket) Python提供了两个访问级别的网络服务.在一个较低的水平,您可以访问底层操作系统的基本套接字支持,允许你实现面向连接和无连接协议的客户端和服务器 Python有 ...

  10. Java网络编程 Socket、ServerSocket 详解,方法介绍及完整代码示例

    Java网络编程 Socket.ServerSocket 详解,方法介绍及完整代码示例 概念 什么是网络编程? 网络编程是指编写运行在多个设备(计算机)的程序,这些设备通过网络连接起来.当这些通过网络 ...

最新文章

  1. 问题 “No mapping found for HTTP request with URI [/fileupload/upload.do]” 的解决
  2. javascript关于检测浏览器和操作系统的问题
  3. Ffmpeg 定位文件(seek file)
  4. 用事件队列解决GUI的操作顺序问题(Qt中处理方法)
  5. [转]使用URLConnection下载文件或图片并保存到本地
  6. 防止NSTimer和调用对象之间的循环引用
  7. chrome vue插件_「Vue学习记录一」开发环境准备
  8. C#用注册表开机自动启动某某软件
  9. 【鲲鹏来了】手把手教你创造一个属于自己的鲲鹏开发者环境
  10. 宝塔linux上传文件视频,使用宝塔linux面板上传文件 解压缩zip和tar.gz
  11. matmul torch 详解_python基础教程详解torch.Tensor的4种乘法
  12. 记录一次.net 4.7.2安装失败解决情况
  13. 6-5 统计二叉树叶子结点个数 (10 分)(C语言版)
  14. python声音识别歌曲_听歌识曲--用python实现一个音乐检索器的功能
  15. Win10开始菜单卡死解决办法
  16. DRF批量修改序列化器使用
  17. 小程序开发问题之textarea层次问题
  18. windows10如何安装hyper-v
  19. python买苹果增强版
  20. 拼音输入法,提高码字效率

热门文章

  1. 关于Git使用的一些心得
  2. sharepoint 2013 个人站点母版
  3. QSlider QLCDNumber 最常用的函数和 信号槽 (以后用到在加)
  4. WinXP的EFS加密文件如何解密?
  5. 灰度图的width和widthstep的区别
  6. 学习笔记(17):Python网络编程并发编程-Process对象的其他属性或方法
  7. 相机标定(三) —— 畸变校正
  8. 误码率越高越好还是越低越好_夜间护理步骤越多越好还是越少越好?NFF
  9. python正则表达式匹配aabb_Python正则表达式拆分多个匹配项
  10. mysql黄色版_Linux机上运行多个版本的MySQL