httpsocketandroid
1. android伺服器與客戶端通信最好用什麼協議 用http還是用套接字啊。打算做關於圖書館管理的android應用。。
首先基於TCP協議在Android終端和PC兩端之間形成網路虛擬鏈路。使用ServerSocket創建TCP伺服器端,然後在Android客戶端使用Socket的構造器來連接伺服器。其中Android終端通過WIFI連接和PC處於同一區域網。
1. PC伺服器啟用ServerSocket
兩個通信實體在建立虛擬鏈路之前,需要有一方先准備好,主動接受來自其他通信實體的連接請求。
使用ServerSocket對象監聽來自客戶端的Socket連接
2. Android終端使用Socket通信
客戶端使用Socket的構造器連接伺服器,指定伺服器IP和埠號就可以了。
Socket s = new Socket(「192.168.1.100」, 30000);
這樣伺服器端的accept()方法就得到響應,從而向下執行,伺服器端和客戶端就形成了一對互相連接的Socket。再進行通信時就沒有伺服器和客戶端之分了,都是通過輸入輸出流進行通信。
2. android怎麼在網路請求頭里加參數
android中網路通信分為socket編程和http編程,這里只介紹htt方面。網路請求方式可分為get請求,post兩種請求方式,GET方式在進行數據請求時,會把數據附加到URL後面傳遞給伺服器,比如常見的:http://XXX.XXX.XXX/XX.aspx?id=1,POST方式則是將請求的數據放到HTTP請求頭中,作為請求頭的一部分傳入伺服器。
所以,在進行HTTP編程前,首先要明確究竟使用的哪種方式進行數據請求的。
android中Http編程有兩種:1、HttpURLConnection;2、HttpClient
首先介紹一下HttpURLConnection方式的get請求和post請求方法:
[java] view
plainprint?
private Map<String, String> paramsValue;
String urlPath=null;// 發送地http://192.168.100.91:8080/myweb/login?username=abc&password=123
public void initData(){urlPath="http://192.168.100.91:8080/myweb/login";
paramsValue=new HashMap<String, String>();
paramsValue.put("username", "111");
paramsValue.put("password", "222");
}
private Map<String, String> paramsValue;
String urlPath=null;
// 發送地http://192.168.100.91:8080/myweb/login?username=abc&password=123
public void initData(){
urlPath="http://192.168.100.91:8080/myweb/login";
paramsValue=new HashMap<String, String>();
paramsValue.put("username", "111");
paramsValue.put("password", "222");
}
get方式發起請求:
[java] view
plainprint?
private boolean sendGETRequest(String path, Map<String, String> params) throws Exception {
boolean success=false;// StringBuilder是用來組拼請求地址和參數
StringBuilder sb = new StringBuilder();
sb.append(path).append("?");
if (params != null && params.size() != 0) {
for (Map.Entry<String, String> entry : params.entrySet()) {
// 如果請求參數中有中文,需要進行URLEncoder編碼 gbk/utf8
sb.append(entry.getKey()).append("=").append(URLEncoder.encode(entry.getValue(), "utf-8"));
sb.append("&");
}
sb.deleteCharAt(sb.length() - 1);
}URL url = new URL(sb.toString());
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(20000);
conn.setRequestMethod("GET");if (conn.getResponseCode() == 200) {
success= true;
}
if(conn!=null)
conn.disconnect();
return success;
}
private boolean sendGETRequest(String path, Map<String, String> params) throws Exception {
boolean success=false;
// StringBuilder是用來組拼請求地址和參數
StringBuilder sb = new StringBuilder();
sb.append(path).append("?");
if (params != null && params.size() != 0) {
for (Map.Entry<String, String> entry : params.entrySet()) {
// 如果請求參數中有中文,需要進行URLEncoder編碼 gbk/utf8
sb.append(entry.getKey()).append("=").append(URLEncoder.encode(entry.getValue(), "utf-8"));
sb.append("&");
}
sb.deleteCharAt(sb.length() - 1);
}
URL url = new URL(sb.toString());
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(20000);
conn.setRequestMethod("GET");
if (conn.getResponseCode() == 200) {
success= true;
}
if(conn!=null)
conn.disconnect();
return success;
}
postt方式發起請求:
[java] view
plainprint?
private boolean sendPOSTRequest(String path,Map<String, String> params) throws Exception{
boolean success=false;
//StringBuilder是用來組拼請求參數
StringBuilder sb = new StringBuilder();if(params!=null &¶ms.size()!=0){for (Map.Entry<String, String> entry : params.entrySet()) {sb.append(entry.getKey()).append("=").append(URLEncoder.encode(entry.getValue(), "utf-8"));
sb.append("&");}
sb.deleteCharAt(sb.length()-1);
}//entity為請求體部分內容
//如果有中文則以UTF-8編碼為username=%E4%B8%AD%E5%9B%BD&password=123
byte[] entity = sb.toString().getBytes();URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(2000);
// 設置以POST方式
conn.setRequestMethod("POST");
// Post 請求不能使用緩存
// urlConn.setUseCaches(false);
//要向外輸出數據,要設置這個
conn.setDoOutput(true);
// 配置本次連接的Content-type,配置為application/x-www-form-urlencoded
//設置content-type獲得輸出流,便於想伺服器發送信息。
//POST請求這個一定要設置
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setRequestProperty("Content-Length", entity.length+"");
// 要注意的是connection.getOutputStream會隱含的進行connect。
OutputStream out = conn.getOutputStream();
//寫入參數值
out.write(entity);
//刷新、關閉
out.flush();
out.close();if (conn.getResponseCode() == 200) {
success= true;
}
if(conn!=null)
conn.disconnect();
return success;}
private boolean sendPOSTRequest(String path,Map<String, String> params) throws Exception{
boolean success=false;
//StringBuilder是用來組拼請求參數
StringBuilder sb = new StringBuilder();
if(params!=null &¶ms.size()!=0){
for (Map.Entry<String, String> entry : params.entrySet()) {
sb.append(entry.getKey()).append("=").append(URLEncoder.encode(entry.getValue(), "utf-8"));
sb.append("&");
}
sb.deleteCharAt(sb.length()-1);
}
//entity為請求體部分內容
//如果有中文則以UTF-8編碼為username=%E4%B8%AD%E5%9B%BD&password=123
byte[] entity = sb.toString().getBytes();
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(2000);
// 設置以POST方式
conn.setRequestMethod("POST");
// Post 請求不能使用緩存
// urlConn.setUseCaches(false);
//要向外輸出數據,要設置這個
conn.setDoOutput(true);
// 配置本次連接的Content-type,配置為application/x-www-form-urlencoded
//設置content-type獲得輸出流,便於想伺服器發送信息。
//POST請求這個一定要設置
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setRequestProperty("Content-Length", entity.length+"");
// 要注意的是connection.getOutputStream會隱含的進行connect。
OutputStream out = conn.getOutputStream();
//寫入參數值
out.write(entity);
//刷新、關閉
out.flush();
out.close();
if (conn.getResponseCode() == 200) {
success= true;
}
if(conn!=null)
conn.disconnect();
return success;
}
在介紹一下HttpClient方式,相比HttpURLConnection,HttpClient封裝的得更簡單易用一些,看一下實例:
get方式發起請求:
[java] view
plainprint?
public String getRequest(String UrlPath,Map<String, String> params){
String content=null;
StringBuilder buf = new StringBuilder();
if(params!=null &¶ms.size()!=0){for (Map.Entry<String, String> entry : params.entrySet()) {buf.append(entry.getKey()).append("=").append(URLEncoder.encode(entry.getValue(), "utf-8"));
buf.append("&");}
buf.deleteCharAt(buf.length()-1);
}
content= buf.toString();HttpClient httpClient = new DefaultHttpClient();
HttpGet getMethod = new HttpGet(content);HttpResponse response = null;
try {
response = httpClient.execute(getMethod);
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}catch (Exception e) {
e.printStackTrace();
}if (response!=null&&response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
try {
content = EntityUtils.toString(response.getEntity());
} catch (ParseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}return content;
}
public String getRequest(String UrlPath,Map<String, String> params){
String content=null;
StringBuilder buf = new StringBuilder();
if(params!=null &¶ms.size()!=0){
for (Map.Entry<String, String> entry : params.entrySet()) {
buf.append(entry.getKey()).append("=").append(URLEncoder.encode(entry.getValue(), "utf-8"));
buf.append("&");
}
buf.deleteCharAt(buf.length()-1);
}
content= buf.toString();
HttpClient httpClient = new DefaultHttpClient();
HttpGet getMethod = new HttpGet(content);
HttpResponse response = null;
try {
response = httpClient.execute(getMethod);
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}catch (Exception e) {
e.printStackTrace();
}
if (response!=null&&response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
try {
content = EntityUtils.toString(response.getEntity());
} catch (ParseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
return content;
}
postt方式發起請求:
[java] view
plainprint?
private boolean sendPOSTRequestHttpClient(String path,Map<String, String> params) throws Exception {
boolean success = false;
// 封裝請求參數
List<NameValuePair> pair = new ArrayList<NameValuePair>();
if (params != null && !params.isEmpty()) {
for (Map.Entry<String, String> entry : params.entrySet()) {
pair.add(new BasicNameValuePair(entry.getKey(), entry
.getValue()));
}
}
// 把請求參數變成請求體部分
UrlEncodedFormEntity uee = new UrlEncodedFormEntity(pair, "utf-8");
// 使用HttpPost對象設置發送的URL路徑
HttpPost post = new HttpPost(path);
// 發送請求體
post.setEntity(uee);
// 創建一個瀏覽器對象,以把POST對象向伺服器發送,並返回響應消息
DefaultHttpClient dhc = new DefaultHttpClient();
HttpResponse response = dhc.execute(post);
if (response.getStatusLine().getStatusCode() == 200) {
success = true;
}
return success;
}
private boolean sendPOSTRequestHttpClient(String path,Map<String, String> params) throws Exception {
boolean success = false;
// 封裝請求參數
List<NameValuePair> pair = new ArrayList<NameValuePair>();
if (params != null && !params.isEmpty()) {
for (Map.Entry<String, String> entry : params.entrySet()) {
pair.add(new BasicNameValuePair(entry.getKey(), entry
.getValue()));
}
}
// 把請求參數變成請求體部分
UrlEncodedFormEntity uee = new UrlEncodedFormEntity(pair, "utf-8");
// 使用HttpPost對象設置發送的URL路徑
HttpPost post = new HttpPost(path);
// 發送請求體
post.setEntity(uee);
// 創建一個瀏覽器對象,以把POST對象向伺服器發送,並返回響應消息
DefaultHttpClient dhc = new DefaultHttpClient();
HttpResponse response = dhc.execute(post);
if (response.getStatusLine().getStatusCode() == 200) {
success = true;
}
return success;
}
3. android網路編程學什麼,如何學習android網路編程
第一個問題解答:android網路編程學習內容詳解:
1.0 Android基礎入門教程
1.1 背景相關與系統架構分析
1.2 開發環境搭建
1.2.1 使用Eclipse + ADT + SDK開發Android APP
1.2.2 使用Android Studio開發Android APP
1.3 SDK更新不了問題解決
1.4 Genymotion模擬器安裝
1.5.1 Git使用教程之本地倉庫的基本操作
1.5.2 Git之使用GitHub搭建遠程倉庫
1.6 .9(九妹)圖片怎麼玩
1.7 界面原型設計
1.8 工程相關解析(各種文件,資源訪問)
1.9 Android程序簽名打包
1.11 反編譯APK獲取代碼&資源
2.1 View與ViewGroup的概念
2.2.1 LinearLayout(線性布局)
2.2.2 RelativeLayout(相對布局)
2.2.3 TableLayout(表格布局)
2.2.4 FrameLayout(幀布局)
2.2.5 GridLayout(網格布局)
2.2.6 AbsoluteLayout(絕對布局)
2.3.1 TextView(文本框)詳解
2.3.2 EditText(輸入框)詳解
2.3.3 Button(按鈕)與ImageButton(圖像按鈕)
2.3.4 ImageView(圖像視圖)
2.3.5.RadioButton(單選按鈕)&Checkbox(復選框)
2.3.6 開關按鈕ToggleButton和開關Switch
2.3.7 ProgressBar(進度條)
2.3.8 SeekBar(拖動條)
2.3.9 RatingBar(星級評分條)
2.4.1 ScrollView(滾動條)
2.4.2 Date & Time組件(上)
2.4.3 Date & Time組件(下)
2.4.4 Adapter基礎講解
2.4.5 ListView簡單實用
2.4.6 BaseAdapter優化
2.4.7ListView的焦點問題
2.4.8 ListView之checkbox錯位問題解決
2.4.9 ListView的數據更新問題
2.5.0 構建一個可復用的自定義BaseAdapter
2.5.1 ListView Item多布局的實現
2.5.2 GridView(網格視圖)的基本使用
2.5.3 Spinner(列表選項框)的基本使用
2.5.4 AutoCompleteTextView(自動完成文本框)的基本使用
2.5.5 ExpandableListView(可折疊列表)的基本使用
2.5.6 ViewFlipper(翻轉視圖)的基本使用
2.5.7 Toast(吐司)的基本使用
2.5.8 Notification(狀態欄通知)詳解
2.5.9 AlertDialog(對話框)詳解
2.6.0 幾種常用對話框基本使用
2.6.1 PopupWindow(懸浮框)的基本使用
2.6.2 菜單(Menu)
2.6.3 ViewPager的簡單使用
2.6.4 DrawerLayout(官方側滑菜單)的簡單使用
3.1.1 基於監聽的事件處理機制
3.2 基於回調的事件處理機制
3.3 Handler消息傳遞機制淺析
3.4 TouchListener PK OnTouchEvent + 多點觸碰
3.5 監聽EditText的內容變化
3.6 響應系統設置的事件(Configuration類)
3.7 AnsyncTask非同步任務
3.8 Gestures(手勢)
4.1.1 Activity初學乍練
4.1.2 Activity初窺門徑
4.1.3 Activity登堂入室
4.2.1 Service初涉
4.2.2 Service進階
4.2.3 Service精通
4.3.1 BroadcastReceiver牛刀小試
4.3.2 BroadcastReceiver庖丁解牛
4.4.1 ContentProvider初探
4.4.2 ContentProvider再探——Document Provider
4.5.1 Intent的基本使用
4.5.2 Intent之復雜數據的傳遞
5.1 Fragment基本概述
5.2.1 Fragment實例精講——底部導航欄的實現(方法1)
5.2.2 Fragment實例精講——底部導航欄的實現(方法2)
5.2.3 Fragment實例精講——底部導航欄的實現(方法3)
5.2.4 Fragment實例精講——底部導航欄+ViewPager滑動切換頁面
5.2.5 Fragment實例精講——新聞(購物)類App列表Fragment的簡單實現
6.1 數據存儲與訪問之——文件存儲讀寫
6.2 數據存儲與訪問之——SharedPreferences保存用戶偏好參數
6.3.1 數據存儲與訪問之——初見SQLite資料庫
6.3.2 數據存儲與訪問之——又見SQLite資料庫
7.1.1 Android網路編程要學的東西與Http協議學習
7.1.2 Android Http請求頭與響應頭的學習
7.1.3 Android HTTP請求方式:HttpURLConnection
7.1.4 Android HTTP請求方式:HttpClient
7.2.1 Android XML數據解析
7.2.2 Android JSON數據解析
7.3.1 Android 文件上傳
7.3.2 Android 文件下載(1)
7.3.3 Android 文件下載(2)
7.4 Android 調用 WebService
7.5.1 WebView(網頁視圖)基本用法
7.5.2 WebView和JavaScrip交互基礎
7.5.3 Android 4.4後WebView的一些注意事項
7.5.4 WebView文件下載
7.5.5 WebView緩存問題
7.5.6 WebView處理網頁返回的錯誤碼信息
7.6.1 Socket學習網路基礎准備
7.6.2 基於TCP協議的Socket通信(1)
7.6.3 基於TCP協議的Socket通信(2)
7.6.4 基於UDP協議的Socket通信
8.1.1 Android中的13種Drawable小結 Part 1
8.1.2 Android中的13種Drawable小結 Part 2
8.1.3 Android中的13種Drawable小結 Part 3
8.2.1 Bitmap(點陣圖)全解析 Part 1
8.2.2 Bitmap引起的OOM問題
8.3.1 三個繪圖工具類詳解
8.3.2 繪圖類實戰示例
8.3.3 Paint API之—— MaskFilter(面具)
8.3.4 Paint API之—— Xfermode與PorterDuff詳解(一)
8.3.5 Paint API之—— Xfermode與PorterDuff詳解(二)
8.3.6 Paint API之—— Xfermode與PorterDuff詳解(三)
8.3.7 Paint API之—— Xfermode與PorterDuff詳解(四)
8.3.8 Paint API之—— Xfermode與PorterDuff詳解(五)
8.3.9 Paint API之—— ColorFilter(顏色過濾器)(1/3)
8.3.10 Paint API之—— ColorFilter(顏色過濾器)(2-3)
8.3.11 Paint API之—— ColorFilter(顏色過濾器)(3-3)
8.3.12 Paint API之—— PathEffect(路徑效果)
8.3.13 Paint API之—— Shader(圖像渲染)
8.3.14 Paint幾個枚舉/常量值以及ShadowLayer陰影效果
8.3.15 Paint API之——Typeface(字型)
8.3.16 Canvas API詳解(Part 1)
8.3.17 Canvas API詳解(Part 2)剪切方法合集
8.3.18 Canvas API詳解(Part 3)Matrix和drawBitmapMash
8.4.1 Android動畫合集之幀動畫
8.4.2 Android動畫合集之補間動畫
8.4.3 Android動畫合集之屬性動畫-初見
8.4.4 Android動畫合集之屬性動畫-又見
9.1 使用SoundPool播放音效(Duang~)
9.2 MediaPlayer播放音頻與視頻
9.3 使用Camera拍照
9.4 使用MediaRecord錄音
10.1 TelephonyManager(電話管理器)
10.2 SmsManager(簡訊管理器)
10.3 AudioManager(音頻管理器)
10.4 Vibrator(振動器)
10.5 AlarmManager(鬧鍾服務)
10.6 PowerManager(電源服務)
10.7 WindowManager(窗口管理服務)
10.8 LayoutInflater(布局服務)
10.9 WallpaperManager(壁紙管理器)
10.10 感測器專題(1)——相關介紹
10.11 感測器專題(2)——方向感測器
10.12 感測器專題(3)——加速度/陀螺儀感測器
10.12 感測器專題(4)——感測器了解
10.14 Android GPS初涉
第二個問題解答:如何學習android網路編程:
1. Android學習之路,博客是Android新手必備資料。
2. 書不在多,適合就好,這里推薦一本Android和兩本Java書籍吧。
《第一行代碼》:郭霖大神的著作。
《Thinking In Java》:Java經典書籍,不必說。
《Effective Java》:Java進階必備書籍。
3. 有些人一開始看書也有困難,沒關系,那就去網上看視頻,結合視頻和書一起看,邊看邊敲。
4. 多去混GitHub,目前最流行的開源社區,多參與開源項目,慢慢試著讀牛人們的代碼,時機到的時候自己也可以為開源社區貢獻力量,可以這樣說在GitHub上認真混一年。
5. 關注一些Android界不錯的博客。
6. 善於利用搜索引擎,從用Google做起,學會英文關鍵字搜索,有問題第一時間想到去搜索而不是去請教別人。
4. android 怎麼上傳一個String數組
上傳String數組可以將其轉換成string類型,每個數組元素之間添加一個你自己定義的 分隔符 比如「| #$」等。用socket或http上傳。
很多時候 安卓與服務商交互 較多採用的數據格式是 JSON 和 XML。可以將其 包裝為JSON 格式。JSON 格式比較簡單。
JSON 工具類有 GSON android也自帶Json包,可以方便使用,String數組轉成JsonArray 再上傳就行了。
5. android 怎麼與websocket 通訊
Android與伺服器通信通常採用HTTP通信方式和Socket通信方式,而HTTP通信方式又分get和post兩種方式。至於Socket通信會在以後的博文中介紹。 HTTP協議簡介: HTTP (Hypertext Transfer Protocol ),是Web聯網的基礎,也是手機聯網常用的協議之一,HTTP協議是建立在TCP協議之上的一種協議。 HTTP連接最顯著的特點是客戶端發送的每次請求都需要伺服器回送響應,在請求結束後,會主動釋放連接。從建立連接到關閉連接的過程稱為“一次連接”。在HTTP 1.0中,客戶端的每次請求都要求建立一次單獨的連接,在處理完本次請求後,就自動釋放連接。在HTTP 1.1中則可以在一次連接中處理多個請求,並且多個請求可以重疊進行,不需要等待一個請求結束後再發送下一個請求。 由於HTTP在每次請求結束後都會主動釋放連接,因此HTTP連接是一種“短連接”、“無狀態”,要保持客戶端程序的在線狀態,需要不斷地向伺服器發起連接請求。通常的做法是即使不需要獲得任何數據,客戶端也保持每隔一段固定的時間向伺服器發送一次“保持連接”的請求,伺服器在收到該請求後對客戶端進行回復,表明知道客戶端“在線”。若伺服器長時間無法收到客戶端的請求,則認為客戶端“下線”,若客戶端長時間無法收到伺服器的回復,則認為網路已經斷開。 基於HTTP1.0協議的客戶端在每次向伺服器發出請求後,伺服器就會向客戶端返回響應消息,在確認客戶端已經收到響應消息後,服務端就會關閉網路連接。在這個數據傳輸過程中,並不保存任何歷史信息和狀態信息,因此,HTTP協議也被認為是無狀態的協議。 HTTP1.1和HTTP1.0相比較而言,最大的區別就是增加了持久連接支持。當客戶端使用HTTP1.1協議連接到伺服器後,伺服器就將關閉客戶端連接的主動權交還給客戶端;也就是說,只要不調用Socket類的close方法關閉網路連接,就可以繼續向伺服器發送HTTP請求。 HTTP連接使用的是“請求—響應”的方式(2次握手),不僅在請求時需要先建立連接,而且需要客戶端向伺服器發出請求後,伺服器端才能回復數據。而Socket連接在雙方建立起連接後就可以直接進行數據的傳輸 HTTP協議的特點: 支持B/S及C/S模式; 簡單快速:客戶向伺服器請求服務時,只需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST。 靈活:HTTP 允許傳輸任意類型的數據對象。正在傳輸的類型由Content-Type 加以標記; 無狀態:HTTP 協議是無狀態協議。無狀態是指協議對於事務處理沒有記憶能力。缺少狀態意味著如果後續處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數據量增大。 HTTP協議請求方法: 請求行中包括了請求方法,解釋如下: GET 請求獲取Request-URI 所標識的資源; POST 在Request-URI 所標識的資源後附加新的數據; HEAD 請求獲取由Request-URI 所標識的資源的響應消息報頭 PUT 請求伺服器存儲一個資源,並用Request-URI 作為其標識 DELETE 請求伺服器刪除Request-URI 所標識的資源; TRACE 請求伺服器回送收到的請求信息,主要用於測試或診斷 CONNECT 保留將來使用 OPTIONS 請求查詢伺服器的性能,或者查詢與資源相關的選項和需求 Get與Post請求區別: Post請求可以向伺服器傳送數據,而且數據放在HTML HEADER內一起傳送到服務端URL地址,數據對用戶不可見。而get是把參數數據隊列加到提交的URL中,值和表單內各個欄位一一對應, 例如(/s?w=%C4&inputT=2710) get 傳送的數據量較小,不能大於2KB。post傳送的數據量較大,一般被默認為不受限制。但理論上,IIS4中最大量為80KB,IIS5中為100KB。 get安全性非常低,post安全性較高。 項目結構圖: get方式: get機制用的是在URL地址裡面通過?號間隔,然後以name=value的形式給客戶端傳遞參數。所以首先要在Android工程下的AndroidGetTest.java中onCreate方法定義好其URL地址以及要傳遞的參數,然後通過URL打開一個HttpURLConnection鏈接,此鏈接可以獲得InputStream位元組流對象,也是往服務端輸出和從服務端返回數據的重要過程,而若服務端response.getInputStream.write()往andorid返回信息時候,就可以通過InputStreamReader作轉換,將返回來的數據用BufferReader顯示出來。 具體代碼如下: Servlet端接收數據並返回通知: Android端發送消息並接收Servlet返回的消息: post方式: post傳輸方式不在URL里傳遞,也正好解決了get傳輸量小、容易篡改及不安全等一系列不足。主要是通 過對HttpURLConnection的設置,讓其支持post傳輸方式,然後在通過相關屬性傳遞參數(若需要傳遞中文字元,則可以通過URLEncoder編碼,而在獲取端採用URLDecoder解碼即可)
6. 學習Android 需要什麼程度的 Java 基礎
很多朋友都對學習路線問題感到迷茫,特別是還在上學的朋友們。在這里就詳細的為大家介紹一下。
1.Java基礎
很多朋友一上手就開始學習Android,似乎太著急了一些。Android應用程序開發是以Java語言為基礎的,所以沒有扎實的Java基礎知識,只是機械的照抄別人的代碼,是沒有任何意義的。那麼Java學到什麼程度才算是過關呢?我個人認為至少要掌握以下兩個方面的內容:
a) Java基礎語法:具體的知識點列表可以在這里下載:《Java知識點列表》V1.0。這部分內容沒有討價還價的餘地,必須爛熟於胸。至於具體的學習方法,可以看書或者是看視頻,但是關鍵是要多加練習,無論是書上的練習還是視頻裡面的練習,都需要仔仔細細的完成;
b)設計模式:由於在Android系統的框架層當中,使用了大量的設計模式,如果沒有這個方面的知識,對於Android的理解就會大打折扣。設計模式的種類非常之多,一個一個的全部掌握,是不現實的,必須首先掌握面向對象的基礎設計原則,有了這些基礎原則的支持,就可以舉一反三。這部分內容可以在《Effective Java》和《Agile.Software.Development:Principles,Patterns.and.Practices》這兩本書中找到。
2.Linux基礎知識
大家都知道,Android系統的基礎是Linux操作系統。在開發過程當中,我們也需要使用到一些Linux命令。所以說一些Linux的基礎知識是必須的(話說現在的程序員,不懂Linux都不好意思跟人家打招呼),推薦大家看看《鳥哥的私房菜》這本書,寫的相當不錯;
3.資料庫基礎知識
這個比較簡單,就是一個增刪改查的資料庫操作,可以看一下這本書:《SQL編程練習與解答》
4.網路協議
至少需要學習兩種基礎的協議,HTTP協議與Socket協議;
5.Android基礎知識
有了以上的鋪墊,再來看Android,是不是覺得輕鬆了很多呢?至於基礎知識的學習順序,最好的方法就是按照Android SDK幫助文檔當中的Dev Guide裡面的順序,我的《Android視頻教程》也基本上是按照這個順序錄制的;
6.伺服器端開發知識
由於很多Android應用程序都需要伺服器端的支持,所以掌握一些伺服器端開發知識還是非常有必要的。至於選擇哪一種伺服器端知識進行學習,就比較麻煩了,因為技術的種類實在是太多了:
a)Java EE:就是上面郵件當中所提到的SSH—Struts+Spring+Hibernate。這種技術的優點的功能完整、強大,已經使用了很多年,而且既然大家已經非常熟悉Java了,那麼學習SSH看起來也順理成章。但是使用這種技術開發伺服器端程序,非常麻煩。即使是一些簡單的功能,也可能需要大量的代碼和配置文件來實現;
b)PHP:簡單易學,開發快速。但是我們需要多學一種語言,是否得不償失,就要大家自己判斷了;
c).NET:這項技術的特點和Java EE差不多,但是要想掌握.NET,則需要掌握c#,也是個麻煩的事情;
d)ruby on rails:這是我個人最喜歡的伺服器端技術,簡潔,優雅,寥寥幾行代碼,就可以實現很復雜的功能,但是這需要Ruby語言知識作為基礎;
至於選擇哪一種技術,就看大家自己的判斷了。
夢想:要成為一個專業的Android開發者,以上的這些知識都必不可少。看起來好像很多,多的可怕。所以還是那句話--「耐心,耐心很重要」。
學習一門專業要很長時間啊,耐心很重要,很多朋友也來問我C4D,能感覺到大家都想急著學會,其實要有長時間的積累才能有長遠進步,Android開發,最近公司要做程序,也涉及到,如果UI設計師的我學會了Android,是不是可以獨立做開發了。
7. 面試android的時候面試官提問"對網路通信協議熟悉嗎對socket和http了解嗎能解釋下嗎",跪求幫助
我學網路專業,對網路通信協議還是比較熟悉的,「先講下7層協議,然後從7層協議中引出socket和http」
套接字(socket)是通信的基石,是支持TCP/IP協議的網路通信的基本操作單元。它是網路通信過程中端點的抽象表示,包含進行網路通信必須的五種信息:連接使用的協議,本地主機的IP地址,本地進程的協議埠,遠地主機的IP地址,遠地進程的協議埠。
應用層通過傳輸層進行數據通信時,TCP會遇到同時為多個應用程序進程提供並發服務的問題。多個TCP連接或多個應用程序進程可能需要通過同一個
TCP協議埠傳輸數據。為了區別不同的應用程序進程和連接,許多計算機操作系統為應用程序與TCP/IP協議交互提供了套接字(Socket)介面。應用層可以和傳輸層通過Socket介面,區分來自不同應用程序進程或網路連接的通信,實現數據傳輸的並發服務。
建立Socket連接至少需要一對套接字,其中一個運行於客戶端,稱為ClientSocket ,另一個運行於伺服器端,稱為ServerSocket 。
套接字之間的連接過程分為三個步驟:伺服器監聽,客戶端請求,連接確認。
伺服器監聽:伺服器端套接字並不定位具體的客戶端套接字,而是處於等待連接的狀態,實時監控網路狀態,等待客戶端的連接請求。
客戶端請求:指客戶端的套接字提出連接請求,要連接的目標是伺服器端的套接字。為此,客戶端的套接字必須首先描述它要連接的伺服器的套接字,指出伺服器端套接字的地址和埠號,然後就向伺服器端套接字提出連接請求。
連接確認:當伺服器端套接字監聽到或者說接收到客戶端套接字的連接請求時,就響應客戶端套接字的請求,建立一個新的線程,把伺服器端套接字的描述發給客戶端,一旦客戶端確認了此描述,雙方就正式建立連接。而伺服器端套接字繼續處於監聽狀態,繼續接收其他客戶端套接字的連接請求。
HTTP協議即超文本傳送協議(Hypertext Transfer Protocol
),是Web聯網的基礎,也是手機聯網常用的協議之一,HTTP協議是建立在TCP協議之上的一種應用。
HTTP連接最顯著的特點是客戶端發送的每次請求都需要伺服器回送響應,在請求結束後,會主動釋放連接。從建立連接到關閉連接的過程稱為「一次連接」。
1)在HTTP 1.0中,客戶端的每次請求都要求建立一次單獨的連接,在處理完本次請求後,就自動釋放連接。
2)在HTTP
1.1中則可以在一次連接中處理多個請求,並且多個請求可以重疊進行,不需要等待一個請求結束後再發送下一個請求。
由於HTTP在每次請求結束後都會主動釋放連接,因此HTTP連接是一種「短連接」,要保持客戶端程序的在線狀態,需要不斷地向伺服器發起連接請求。通常的做法是即時不需要獲得任何數據,客戶端也保持每隔一段固定的時間向伺服器發送一次「保持連接」的請求,伺服器在收到該請求後對客戶端進行回復,表明知道客戶端「在線」。若伺服器長時間無法收到客戶端的請求,則認為客戶端「下線」,若客戶端長時間無法收到伺服器的回復,則認為網路已經斷開。
由於通常情況下Socket連接就是TCP連接,因此Socket連接一旦建立,通信雙方即可開始相互發送數據內容,直到雙方連接斷開。但在實際網路應用中,客戶端到伺服器之間的通信往往需要穿越多個中間節點,例如路由器、網關、防火牆等,大部分防火牆默認會關閉長時間處於非活躍狀態的連接而導致
Socket 連接斷連,因此需要通過輪詢告訴網路,該連接處於活躍狀態。
而HTTP連接使用的是「請求—響應」的方式,不僅在請求時需要先建立連接,而且需要客戶端向伺服器發出請求後,伺服器端才能回復數據。
很多情況下,需要伺服器端主動向客戶端推送數據,保持客戶端與伺服器數據的實時與同步。此時若雙方建立的是Socket連接,伺服器就可以直接將數據傳送給客戶端;若雙方建立的是HTTP連接,則伺服器需要等到客戶端發送一次請求後才能將數據傳回給客戶端,因此,客戶端定時向伺服器端發送連接請求,不僅可以保持在線,同時也是在「詢問」伺服器是否有新的數據,如果有就將數據傳給客戶端。
8. 求教Android studio socket通信
有現成的, android socket通訊代碼, 不過是eclipse項目, 可以轉成android studio項目
是基於socket的文件收發代碼