Socket

来源:互联网 发布:设计淘宝网店 编辑:程序博客网 时间:2024/06/05 09:58
package cardvalue.managementsystem.util;import android.content.Context;import java.io.BufferedWriter;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.net.Socket;import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future;import java.util.concurrent.ScheduledExecutorService;import java.util.concurrent.TimeUnit;/** * Created by Administrator on 2017/7/6. */public class SendReceiveUtil {    public static Socket socket = null;    /**线程池,为了方便展示,此处直接采用线程池进行线程管理,而没有一个个开线程*/    private ExecutorService executorService;    private  OutputStream outputStream;    private InputStream inputStream;    public Context context;    public SendReceiveUtil(Context context) throws IOException {        super();        this.context = context;        /**初始化线程池*/        executorService = Executors.newCachedThreadPool();        start();        /**         * 这个线程是每隔多少秒执行一次,执行发现断开了就重连         */        ScheduledExecutorService server = Executors.newScheduledThreadPool(1);        server.schedule(new Runnable() {            public void run() {                isConnect();            }        },10, TimeUnit.SECONDS);    }    //发送数据    public  void sendData(String data){        // outputStream.write(data.getBytes()); 原来的        PrintWriter out1= new PrintWriter(new BufferedWriter(new OutputStreamWriter(            outputStream)), true);        out1.println(data+"<over>");        /** 特别注意:数据的结尾加上换行符(<over>)才可让服务器端的readline()停止阻塞         步骤3:发送数据到服务端*/        try {            outputStream.flush();        } catch (IOException e) {            e.printStackTrace();        }    }    //接收数据    private StringBuffer str=new StringBuffer();    private  InputStreamReader reader = null;    public String receiveData() throws ExecutionException, InterruptedException {       /* InputStream inputStream = socket.getInputStream();//        DataInputStream data=new DataInputStream(inputStream);        byte[] buf = new byte[1024];        int len = inputStream.read(buf);        String text = new String(buf, 0, len);*/        Future<String> fu =executorService.submit(new Callable<String> () {            @Override            public String call() throws Exception {                try {                    reader = new InputStreamReader(inputStream);                    while (true){                        char[] ct = new char[8*1024];                        int count = reader.read(ct,0,1024*8);                        str.append(new String(ct,0,count));                        if(str.toString().indexOf("<over>")>=0){                            str=new StringBuffer(str.toString().replace("<over>",""));                            break;                        }                    }                    System.out.println(str.toString());                } catch (IOException e) {                    e.printStackTrace();                }                return str.toString();            }        });        return fu.get();    }    /**检测是否连接 如果断开就重连*/    public boolean isConnect(){        /**检测是否关闭状态*/        if(socket.isClosed()){            //TODO 这个地方检测数 是断开,在这写重连的方法。         /*   executorService.execute(new Runnable() {                @Override                public void run() {                    try {                        *//** 创建Socket对象 & 指定服务端的IP 及 端口号*//*                        socket = new Socket("192.168.16.20", 12345);                    } catch (IOException e) {                        e.printStackTrace();                    }                }            });*/            start();            return false;        }        return true;    }    /**断开连接*/    public void closeConnect(){        try {            socket.close();        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }    public void start(){        executorService.execute(new Runnable() {            @Override            public void run() {                try {                    /** 创建Socket对象 & 指定服务端的IP 及 端口号*/                    socket = new Socket("192.168.16.20", 12345);                    outputStream = socket.getOutputStream();                    inputStream=socket.getInputStream();                } catch (IOException e) {                    e.printStackTrace();                }            }        });    }}

package cardvalue.managementsystem;import android.app.Application;import cardvalue.managementsystem.util.SendReceiveUtil;import java.io.IOException;/** * Created by Administrator on 2017/7/7. */public class MyApplication  extends Application{    public SendReceiveUtil sendReceiveUtil;    public SendReceiveUtil getSendReceiveUtil() {        return sendReceiveUtil;    }    private static MyApplication mInstance = null;    @Override    public void onCreate() {        super.onCreate();        mInstance = this;        try {            sendReceiveUtil=new SendReceiveUtil(getApplicationContext());        } catch (IOException e) {            e.printStackTrace();        }    }    public static MyApplication getInstance() {        return mInstance;    }}

package cardvalue.managementsystem.activity;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import cardvalue.managementsystem.MyApplication;import cardvalue.managementsystem.R;import cardvalue.managementsystem.pojo.BaseMessage;import cardvalue.managementsystem.util.SendReceiveUtil;import java.io.IOException;import java.util.concurrent.ExecutionException;public class Main3Activity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main3);        BaseMessage msg1 = new BaseMessage();        msg1.setCmdType(1);        msg1.setFrom(1);        msg1.setMsg("weiweina;123456789");        msg1.setTo(new int[]{});        MyApplication.getInstance().getSendReceiveUtil().sendData(msg1.toJson());        try {            MyApplication.getInstance().getSendReceiveUtil().receiveData();        } catch (ExecutionException e) {            e.printStackTrace();        } catch (InterruptedException e) {            e.printStackTrace();        }    }}