android socket編程實例

android客戶端通過socket與服務器進行通信可以分爲以下幾步:

應用程序與服務器通信可以採用兩種模式:TCP可靠通信 和UDP不可靠通信。

(1)通過IP地址和端口實例化Socket,請求連接服務器:

     socket = new Socket(HOST, PORT);   //host:爲服務器的IP地址  port:爲服務器的端口號

(2)獲取Socket流以進行讀寫,並把流包裝進BufferWriter或者PrintWriter:

   PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())),true);  

   這裏涉及了三個類:socket.getOutputStream得到socket的輸出字節流,OutputStreamWriter是字節流向字符流轉換的橋樑,BufferWriter是字符流,然後再包裝進PrintWriter。

(3)對Socket進行讀寫

     if (socket.isConnected()) {
                    if (!socket.isOutputShutdown()) {
                        out.println(msg);
                    }
                }

(4)關閉打開的流

      out.close();

 在寫代碼的過程中一定要注意對socket  輸入流  輸出流的關閉

下面是一個簡單的例子:

main.xml

     

    1. <?xml version="1.0" encoding="utf-8"?>   
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     
    3.     android:orientation="vertical"    
    4.     android:layout_width="fill_parent"     
    5.     android:layout_height="fill_parent">     
    6.     <TextView    
    7.         android:id="@+id/TextView"    
    8.         android:singleLine="false"     
    9.         android:layout_width="fill_parent"     
    10.         android:layout_height="wrap_content" />     
    11.     <EditText android:hint="content"    
    12.         android:id="@+id/EditText01"     
    13.         android:layout_width="fill_parent"     
    14.         android:layout_height="wrap_content">     
    15.     </EditText>     
    16.     <Button    
    17.         android:text="send"    
    18.         android:id="@+id/Button02"     
    19.         android:layout_width="fill_parent"     
    20.         android:layout_height="wrap_content">     
    21.     </Button>     
    22. </LinearLayout>    

下面是android客戶端的源代碼:

     

    1. package com.android.SocketDemo;   
    2.    
    3. import java.io.BufferedReader;   
    4. import java.io.BufferedWriter;   
    5. import java.io.IOException;   
    6. import java.io.InputStreamReader;   
    7. import java.io.OutputStreamWriter;   
    8. import java.io.PrintWriter;   
    9. import java.net.Socket;   
    10.    
    11. import android.app.Activity;   
    12. import android.app.AlertDialog;   
    13. import android.content.DialogInterface;   
    14. import android.os.Bundle;   
    15. import android.os.Handler;   
    16. import android.os.Message;   
    17. import android.view.View;   
    18. import android.widget.Button;   
    19. import android.widget.EditText;   
    20. import android.widget.TextView;   
    21.    
    22. public class SocketDemo extends Activity implements Runnable {   
    23.     private TextView tv_msg = null;   
    24.     private EditText ed_msg = null;   
    25.     private Button btn_send = null;   
    26. //    private Button btn_login = null;   
    27.     private static final String HOST = "192.168.1.223";   
    28.     private static final int PORT = 9999;   
    29.     private Socket socket = null;   
    30.     private BufferedReader in = null;   
    31.     private PrintWriter out = null;   
    32.     private String content = "";   
    33.    
    34.     /** Called when the activity is first created. */   
    35.     @Override   
    36.     public void onCreate(Bundle savedInstanceState) {   
    37.         super.onCreate(savedInstanceState);   
    38.         setContentView(R.layout.main);   
    39.    
    40.         tv_msg = (TextView) findViewById(R.id.TextView);   
    41.         ed_msg = (EditText) findViewById(R.id.EditText01);   
    42. //        btn_login = (Button) findViewById(R.id.Button01);   
    43.         btn_send = (Button) findViewById(R.id.Button02);   
    44.    
    45.         try {   
    46.             socket = new Socket(HOST, PORT);   
    47.             in = new BufferedReader(new InputStreamReader(socket.getInputStream()));   
    48.             out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(   
    49.                     socket.getOutputStream())), true);   
    50.         } catch (IOException ex) {   
    51.             ex.printStackTrace();   
    52.             ShowDialog("login exception" + ex.getMessage());   
    53.         }   
    54.         btn_send.setOnClickListener(new Button.OnClickListener() {   
    55.    
    56.             @Override   
    57.             public void onClick(View v) {   
    58.                 // TODO Auto-generated method stub   
    59.                 String msg = ed_msg.getText().toString();   
    60.                 if (socket.isConnected()) {   
    61.                     if (!socket.isOutputShutdown()) {   
    62.                         out.println(msg);   
    63.                     }   
    64.                 }   
    65.             }   
    66.         });   
    67.         new Thread(SocketDemo.this).start();   
    68.     }   
    69.    
    70.     public void ShowDialog(String msg) {   
    71.         new AlertDialog.Builder(this).setTitle("notification").setMessage(msg)   
    72.                 .setPositiveButton("ok"new DialogInterface.OnClickListener() {   
    73.    
    74.                     @Override   
    75.                     public void onClick(DialogInterface dialog, int which) {   
    76.                         // TODO Auto-generated method stub   
    77.    
    78.                     }   
    79.                 }).show();   
    80.     }   
    81.    
    82.     public void run() {   
    83.         try {   
    84.             while (true) {   
    85.                 if (socket.isConnected()) {   
    86.                     if (!socket.isInputShutdown()) {   
    87.                         if ((content = in.readLine()) != null) {   
    88.                             content += "\n";   
    89.                             mHandler.sendMessage(mHandler.obtainMessage());   
    90.                         } else {   
    91.    
    92.                         }   
    93.                     }   
    94.                 }   
    95.             }   
    96.         } catch (Exception e) {   
    97.             e.printStackTrace();   
    98.         }   
    99.     }   
    100.    
    101.     public Handler mHandler = new Handler() {   
    102.         public void handleMessage(Message msg) {   
    103.             super.handleMessage(msg);   
    104.             tv_msg.setText(tv_msg.getText().toString() + content);   
    105.         }   
    106.     };   
    107. }   


