Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android Socket編程學習筆記

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. 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. 復制代碼 下面是android客戶端的相關內容,界面有一個按鈕,點擊後請求服務端的制定端口,然後顯示服務端的內容,值得注意的是在android4.0以上的系統中,是不允許在主線程裡面去執行網絡相關的請求,否則會報錯:NetworkOnMainThreadException,所以本例中新開辟一個線程初始化socket的內容:

    1. 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. private static final String HOST = "192.168.1.101";
    24. private static final int PORT = 9999;


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

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


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

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

    64. }

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

    76. }

    77. 復制代碼 效果圖如下:

      \ \
      另外在配置文件中記得加上權限:
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved