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

[html] view plain copy

 

 
   
  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客户端的源代码:

[java] view plain copy

 

 
   
  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代码:

[java] view plain copy

 

 
   
  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. }