Android的TCP Socket连接组件
16lz
2021-01-23
https://github.com/SuperSanders/android-network
packageandroid.net.tcp;importjava.io.DataInputStream;importjava.io.DataOutputStream;importjava.io.IOException;importjava.net.InetSocketAddress;importjava.net.Socket;importjava.net.SocketAddress;importjava.net.UnknownHostException;/***Socket连接操作类**@authorEsa*/publicclassSocketBase{privateSocketmSocket;//socket连接对象privateDataOutputStreamout;privateDataInputStreamin;//输入流privateSocketCallbackcallback;//信息回调接口privateinttimeOut=1000*30;/***构造方法传入信息回调接口对象**@paramsdi*回调接口*/publicSocketBase(SocketCallbackcallback){this.callback=callback;}/***连接网络服务器**@throwsUnknownHostException*@throwsIOException*/publicvoidconnect(Stringip,intport)throwsException{mSocket=newSocket();SocketAddressaddress=newInetSocketAddress(ip,port);mSocket.connect(address,timeOut);//连接指定IP和端口if(mSocket.isConnected()){out=newDataOutputStream(mSocket.getOutputStream());//获取网络输出流in=newDataInputStream(mSocket.getInputStream());//获取网络输入流callback.connected();}}publicvoidsetTimeOut(inttimeOut){this.timeOut=timeOut;}/***返回连接服是否成功**@return*/publicbooleanisConnected(){if(mSocket!=null){returnmSocket.isConnected();}returnfalse;}/***发送数据**@parambuffer*信息字节数据*@throwsIOException*/publicvoidwrite(byte[]buffer)throwsIOException{if(out!=null){out.write(buffer);out.flush();}}/***断开连接**@throwsIOException*/publicvoiddisconnect(){try{if(mSocket!=null){if(!mSocket.isInputShutdown()){mSocket.shutdownInput();}if(!mSocket.isOutputShutdown()){mSocket.shutdownOutput();}if(out!=null){out.close();}if(in!=null){in.close();}mSocket.close();//关闭socket}}catch(Exceptione){e.printStackTrace();}finally{callback.disconnect();out=null;in=null;mSocket=null;//制空socket对象}}/***读取网络数据**@throwsIOException*/publicvoidread()throwsIOException{if(in!=null){byte[]buffer=newbyte[1024*1];//缓冲区字节数组,信息不能大于此缓冲区byte[]tmpBuffer;//临时缓冲区intlen=0;//读取长度while((len=in.read(buffer))>0){tmpBuffer=newbyte[len];//创建临时缓冲区System.arraycopy(buffer,0,tmpBuffer,0,len);//将数据拷贝到临时缓冲区callback.receive(tmpBuffer);//调用回调接口传入得到的数据tmpBuffer=null;}}}}
packageandroid.net.tcp;importjava.util.Vector;/***连接服务器线程类**@authorEsa*/publicclassSocketConnectimplementsRunnable{privatebooleanisConnect=false;//是否连接服务器privatebooleanisWrite=false;//是否发送数据privatestaticfinalVector<byte[]>datas=newVector<byte[]>();//待发送数据队列privateSocketBasemSocket;//socket连接privateWriteRunnablewriteRunnable;//发送数据线程privateStringip=null;privateintport=-1;/***创建连接**@paramcallback*回调接口*/publicSocketConnect(SocketCallbackcallback){mSocket=newSocketBase(callback);//创建socket连接writeRunnable=newWriteRunnable();//创建发送线程}@Overridepublicvoidrun(){if(ip==null||port==-1){thrownewNullPointerException("notsetaddress");}isConnect=true;while(isConnect){synchronized(this){try{mSocket.connect(ip,port);//连接服务器}catch(Exceptione){try{mSocket.disconnect();//断开连接this.wait(6000);continue;}catch(InterruptedExceptione1){continue;}}}isWrite=true;//设置可发送数据newThread(writeRunnable).start();//启动发送线程try{mSocket.read();//获取数据}catch(Exceptione){e.printStackTrace();}finally{writeRunnable.stop();mSocket.disconnect();}}}/***关闭服务器连接*/publicsynchronizedvoiddisconnect(){isConnect=false;this.notify();resetConnect();}/***重置连接*/publicvoidresetConnect(){writeRunnable.stop();//发送停止信息mSocket.disconnect();}/***向发送线程写入发送数据*/publicvoidwrite(byte[]buffer){writeRunnable.write(buffer);}/***设置IP和端口**@paramip*@paramport*/publicvoidsetRemoteAddress(Stringhost,intport){this.ip=host;this.port=port;}/***发送数据*/privatebooleanwrites(byte[]buffer){try{mSocket.write(buffer);returntrue;}catch(Exceptione){resetConnect();}returnfalse;}/***发送线程**@authorEsa*/privateclassWriteRunnableimplementsRunnable{@Overridepublicvoidrun(){System.out.println(">TCP发送线程开启<");while(isWrite){synchronized(this){if(datas.size()<=0){try{this.wait();//等待发送数据}catch(InterruptedExceptione){continue;}}while(datas.size()>0){byte[]buffer=datas.remove(0);//获取一条发送数据if(isWrite){writes(buffer);//发送数据}else{this.notify();}}}}System.out.println(">TCP发送线程结束<");}/***添加数据到发送队列**@parambuffer*数据字节*/publicsynchronizedvoidwrite(byte[]buffer){datas.add(buffer);//将发送数据添加到发送队列this.notify();//取消等待}publicsynchronizedvoidstop(){isWrite=false;this.notify();}}}
packageandroid.net.tcp;/***获取网络数据回调类**@authorEsa**/publicabstractinterfaceSocketCallback{/***当建立连接是的回调*/publicabstractvoidconnected();/***当获取网络数据回调接口**@parambuffer*字节数据*/publicabstractvoidreceive(byte[]buffer);/***当断开连接的回调*/publicabstractvoiddisconnect();}
//使用方法SocketConnectconnect=newSocketConnect(newSocketCallback(){@Overridepublicvoidreceive(byte[]buffer){System.out.println("ServerMessage:"+newString(buffer));}@Overridepublicvoiddisconnect(){}@Overridepublicvoidconnected(){}});connect.setRemoteAddress("localhost",11011);newThread(connect).start();for(inti=0;i<100;i++){connect.write("test".getBytes());Thread.sleep(1000);}
更多相关文章
- Android api 数据的保存方式
- Android SQLite数据库相关操作
- android 多线程下载原理
- android 自带的contacts2.db数据库表结构脚本
- android 两个apk之间恭喜数据SharedPreferences
- Android Sqlite数据库中判断某个表是否存在的SQL语句
- Android JSON数据的解析与封装小Demo
- Android中使用SQLite数据库详解
- Android中的线程模型