Android學習筆記(七)之Android socket通信-解決中文亂碼

目前想讓手機客戶端和服務器保持長連接故選擇socket進行通信

首先是新建一個socket服務器端

 

[java]
/**
 * Main.java
 * 版權所有(C) 2012 
 * 創建:cuiran 2012-09-14 08:56:16
 */ 
package com.wpndemo.socket; 
import java.io.BufferedReader;   
import java.io.BufferedWriter;   
import java.io.IOException;   
import java.io.InputStreamReader;   
import java.io.OutputStreamWriter;   
import java.io.PrintWriter;   
import java.net.ServerSocket;   
import java.net.Socket;   
import java.util.ArrayList;   
import java.util.List;   
import java.util.concurrent.ExecutorService;   
import java.util.concurrent.Executors;   
 
/**
 * TODO
 * @author cuiran
 * @version TODO
 */ 
public class Main { 
 
    private static final int PORT = 8090;   
    private List<Socket> mList = new ArrayList<Socket>();   
    private ServerSocket server = null;   
    private ExecutorService mExecutorService = null; //thread pool    
    public static final String bm="utf-8"; //全局定義,以適應系統其他部分 
 
    public static void main(String[] args) {   
        new Main();   
    }   
    public Main() {   
        try {   
            server = new ServerSocket(PORT);   
            mExecutorService = Executors.newCachedThreadPool();  //create a thread pool    
            System.out.print("server start …");   
            Socket client = null;   
            while(true) {   
                client = server.accept();   
                mList.add(client);   
                mExecutorService.execute(new Service(client)); //start a new thread to handle the connection    
            }   
        }catch (Exception e) {   
            e.printStackTrace();   
        }   
    }   
    class Service implements Runnable {   
            private Socket socket;   
            private BufferedReader in = null;   
            private String msg = "";   
               
            public Service(Socket socket) {   
                this.socket = socket;   
                try {   
                    in = new BufferedReader(new InputStreamReader(socket.getInputStream(),bm));   
                    msg = "user" +this.socket.getInetAddress() + "come toal:"   
                        +mList.size();   
                    this.sendmsg();   
                } catch (IOException e) {   
                    e.printStackTrace();   
                }   
                   
            }   
   
            @Override   
            public void run() {   
                // TODO Auto-generated method stub    
                try {   
                    while(true) {   
                        if((msg = in.readLine())!= null) {   
                            if(msg.equals("exit")) {   
                                System.out.println("ssssssss");   
                                mList.remove(socket);   
                                in.close();   
                                msg = "user:" + socket.getInetAddress()   
                                    + "exit total:" + mList.size();   
                                socket.close();   
                                this.sendmsg();   
                                break;   
                            } else {   
                                System.out.println("msg="+msg); 
                                msg = socket.getInetAddress() + ":" + msg;   
                                this.sendmsg();   
                            }   
                        }   
                    }   
                } catch (Exception e) {   
                    e.printStackTrace();   
                }   
            }   
             
           public void sendmsg() {   
               System.out.println(msg);   
               int num =mList.size();   
               for (int index = 0; index < num; index ++) {   
                   Socket mSocket = mList.get(index);   
                   PrintWriter pout = null;   
                   try {   
                       pout = new PrintWriter(new BufferedWriter(   
                               new OutputStreamWriter(mSocket.getOutputStream(),bm)),true);   
                       pout.println(msg);   
                   }catch (IOException e) {   
                       e.printStackTrace();   
                   }   
               }   
           }   
        }  

然後是新建一個android工程:

在文件【AndroidManifest.xml】添加內容:

[html] 
<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.cayden.socket" 
    android:versionCode="1" 
    android:versionName="1.0" > 
 
    <uses-sdk android:minSdkVersion="8" /> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
    <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission> 
    <application 
        android:icon="@drawable/ic_launcher" 
        android:label="@string/app_name" > 
        <activity 
            android:name=".SocketActivity" 
            android:label="@string/app_name" > 
            <intent-filter> 
                <action android:name="android.intent.action.MAIN" /> 
 
                <category android:name="android.intent.category.LAUNCHER" /> 
            </intent-filter> 
        </activity> 
    </application> 
 
</manifest> 

然後是創建類:

[java] 
package com.cayden.socket; 
 
import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 
import java.io.PrintWriter; 
import java.io.UnsupportedEncodingException; 
import java.net.Socket; 
 
import com.cayden.util.Conf; 
 
import android.app.Activity; 
import android.app.AlertDialog; 
import android.content.DialogInterface; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.Message; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 
 
public class SocketActivity extends Activity implements Runnable { 
     
    private TextView tv_msg = null;   
    private EditText ed_msg = null;   
    private Button btn_send = null;   
//    private Button btn_login = null;    
    private static final String HOST = "219.143.49.189";   
    private static final int PORT = 8403;   
    private Socket socket = null;   
    private BufferedReader in = null;   
    private PrintWriter out = null;   
    private String content = "";   
 
    public static final String bm="utf-8"; //全局定義,以適應系統其他部分 
 
 
     
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
         
        tv_msg = (TextView) findViewById(R.id.TextView);   
        ed_msg = (EditText) findViewById(R.id.EditText01);   
//        btn_login = (Button) findViewById(R.id.Button01);    
        btn_send = (Button) findViewById(R.id.sendBtn);   
   
        try {   
            socket = new Socket(HOST, PORT);   
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));   
            out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(   
                    socket.getOutputStream(),bm)), true); 
            Log.i(Conf.TAG, "連接成功"); 
        } catch (IOException ex) {   
            ex.printStackTrace();  
            Log.i(Conf.TAG, "出現異常:"+ex.getMessage()); 
            ShowDialog("login exception" + ex.getMessage());   
        }   
        btn_send.setOnClickListener(new Button.OnClickListener() {   
   
            @Override   
            public void onClick(View v) {   
                // TODO Auto-generated method stub    
                String msg = ed_msg.getText().toString();   
                if (socket.isConnected()) {   
                    if (!socket.isOutputShutdown()) {   
                        try { 
                            out.println(msg); 
                        } catch (Exception e) { 
                         
                            e.printStackTrace(); 
                        }   
                    }   
                }   
            }   
        });   
        new Thread(SocketActivity.this).start();   
 
    } 
     
    public void ShowDialog(String msg) {   
        new AlertDialog.Builder(this).setTitle("notification").setMessage(msg)   
                .setPositiveButton("ok", new DialogInterface.OnClickListener() {   
   
                    @Override   
                    public void onClick(DialogInterface dialog, int which) {   
                       
   
                    }   
                }).show();   
    }   
 
 
    @Override 
    public void run() { 
        // TODO Auto-generated method stub 
        try {   
            while (true) {   
                if (socket.isConnected()) {   
                    if (!socket.isInputShutdown()) {   
                        if ((content = in.readLine()) != null) {   
                            content += "\n";   
                            mHandler.sendMessage(mHandler.obtainMessage());   
                        } else {   
   
                        }   
                    }   
                }   
            }   
        } catch (Exception e) {   
            e.printStackTrace();   
        }   
 
    } 
     public Handler mHandler = new Handler() {   
            public void handleMessage(Message msg) {   
                super.handleMessage(msg);   
                tv_msg.setText(tv_msg.getText().toString() + content);   
            }   
        };   
 

在後續中會增加采用mina框架來實現通信。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。