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

    作者:课课家教育更新于: 2016-05-19 14:07:31

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

课课家教育

未登录