• Android笔记:Socket客户端收发数据


    client.xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
    
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true"
            android:text="接收到的信息" />
    
        <TextView
            android:id="@+id/tv1"
            android:layout_width="150dp"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true"
            android:layout_weight="0.25"
            android:text="" />
    
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true"
            android:text="请输入发送内容" />
    
        <EditText
            android:id="@+id/editText1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:ems="10" >
    
            <requestFocus />
        </EditText>
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >
             <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="发送" />
              <Button
            android:id="@+id/button2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="设置" />
            
        </LinearLayout>
    
      
    
    </LinearLayout>

    client.java

    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.Socket;
    import java.net.SocketException;
    import java.net.UnknownHostException;
    
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.app.Activity;
    import android.content.Context;
    import android.content.Intent;
    import android.content.SharedPreferences;
    import android.util.Log;
    import android.view.Menu;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;
    
    public class Client extends Activity {
        private String TAG = "===Client===";
        private String TAG1 = "===Send===";
        private TextView tv1 = null;
        Handler mhandler;
        Handler mhandlerSend;
        boolean isRun = true;
        EditText edtsendms;
        Button btnsend;
        private String sendstr = "";
        SharedPreferences sp;
        Button btnSetting;
        private Context ctx;
        Socket socket;
        PrintWriter out;
        BufferedReader in;
        SocThread socketThread;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.client);
            tv1 = (TextView) findViewById(R.id.tv1);
            btnsend = (Button) findViewById(R.id.button1);
            ctx = Client.this;
            edtsendms = (EditText) findViewById(R.id.editText1);
            btnSetting = (Button) findViewById(R.id.button2);
            mhandler = new Handler() {
                @Override
                public void handleMessage(Message msg) {
                    try {
                        MyLog.i(TAG, "mhandler接收到msg=" + msg.what);
                        if (msg.obj != null) {
                            String s = msg.obj.toString();
                            if (s.trim().length() > 0) {
                                MyLog.i(TAG, "mhandler接收到obj=" + s);
                                MyLog.i(TAG, "开始更新UI");
                                tv1.append("Server:" + s);
                                MyLog.i(TAG, "更新UI完毕");
                            } else {
                                Log.i(TAG, "没有数据返回不更新");
                            }
                        }
                    } catch (Exception ee) {
                        MyLog.i(TAG, "加载过程出现异常");
                        ee.printStackTrace();
                    }
                }
            };
            mhandlerSend = new Handler() {
                @Override
                public void handleMessage(Message msg) {
                    try {
                        MyLog.i(TAG, "mhandlerSend接收到msg.what=" + msg.what);
                        String s = msg.obj.toString();
                        if (msg.what == 1) {
                            tv1.append("
     ME: " + s + "      发送成功");
                        } else {
                            tv1.append("
     ME: " + s + "     发送失败");
                        }
                    } catch (Exception ee) {
                        MyLog.i(TAG, "加载过程出现异常");
                        ee.printStackTrace();
                    }
                }
            };
            startSocket();
            btnsend.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    // 发送数据
                    MyLog.i(TAG, "准备发送数据");
                    sendstr = edtsendms.getText().toString().trim();
                    socketThread.Send(sendstr);
    
                }
            });
            btnSetting.setOnClickListener(new OnClickListener() {
    
                @Override
                public void onClick(View v) {
                    // 跳转到设置界面
                    Intent intent = new Intent();
                    intent.setClass(Client.this, Setting.class);
                    MyLog.i(TAG, "跳转至设置界面");
                    ctx.startActivity(intent);// 打开新界面
    
                }
            });
    
        }
    
        public void startSocket() {
            socketThread = new SocThread(mhandler, mhandlerSend, ctx);
            socketThread.start();
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.client, menu);
            return true;
        }
    
        private void stopSocket() {
            socketThread.isRun = false;
            socketThread.close();
            socketThread = null;
            MyLog.i(TAG, "Socket已终止");
        }
    
        @Override
        protected void onStart() {
            super.onStart();
            Log.e(TAG, "start onStart~~~");
        }
    
        @Override
        protected void onRestart() {
            super.onRestart();
            Log.e(TAG, "start onRestart~~~");
            startSocket();
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            Log.e(TAG, "start onResume~~~");
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            Log.e(TAG, "start onPause~~~");
        }
    
        @Override
        protected void onStop() {
            super.onStop();
            Log.e(TAG, "start onStop~~~");
            stopSocket();
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            Log.e(TAG, "start onDestroy~~~");
    
        }
    
    }

    socket线程:SocThread.java

    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.Socket;
    import java.net.UnknownHostException;
    
    import android.content.Context;
    import android.content.SharedPreferences;
    import android.os.Handler;
    import android.os.Message;
    import android.util.Log;
    
    public class SocThread extends Thread {
        private String ip = "10.0.0.113";
        private int port = 13000;
        private String TAG = "socket thread";
        private int timeout = 10000;
    
        public Socket client = null;
        PrintWriter out;
        BufferedReader in;
        public boolean isRun = true;
        Handler inHandler;
        Handler outHandler;
        Context ctx;
        private String TAG1 = "===Send===";
        SharedPreferences sp;
    
        public SocThread(Handler handlerin, Handler handlerout, Context context) {
            inHandler = handlerin;
            outHandler = handlerout;
            ctx = context;
            MyLog.i(TAG, "创建线程socket");
        }
    
        /**
         * 连接socket服务器
         */
        public void conn() {
    
            try {
                initdate();
                Log.i(TAG, "连接中……");
                client = new Socket(ip, port);
                client.setSoTimeout(timeout);// 设置阻塞时间
                MyLog.i(TAG, "连接成功");
                in = new BufferedReader(new InputStreamReader(
                        client.getInputStream()));
                out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(
                        client.getOutputStream())), true);
                MyLog.i(TAG, "输入输出流获取成功");
            } catch (UnknownHostException e) {
                MyLog.i(TAG, "连接错误UnknownHostException 重新获取");
                e.printStackTrace();
                conn();
            } catch (IOException e) {
                MyLog.i(TAG, "连接服务器io错误");
                e.printStackTrace();
            } catch (Exception e) {
                MyLog.i(TAG, "连接服务器错误Exception" + e.getMessage());
                e.printStackTrace();
            }
        }
    
        public void initdate() {
            sp = ctx.getSharedPreferences("SP", ctx.MODE_PRIVATE);
            ip = sp.getString("ipstr", ip);
            port = Integer.parseInt(sp.getString("port", String.valueOf(port)));
            MyLog.i(TAG, "获取到ip端口:" + ip + ";" + port);
        }
    
        /**
         * 实时接受数据
         */
        @Override
        public void run() {
            MyLog.i(TAG, "线程socket开始运行");
            conn();
            MyLog.i(TAG, "1.run开始");
            String line = "";
            while (isRun) {
                try {
                    if (client != null) {
                        MyLog.i(TAG, "2.检测数据");
                        while ((line = in.readLine()) != null) {
                            MyLog.i(TAG, "3.getdata" + line + " len=" + line.length());
                            MyLog.i(TAG, "4.start set Message");
                            Message msg = inHandler.obtainMessage();
                            msg.obj = line;
                            inHandler.sendMessage(msg);// 结果返回给UI处理
                            MyLog.i(TAG1, "5.send to handler");
                        }
    
                    } else {
                        MyLog.i(TAG, "没有可用连接");
                        conn();
                    }
                } catch (Exception e) {
                    MyLog.i(TAG, "数据接收错误" + e.getMessage());
                    e.printStackTrace();
                }
            }
        }
    
        /**
         * 发送数据
         * 
         * @param mess
         */
        public void Send(String mess) {
            try {
                if (client != null) {
                    MyLog.i(TAG1, "发送" + mess + "至"
                            + client.getInetAddress().getHostAddress() + ":"
                            + String.valueOf(client.getPort()));
                    out.println(mess);
                    out.flush();
                    MyLog.i(TAG1, "发送成功");
                    Message msg = outHandler.obtainMessage();
                    msg.obj = mess;
                    msg.what = 1;
                    outHandler.sendMessage(msg);// 结果返回给UI处理
                } else {
                    MyLog.i(TAG, "client 不存在");
                    Message msg = outHandler.obtainMessage();
                    msg.obj = mess;
                    msg.what = 0;
                    outHandler.sendMessage(msg);// 结果返回给UI处理
                    MyLog.i(TAG, "连接不存在重新连接");
                    conn();
                }
    
            } catch (Exception e) {
                MyLog.i(TAG1, "send error");
                e.printStackTrace();
            } finally {
                MyLog.i(TAG1, "发送完毕");
    
            }
        }
    
        /**
         * 关闭连接
         */
        public void close() {
            try {
                if (client != null) {
                    MyLog.i(TAG, "close in");
                    in.close();
                    MyLog.i(TAG, "close out");
                    out.close();
                    MyLog.i(TAG, "close client");
                    client.close();
                }
            } catch (Exception e) {
                MyLog.i(TAG, "close err");
                e.printStackTrace();
            }
    
        }
    }

     说明:

    1.接收数据并读取时的推荐使用BufferedReader 会比直接读取要效率高些
    2.BufferedReader默认大小:8192个字节=84Mbit,utf-8下等于4596个字符 一般足够用了
    3.接收数据使用的是ReadLine,实际测试中直接发送无法接收到数据,后来发现必须在发送数据的末尾加入'
    '换行符才能识别到,目前ReadLine是行读取没有了行标志无法读取到数据
    4.中文乱码问题 字符编码格式的问题 可以使用GB2312格式解析
      in= new BufferedReader(new InputStreamReader(socket.getInputStream(), "gb2312"));

     源码下载:下载地址

  • 相关阅读:
    0531day05
    0530day04
    0529day03
    0528day02
    0527day01
    0527学习心得
    javascript 2
    javascript
    CSS
    CSS知识
  • 原文地址:https://www.cnblogs.com/merray/p/3528346.html
Copyright © 2020-2023  润新知