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中的数据库操作(SQLite)
  4. android 解决错误:Intel HAXM is required to run this AVD
  5. android 操作sqlite数据库
  6. res\drawable-hdpi\new.png:0: error: invalid symbol: 'new'
  7. android aidl 进程通信 调用错误
  8. Android 利用TCP通信 实现环境数据显示及控制指令下发

随机推荐

  1. Failed to fetch URL http://dl-ssl.goog
  2. Material Design主题
  3. Android中thread.start()出现的thread al
  4. Android(安卓)SDK开发 -- TitleBar重构 (
  5. Android(安卓)开发网站网址
  6. Android自动化测试
  7. Android项目:proguard混淆第三方jar.
  8. Android(安卓)6.0 去掉锁屏
  9. Android(安卓)之 ImageView(图片组件)
  10. android studio 上junit4的使用