Android学习札记(七)之Android socket通信-解决中文乱码

Android学习笔记(七)之Android socket通信-解决中文乱码

目前想让手机客户端和服务器保持长连接故选择socket进行通信

首先是新建一个socket服务器端

 

/**
 * 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】添加内容:

<?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>


然后是创建类:

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框架来实现通信。