下面是服務器端得java代碼:

     

    1. import java.io.BufferedReader;   
    2. import java.io.BufferedWriter;   
    3. import java.io.IOException;   
    4. import java.io.InputStreamReader;   
    5. import java.io.OutputStreamWriter;   
    6. import java.io.PrintWriter;   
    7. import java.net.ServerSocket;   
    8. import java.net.Socket;   
    9. import java.util.ArrayList;   
    10. import java.util.List;   
    11. import java.util.concurrent.ExecutorService;   
    12. import java.util.concurrent.Executors;   
    13.    
    14.    
    15. public class Main {   
    16.     private static final int PORT = 9999;   
    17.     private List<Socket> mList = new ArrayList<Socket>();   
    18.     private ServerSocket server = null;   
    19.     private ExecutorService mExecutorService = null; //thread pool   
    20.        
    21.     public static void main(String[] args) {   
    22.         new Main();   
    23.     }   
    24.     public Main() {   
    25.         try {   
    26.             server = new ServerSocket(PORT);   
    27.             mExecutorService = Executors.newCachedThreadPool();  //create a thread pool   
    28.             System.out.print("server start ...");   
    29.             Socket client = null;   
    30.             while(true) {   
    31.                 client = server.accept();   
    32.                 mList.add(client);   
    33.                 mExecutorService.execute(new Service(client)); //start a new thread to handle the connection   
    34.             }   
    35.         }catch (Exception e) {   
    36.             e.printStackTrace();   
    37.         }   
    38.     }   
    39.     class Service implements Runnable {   
    40.             private Socket socket;   
    41.             private BufferedReader in = null;   
    42.             private String msg = "";   
    43.                
    44.             public Service(Socket socket) {   
    45.                 this.socket = socket;   
    46.                 try {   
    47.                     in = new BufferedReader(new InputStreamReader(socket.getInputStream()));   
    48.                     msg = "user" +this.socket.getInetAddress() + "come toal:"   
    49.                         +mList.size();   
    50.                     this.sendmsg();   
    51.                 } catch (IOException e) {   
    52.                     e.printStackTrace();   
    53.                 }   
    54.                    
    55.             }   
    56.    
    57.             @Override   
    58.             public void run() {   
    59.                 // TODO Auto-generated method stub   
    60.                 try {   
    61.                     while(true) {   
    62.                         if((msg = in.readLine())!= null) {   
    63.                             if(msg.equals("exit")) {   
    64.                                 System.out.println("ssssssss");   
    65.                                 mList.remove(socket);   
    66.                                 in.close();   
    67.                                 msg = "user:" + socket.getInetAddress()   
    68.                                     + "exit total:" + mList.size();   
    69.                                 socket.close();   
    70.                                 this.sendmsg();   
    71.                                 break;   
    72.                             } else {   
    73.                                 msg = socket.getInetAddress() + ":" + msg;   
    74.                                 this.sendmsg();   
    75.                             }   
    76.                         }   
    77.                     }   
    78.                 } catch (Exception e) {   
    79.                     e.printStackTrace();   
    80.                 }   
    81.             }   
    82.              
    83.            public void sendmsg() {   
    84.                System.out.println(msg);   
    85.                int num =mList.size();   
    86.                for (int index = 0; index < num; index ++) {   
    87.                    Socket mSocket = mList.get(index);   
    88.                    PrintWriter pout = null;   
    89.                    try {   
    90.                        pout = new PrintWriter(new BufferedWriter(   
    91.                                new OutputStreamWriter(mSocket.getOutputStream())),true);   
    92.                        pout.println(msg);   
    93.                    }catch (IOException e) {   
    94.                        e.printStackTrace();   
    95.                    }   
    96.                }   
    97.            }   
    98.         }       
    99. }   
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章