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 自带的contacts2.db数据库表结构脚本
  2. Android(安卓)Sqlite数据库中判断某个表是否存在的SQL语句
  3. Android中ListView最简单的用法
  4. Android(安卓)SQLite数据库相关操作
  5. Android客户端连接服务器
  6. android ormlite 清空表
  7. 【Java转Android】30. LitePal操作SQLite数据库
  8. Android(安卓)api 数据的保存方式
  9. mybatisplus的坑 insert标签insert into select无参数问题的解决

随机推荐

  1. Android软件安全开发实践(下)
  2. 2018年Android版本分布(市场占有率、市场
  3. android在ctwap下播放视频,退出播放,切换到
  4. Handler消息传递机制
  5. 【Android】学习笔记(6)――ListView(上)
  6. app的好用框架
  7. android 绘图 Canvas
  8. Android(安卓)启动模拟器是出现“Failed
  9. Android之Styles And Themes学习
  10. Android Framework系列之IPC(一)