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);}


更多相关文章

  1. Android api 数据的保存方式
  2. Android SQLite数据库相关操作
  3. android 多线程下载原理
  4. android 自带的contacts2.db数据库表结构脚本
  5. android 两个apk之间恭喜数据SharedPreferences
  6. Android Sqlite数据库中判断某个表是否存在的SQL语句
  7. Android JSON数据的解析与封装小Demo
  8. Android中使用SQLite数据库详解
  9. Android中的线程模型

随机推荐

  1. Android为什么引入HAL
  2. 初步理解Android(安卓)Fragment
  3. 老项目在Android(安卓)Studio 3.6.1不能
  4. AndroidManifest.xml文件详解
  5. Android(安卓)Scroller及下拉刷新组件原
  6. Android应用程序键盘(Keyboard)消息处理机
  7. Android电话系统之-rild
  8. android瀑布流简单实现原理
  9. Android代码混淆之混淆规则
  10. geekband android #5 第九周分享