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

来源:互联网 发布:python基础教程 第2版 编辑:程序博客网 时间:2024/06/06 01:51

目前想让手机客户端和服务器保持长连接故选择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();      }  @Overridepublic void run() {// TODO Auto-generated method stubtry {              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框架来实现通信。

原创粉丝点击