日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/10 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 安卓网络编程(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頁面開發

總結

以上是生活随笔為你收集整理的安卓网络编程(Socket、WebView控件)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。