下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

学习Android socket通信之如何解决中文乱码

作者:课课家教育     来源: http://www.kokojia.com点击数:2814发布时间: 2016-05-19 15:14:17

标签: androidsocketi学习Android

  socket是网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。

学习Android socket通信之如何解决中文乱码_android_socketi_学习Android_课课家

         客户软件将插头插到不同编号的插座,就可以得到不同的服务最重要的是,Socket是面向客户/服务器模型而设计的,针对客户和服务器程序提供不同的Socket系统调用。客户随机申请一个Socket,系统为之分配一个Socket号;服务器拥有全局公认的Socket,任何客户都可以向它发出连接请求和信息请求。Socket利用客户/服务器模式巧妙地解决了进程之间建立通信连接的问题。服务器Socket半相关为全局所公认非常重要。

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

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

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 mList = new ArrayList();  
    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】添加内容:

AndroidManifest.XML

  然后是创建类:

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);  
	        }  
	    };  

}

  通过上文可以知道要实现手机客户端和服务器保持长连接需要选择socket通信,整个流程下来首先要做的是新建一个socket服务器端,再新建一个android工程,最后创建一个类。在后续中会增加采用mina框架来实现通信。

赞(21)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程