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("\n ME: " + s + "      发送成功");                    } else {                        tv1.append("\n 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,实际测试中直接发送无法接收到数据,后来发现必须在发送数据的末尾加入'\n'换行符才能识别到,目前ReadLine是行读取没有了行标志无法读取到数据
4.中文乱码问题 字符编码格式的问题 可以使用GB2312格式解析
  in= new BufferedReader(new InputStreamReader(socket.getInputStream(), "gb2312"));

源码下载:下载地址

更多相关文章

  1. Android(安卓)之 SQLite数据库的使用
  2. SQLite 数据库 WAL 工作模式原理简介
  3. android中的数据库操作
  4. android中的数据库操作(SQLite)
  5. Android(安卓)Handler机制7之消息发送
  6. SQLite 锁机制与事务简介
  7. android 操作sqlite数据库
  8. Android(安卓)Provider 属性
  9. Android(安卓)Provider 属性

随机推荐

  1. Android(安卓)HTTP实例 发送请求和接收响
  2. Android(安卓)中service 详解
  3. 如何删除Android自带的应用程序?
  4. Android(安卓)布局 & 一些控件
  5. Android(安卓)蓝牙4.0代码解析
  6. Android(安卓)Studio 错误:Invalid Androi
  7. Android(安卓)Studio 初体验
  8. Android-AbsoluteLayout(绝对布局)
  9. Android航班时刻查询
  10. Android(安卓)之shape 的用法介绍