Android Socket編程學習筆記,android學習筆記

來源:互聯網
上載者:User

Android Socket編程學習筆記,android學習筆記

通常也稱作"通訊端",用於描述IP地址和連接埠,是一個通訊鏈的控制代碼。在Internet上的主機一般運行了多個服務軟體,同時提供幾種服務。每種服務都開啟一個Socket,並綁定到一個連接埠上,不同的連接埠對應於不同的服務。

       網路上的兩個程式通過一個雙向的通訊串連實現資料的交換,這個雙向鏈路的一端稱為一個Socket。Socket通常用來實現客戶方和服務方的串連。Socket是TCP/IP協議的一個十分流行的編程介面,一個Socket由一個IP地址和一個連接埠號碼唯一確定。

       在java中,Socket和ServerSocket類庫位於java .net包中。ServerSocket用於伺服器端,Socket是建立網路連接時使用的。在串連成功時,應用程式兩端都會產生一個Socket執行個體,操作這個執行個體,完成所需的會話。

       下面通過一個極為簡單的用戶端和服務端的串連例子示範下最基本的android socket通訊:

       服務端的代碼,在服務端特定的連接埠9999監聽用戶端請求,一旦有請求,便會執行,而後繼續監聽。使用accept()這個阻塞函數,就是該方法被調用後一直等待用戶端的請求,直到有請求且串連到同一個連接埠,accept()返回一個對應於用戶端的Socket。本例中很簡單,服務端不斷監聽,一旦有請求就輸出一段資訊:

  1. <font color="#000"><font face="Arial"><span style="font-family:Comic Sans MS;font-size:18px;">import java.io.BufferedWriter;
  2. import java.io.IOException;
  3. import java.io.OutputStreamWriter;
  4. import java.net.ServerSocket;
  5. import java.net.Socket;

  6. public class Main {
  7.         private static final int PORT = 9999;
  8.         public static void main(String[] args) {

  9.                 try {
  10.                         // 執行個體化伺服器通訊端 設定連接埠號碼9999
  11.                         ServerSocket server = new ServerSocket(PORT);
  12.                         while (true) {
  13.                                 Socket socket = server.accept();
  14.                                 // 擷取輸出資料流
  15.                                 BufferedWriter writer = new BufferedWriter(
  16.                                                 new OutputStreamWriter(socket.getOutputStream()));
  17.                                 // 寫字串
  18.                                 writer.write("這是一段來自伺服器的問候:Hello沃德!");
  19.                                 writer.flush();
  20.                                 writer.close();
  21.                         }
  22.                 } catch (IOException e) {
  23.                         // TODO Auto-generated catch block
  24.                         e.printStackTrace();
  25.                 }

  26.         }

  27. }

  28. </span></font></font>
複製代碼下面是android用戶端的相關內容,介面有一個按鈕,點擊後請求服務端的制定連接埠,然後顯示服務端的內容,值得注意的是在android4.0以上的系統中,是不允許在主線程裡面去執行網路相關的請求,否則會報錯:NetworkOnMainThreadException,所以本例中新開闢一個線程初始化socket的內容:

  1. <font color="#000"><font face="Arial"><span style="font-family:Comic Sans MS;font-size:18px;">package com.example.socketdemo;

  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;
  5. import java.net.Socket;
  6. import java.net.UnknownHostException;
  7. import android.annotation.SuppressLint;
  8. import android.app.Activity;
  9. import android.os.Bundle;
  10. import android.os.Handler;
  11. import android.os.Message;
  12. import android.util.Log;
  13. import android.view.View;
  14. import android.view.View.OnClickListener;
  15. import android.widget.Button;
  16. import android.widget.TextView;

  17. @SuppressLint("HandlerLeak")
  18. public class SocketDemo extends Activity {
  19.         /** Called when the activity is first created. */
  20.         private Button btn_receive;
  21.         private TextView txt;
  22.         private String line;
  23.         
  24.         private static final String HOST = "192.168.1.101";  
  25.         private static final int PORT = 9999;  


  26.         @Override
  27.         public void onCreate(Bundle savedInstanceState) {
  28.                 super.onCreate(savedInstanceState);
  29.                 setContentView(R.layout.activity_main);
  30.                 initControl();
  31.         }

  32.         private void initControl() {
  33.                 btn_receive = (Button) findViewById(R.id.btn_receive);
  34.                 txt = (TextView) findViewById(R.id.txt);
  35.                 btn_receive.setOnClickListener(new ReceiverListener());
  36.         }

  37.         
  38.         @SuppressLint("HandlerLeak")
  39.         class ReceiverListener implements OnClickListener {

  40.                 @Override
  41.                 public void onClick(View v) {
  42.                         // TODO Auto-generated method stub
  43.                         new Thread() {
  44.                                 @Override
  45.                                 public void run() {
  46.                                         // 執行完畢後給handler發送一個空訊息
  47.                                         try {
  48.                                                 // 執行個體化Socket
  49.                                                 Socket socket = new Socket(HOST, PORT);
  50.                                                 // 獲得輸入資料流
  51.                                                 BufferedReader br = new BufferedReader(
  52.                                                                 new InputStreamReader(socket.getInputStream()));
  53.                                                 line = br.readLine();
  54.                                                 br.close();
  55.                                         } catch (UnknownHostException e) {
  56.                                                 // TODO Auto-generated catch block
  57.                                                 e.printStackTrace();
  58.                                         } catch (IOException e) {
  59.                                                 // TODO Auto-generated catch block
  60.                                                 e.printStackTrace();
  61.                                         }
  62.                                         handler.sendEmptyMessage(0);
  63.                                 }
  64.                         }.start();
  65.                 }

  66.         }

  67.         // 定義Handler對象
  68.         private Handler handler = new Handler() {
  69.                 @Override
  70.                 // 當有訊息發送出來的時候就執行Handler的這個方法
  71.                 public void handleMessage(Message msg) {
  72.                         super.handleMessage(msg);
  73.                         // 處理UI
  74.                         txt.setText(line);
  75.                         Log.i("PDA", "----->" + line);
  76.                 }
  77.         };

  78. }

  79. </span></font></font>
複製代碼如下:

                                          
另外在設定檔中記得加上許可權:<uses-permission android:name="android.permission.INTERNET">
Android Socket編程問題

最近,我也在試SOCKET服務端與用戶端,試了我一個星期,終於試成了,鬆了口氣。
我發現你做的是Socket用戶端,這個用戶端的Socket串連、讀、寫都要求在子線程中。
只要把你的SendMsg放到一個線程中就可以了:很簡單。
在它後而再加一個子程式SendMsg1,你調用它個子程式就行了。
void SendMsg1(final String msg)
{ // 子線程中讀
new Thread(new Runnable()
{
@Override
publicvoid run()
{
SendMsg(msg); // 調用你原來的子程式
}
}).start();
}
你的安卓程式如果在模擬器中執行,IP地址要處理好,因為模擬器把
電腦的IP 假設為 10.0.2.2. 模擬器是 10.0.2.15, 否則通不了。
我是服務端與用戶端在同一個程式試的,地址用 127.0.0.1或10.0.2.15
就可以的。
 
android socket編程中,網路怎設定?

原則上,對socket的操作(開啟/讀寫)應該在子線程中進行。你放在UI的主線程裡操作不對。
另外你都沒貼log出來或者說明log裡列印的是什麼exception,那樣更有針對性。
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.