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.pswp.cn/news/272057.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/272057.shtml
英文地址,請注明出處:http://en.pswp.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…