Java高级补充(Socket服务端、客户端)、Handler类、安卓Socket传数据、WebView

Socket服务端简单地API:

  • 主要用到以下几个API:ServerSocket用来设置端口号、accept用来和服务端连接、getInputStream用来获取输入流、read用来读取输入流里面的数据,存放在提前开辟好的缓冲区里面。
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;public class Main {public static void main(String[] args){byte[] data=new byte[128];int len=0;//创建套接字,设置IP和端口号try {ServerSocket socket =new ServerSocket(8887);//8888是端口号System.out.println("Socket套接字创建成功等待连接");Socket con=socket.accept(); //con相当于连接通道是Socket类型System.out.println("有客户端接入");InputStream in=con.getInputStream();//获取输入流,用来读取数据,返回值是InputStream类型len=in.read(data);System.out.println("读到消息:"+new String(data,0,len));//String()这个构造方法里面有基于Byte组建一个字符串//上面代表从第0个开始至第len个进行转化为字符串} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}//}
}

建立Socket单点多连接,实现数据的多次发送:

这个主要用一个while循环,不断接收客户端的接入,当有新的客户端接入的时候就会创建一个新的线程去和新接入的客户端对接,然后将接受的数据打印出来

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;public class Main {public static void main(String[] args){//创建套接字,设置IP和端口号try {ServerSocket socket =new ServerSocket(8887);//8888是端口号System.out.println("Socket套接字创建成功等待连接");while(true){//实现while循环不断接受连接final Socket con=socket.accept(); //con相当于连接通道是Socket类型,这里需要将其设置为final类型System.out.println("有客户端接入");new Thread(new Runnable() {public void run() {InputStream in;try {byte[] data=new byte[128];int len=0;in = con.getInputStream();len=in.read(data);System.out.println("读到消息:"+new String(data,0,len));//String()这个构造方法里面有基于Byte组建一个字符串//上面代表从第0个开始至第len个进行转化为字符串	} catch (IOException e) {//可能出现数据流读取错误,所以要设置异常处理// TODO Auto-generated catch blocke.printStackTrace();}//获取输入流,用来读取数据,返回值是InputStream类型}}).start();}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}//}
}

Socket客户端实现收发数据:

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 Main {public static void main(String[] args) {try {Socket Client=new Socket("192.168.43.227",8880); //去连接IP地址是192.168.43.227端口号是8887的服务器OutputStream out=Client.getOutputStream();       //用getOutputStream这个方法去发送数据返回值是OutputStream类型,就获得一个向外输出的一个通道System.out.println("请输入数据:");Scanner input=new Scanner(System.in);String message=input.next();out.write(message.getBytes());//message.getBytes将返回值转化为Byte类型的数组,进行发送//实现客户端接收数据byte[] data=new byte[128];int len;InputStream in=Client.getInputStream(); //获得数据接收通道len=in.read(data);System.out.println("获得服务端返回信息:"+new String(data,0,len));			} catch (UnknownHostException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}	}
}

实现安卓Socket给服务器传输数据:

  • 注意网络访问不可以放到主线程里面,否则会抛出异常
package com.fhn.socket;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;public class MainActivity extends Activity implements View.OnClickListener  {Button btn1;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);btn1=(Button)findViewById(R.id.b);btn1.setOnClickListener(this);}public void SendMessage(){try {String message="message from Andriod";Socket Client=new Socket("192.168.43.227",8881); //去连接IP地址是192.168.43.227端口号是8887的服务器OutputStream out=Client.getOutputStream();       //用getOutputStream这个方法去发送数据返回值是OutputStream类型,就获得一个向外输出的一个通道out.write(message.getBytes());//message.getBytes将返回值转化为Byte类型的数组,进行发送	} catch (UnknownHostException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}	}@Overridepublic void onClick(View arg0) {//因为网络访问不可以放到主线程里面,否则会抛出异常new Thread(new Runnable() {		@Overridepublic void run() {SendMessage();	}}).start();}
}

安卓非UI线程修改控件:

  • 睡眠不能在主线程里面睡眠,得另外开启一个线程,但是新建的线程不能去修改TextView,否则程序会崩掉
  • 使用Handler类去修改UI界面的控件,在另一个线程里面相当于发送消息到UI线程让其修改控件。
package com.fhn.fefsh;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;public class MainActivity extends Activity implements View.OnClickListener{TextView text;Button btn1;Handler h;  //Handler是一个类int i=0;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);text=(TextView)findViewById(R.id.textview);btn1=(Button)findViewById(R.id.b1);btn1.setOnClickListener(this);h=new Handler(){@Overridepublic void handleMessage(Message msg) {//区分事件的类型,Handler有点像UI主线程的家里的电话,他接到电话后去处理其他进程无法处理的事件(比如说在其他线程修改UI)// TODO Auto-generated method stubsuper.handleMessage(msg);text.setText(String.valueOf(msg.arg1));}	};}@Overridepublic void onClick(View v) {// TODO Auto-generated method stubnew Thread(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubfor (int i = 0; i <10; i++) {Message msg=new Message(); msg.arg1=i;//设置message的内容//打电话,去把UI要显示,要处理的事件交给UI线程的Handler去做h.sendMessage(msg);try {Thread.sleep(2000);//睡眠不能在主线程里面睡眠,得另外开启一个线程,但是新建的线程不能去修改TextView,否则程序会崩掉} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}).start();}	
}

安卓接收数据并刷新界面:

package com.fhn.fefsh;import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;public class MainActivity extends Activity implements View.OnClickListener {TextView text;Button btn1;Handler h; // Handler是一个类@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);text = (TextView) findViewById(R.id.textview);btn1 = (Button) findViewById(R.id.b1);btn1.setOnClickListener(this);h = new Handler() {@Overridepublic void handleMessage(Message msg2) {// 区分事件的类型,Handler有点像UI主线程的家里的电话,他接到电话后去处理其他进程无法处理的事件(比如说在其他线程修改UI)// TODO Auto-generated method stubsuper.handleMessage(msg2);Bundle b=msg2.getData();text.setText(b.getString("data"));}};}@Overridepublic void onClick(View v) {// TODO Auto-generated method stubnew Thread(new Runnable() {@Overridepublic void run() {try {Socket Client = new Socket("192.168.43.227", 8883); // 去连接IP地址是192.168.43.227端口号是8887的服务器OutputStream out = Client.getOutputStream(); // 用getOutputStream这个方法去发送数据返回值是OutputStream类型,就获得一个向外输出的一个通道// 实现客户端接收数据byte[] data = new byte[128];int len;InputStream in = Client.getInputStream(); // 获得数据接收通道len = in.read(data);System.out.println("获得服务端返回信息:" + new String(data, 0, len));String getmsg = new String(data, 0, len);Message msg = new Message();Bundle bun = new Bundle();bun.putString("data", getmsg);msg.setData(bun);// 设置message的内容// 打电话,去把UI要显示,要处理的事件交给UI线程的Handler去做h.sendMessage(msg);try {Thread.sleep(1000);// 睡眠不能在主线程里面睡眠,得另外开启一个线程,但是新建的线程不能去修改TextView,否则程序会崩掉} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}} catch (UnknownHostException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}).start();}
}

WebView控件之自制浏览器App:

  • WebView概述: Android WebView在Android平台上是一个特殊的View,它能用来显示网页,这个WebView类可以被用来在app中仅仅显示一张在线的网页,当然还可以用来开发浏览器。WebView内部实现是采用渲染引擎(WebKit)来展示view的内容,提供网页前进后退、网页放大、缩小、搜索等功能。WebView是一个基于WebKit引擎、展现Web页面的控件,Android的WebView在低版本和高版本采用了不同的WebKit版本内核。
  • WebView的基本使用:①: 在布局文件中添加WebView控件 ②: 在代码中让WebView控件加载显示网页。当然,在这里,我们需要加载网络上的数据内容,因此还需要添加网络权限:<!-- 添加网络权限 --> <uses-permission android:name="android.permission.INTERNET" />
  • 实现从APP访问百度:
package com.fhn.baidu;
import android.app.Activity;
import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebViewClient;
public class MainActivity extends Activity {WebView wb;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);wb=(WebView)findViewById(R.id.wv_webview);wb.loadUrl("http://www.baidu.com");wb.setWebViewClient(new WebViewClient());// //系统默认会通过手机浏览器打开网页,为了能够直接通过WebView显示网页,则必须设置}
}
  • EditText把回车键变成搜索
在xml文件中的EditText中添加android:imeOptions="actionSearch" 属性et_main_search.setOnKeyListener(new OnKeyListener() {//输入完后按键盘上的搜索键【回车键改为了搜索键】public boolean onKey(View v, int keyCode, KeyEvent event) {if(keyCode==KeyEvent.KEYCODE_ENTER){//改动回车键功能}return false;}});

实现自定义网址访问:

package com.fhn.baidu;import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnKeyListener;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.EditText;
import android.widget.Toast;public class MainActivity extends Activity {EditText edit1;WebView  wb;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);wb=(WebView)findViewById(R.id.wv_webview);wb.setWebViewClient(new WebViewClient());edit1=(EditText)findViewById(R.id.edittext);edit1.setOnKeyListener(new OnKeyListener() {//输入完后按键盘上的搜索键【回车键改为了搜索键】public boolean onKey(View v, int keyCode, KeyEvent event) {if(keyCode==KeyEvent.KEYCODE_ENTER){//修改回车键功能Toast.makeText(MainActivity.this, "回车", Toast.LENGTH_LONG).show();String str=edit1.getText().toString();System.out.println(str);wb.loadUrl(str);	}return false;}});
//        wb.loadUrl("http://www.baidu.com");
//        wb.setWebViewClient(new WebViewClient());// //系统默认会通过手机浏览器打开网页,为了能够直接通过WebView显示网页,则必须设置}
}

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

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

相关文章

向anna学习系统结构和测试流程

今天上午主要是anne简单介绍系统的功能和公司的测试流程。通过她的讲解对于系统的大概流程有了概念。但是具体的问题估计还得到实际的操作中去。可能是这一块的而功能比较老了&#xff0c;所以相关的文档也是没有及时更新的。看起来比较蛮烦&#xff0c;等我全部弄清楚了有时间…

Linux进程终止命令kill或killall​笔记

在linux命令下&#xff0c;如果需要终止某个进程&#xff0c;可以使用kill或者killall等命令来实现。终止命令的原理都是向linux内核发送一个系统操作的信号以及某个进程的ID&#xff0c;然后系统内核会根据指定的进程ID进行相应的处理。kill命令典型的用法&#xff1a;首先使用…

贝叶斯分析好坏_贝叶斯统计 | 第五章第一部分 决策基本概念

逃不掉线上期中考。。。。。。。。。开摄像头屏录拍照上传。。。。。。20号考贝叶斯&#xff0c;18号考多元&#xff0c;时间序列考试时间还未知。。。。。。。但笔记还是要记的。不过贝叶斯已经跟上进度了&#xff0c;之后会按课程进度来更新贝叶斯的内容。今天开始会更新时间…

Visual Studio的调试技巧

Visual Studio的调试技巧 【原文地址】 Debugging Tips with Visual Studio 2010 【原文发表日期】 2010/8/19 10:48 AM 这是我写的关于VS2010和.Net4发布的博客系列的第26篇。 今天的博文包含了一些有用的能用于VS的调试技巧。 我的朋友 Scott Cate&#xff08;他写了很多很…

读者写者问题

河北科技大学操作系统课程设计——读者写者问题 #include <windows.h> #include <conio.h> #include <stdlib.h> #include <fstream> #include <io.h> #include <string.h> #include <stdio.h> using namespace std; #define READE…

Linux排序命令sort笔记

很多时候Linux需要对文本相对比较规范的文本数据进行排序&#xff0c;这时候可以使用Linux系统下的sort命令进行处理。语法格式&#xff1a;sort [-ntkr] filename常用参数&#xff1a;-n 根据数字进行排序-t 指定的分隔符-k 指定分隔符的第几列-r 降序排序用法示例&#xff1a…

《过早退出是一切失败的根源》读后感

在看完周筠老师的文章&#xff1a;过早的退出是一切失败的根源&#xff0c;内心感触颇大。因为年轻&#xff0c;我们总觉得有许许多多的另一个与下一次&#xff0c;我们总是在某个环境里失败或觉得不行时&#xff0c;就会想退出&#xff0c;我们对有风险的事情不愿去尝试&#…

redirect路由配置 vue_Web前端:Vue路由进阶配置

大家好&#xff0c;我来了&#xff0c;本期为大家带来的前端开发知识是”Web前端&#xff1a;Vue路由进阶配置“&#xff0c;有兴趣做前端的朋友&#xff0c;和我一起来看看吧&#xff01;1. 页面打开权限流程页面是否能打开有以下两点判断&#xff1a;1. 判断是否增加登陆的判…

ESP8266模块无限重启崩溃的问题

问题背景&#xff1a; 最近使用ESP8266模块&#xff08;NodeMCU&#xff09;在Arduino环境下进行开发调试时遇到了一个ESP8266模块无限重启崩溃的问题。这个问题不是第一次发生了&#xff0c;很久之前遇到了后面也不知道怎么解决了。 这一次再次碰到了&#xff0c;经过查阅网上…

python格式化输出

格式化输出字符串 格式化输出整数 格式化输出浮点数 输出&

Linux常用内建命令笔记

Linux系统为了便于运维人员对系统的操作&#xff0c;所以内建了很多shell命令。一般来说linux系统的内建命令会比执行外部的shell命令执行更快。因为执行内建命令相当于调用当前shell进程里面的函数&#xff0c;而执行外部命令的话需要出发IO操作还要fork一个单独的进程来执行&…

什么原因接触接触impala的

最近一个项目&#xff0c;关于大数据的改造项目&#xff0c;底层选择Impala还是sparkSQL呢&#xff1f; 最后选择Impala.这样就开启了我的Impala学习之旅。我大部分负责Imapa接口开发工作。 我是控制不住的想整个都了解和学习。所有还在impala控制台各种测试和学习。差不多一两…

asp手机拍照显示_会员动态飞凯材料120吨TFTLCD混合液晶显示项目,建后五年达产...

来源 &#xff1a;全景网10月26日&#xff0c;在飞凯材料可转债发行网上路演会议上&#xff0c;该公司相关人员也对投资者关心的问题进行解答。关于发行8.25亿元可转换债券&#xff0c;飞凯材料表示本次募集资金扣除发行费用后将用于投资以下项目&#xff1a;10000t/a紫外固化光…

python中变量的命名和关键字和变量的命名规则

[False, None, True, and, as, assert, break, class, continue, def, del, elif, else, except, finally, for, from, global, if, import, in, is, lambda, nonlocal, not, or, pass, raise, return, try, while, with, yield]

Linux中Shell数组的笔记

Shell数组的介绍数组算是一种特殊的数据结构&#xff0c;数据项可以成为数组的元素&#xff0c;可以通过数组的索引获取每一个数组的元素值。数组的典型的使用场景是把相同类型的元素汇总在一起。由于Shell变量属于弱类型&#xff0c;所以数组里面的元素并不一定是相同类型。注…

linux中php配置

安装nginxphp好久了&#xff0c;今天意外的搭建好了&#xff0c;分享给大家 &#xff0c;以免以后多走弯路。 nginx已经前面安装好了&#xff0c;现在就开始配置php 安装php 分为两个部分 &#xff1a;一部分是php源码&#xff0c;另外是fastcgi管理进程&#xff1a;php-fpm 庆…

log函数 oracle power_Excel之数学函数SQRT/MOD/EXP/LN/RAND

本部分主要包括ABS函数、SQRT函数、SIGN函数、MOD函数、POWER、EXP函数、LN函数、LOG函数、LOG10函数、RAND函数、RANDBETWEEN函数、PI函数、SIN函数、COS函数、TAN函数、PRODUCT函数、FACT函数、GCD函数、LCM函数、DEGREES函数、RADIANS函数和SUBTOTAL函数共22个。需重点掌握S…