您的位置:首页 > 理论基础 > 计算机网络

Android TCP的客户端(请求的发送和响应结果接收)

2016-06-14 13:15 816 查看
Android TCP客户端发送请求并接收响应

<span style="font-size:14px;">
import android.util.Log;

import com.changhong.electric_controll.UDPResponseCallback;
import com.changhong.electric_controll.connect.entity.entity.EquipResponse;
import com.changhong.electric_controll.connect.entity.parser.QueryOrderBuilder;
import com.changhong.electric_controll.util.ByteUtils;

import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
* Created by zhangning on 2016/5/24.
*/
public class TCPReceive extends  Thread{
private Socket connectsocket;
private String IPAddress;
private int Port;
private UDPResponseCallback mUDPResponseCallback;   //自定义接口,用于再activity中处理接收的结果,如果不用,可以直接删除
private boolean isSuccess=false;
private String lastResult;
private byte[] senddata;
private byte[] acceptdata;
private int callbacktype;

private static long INTERVAL_TIME=15*1000;

public TCPReceive(UDPResponseCallback udpResponseCallback,Socket socket,String IPAddress,int port,byte[] senddata,int callbacktype){

this.connectsocket=socket;
this.IPAddress=IPAddress;
this.Port=port;
this.mUDPResponseCallback=udpResponseCallback;
this.senddata=senddata;
this.callbacktype=callbacktype;
}

public TCPReceive(Socket socket,String IPAddress,int port,byte[] senddata,int callbacktype){

this.connectsocket=socket;
this.IPAddress=IPAddress;
this.Port=port;
this.senddata=senddata;
this.callbacktype=callbacktype;
}
@Override
public void run() {
if(callbacktype==0){
onebyone();
}
else if(callbacktype == 1){
moretomore();
}
else if(callbacktype==2){
equitupload();
}

}

/**一应一答模式(所谓的短连接模式)**/
public void onebyone(){
buildConnect();   //建立与服务器的连接
if(isSuccess){
senddata(senddata, connectsocket);
}

}

/**循环发送请求和接收响应**/
public void moretomore(){
buildConnect();   //建立与服务器的连接
while(true) {
try{
if(connectsocket.isClosed()){
break;
}
if (isSuccess) {

senddata(senddata, connectsocket);
}

Thread.sleep(INTERVAL_TIME);
}catch(InterruptedException e){
e.printStackTrace();
}
}
}

/**循环接收服务器传过来的数据**/
public void equitupload(){
buildConnect();   //建立与服务器的连接
if(isSuccess) {
while (true) {
try{
Thread.sleep(1000);
}catch(InterruptedException e){
e.printStackTrace();
}
Log.i("Data", "接收数据");
if(!connectsocket.isClosed()) {
acceptdata(connectsocket);
Log.i("Data", "接收响应数据结束++++++++++++++++");
} else {
break;
}

}
}

}

/**建立与服务器的连接并发送请求**/
public void buildConnect(){
try {
Log.i("Data", " socket begin connect ++++++++++");
Log.i("Data","tcp connect ,ip = "+IPAddress+"Port = "+Port);
Log.i("Data","the send data="+ByteUtils.bytesToHexString(senddata));

//connectsocket=new Socket(IPAddress,Port);
//connectsocket.setSoTimeout(10*1000);   //设置连接超时时间
Log.i("Data", "connectsocket.isConnected=" + connectsocket.isConnected());   //是否关闭
Log.i("Data", "connectsocket.isClosed=" + connectsocket.isClosed());   //是否连接
Log.i("Data", "connectsocket.isInputShutdown=" + connectsocket.isInputShutdown());   //是否关闭输入流
Log.i("Data", "connectsocket.isOutputShutdown=" + connectsocket.isOutputShutdown());   //是否关闭输出流
Log.i("Data", "连接请求已发送");
if(connectsocket.isConnected()&&(!connectsocket.isClosed())){  //表明当前连接成功
Log.i("Data", "连接成功,准备发送信息");
isSuccess = true;
}
else{
try {
Log.i("Data","断开连接,重新连接");
Thread.sleep(1000);
connectsocket=new Socket(IPAddress,Port);
if(connectsocket.isConnected()&&(!connectsocket.isClosed())){
Log.i("Data","尝试重新连接成功");
isSuccess=true;
}
else{
Log.i("Data","尝试重新连接失败");
isSuccess = false;
mUDPResponseCallback.onResponse(null,isSuccess);   //直接返回结果
return;
}

}catch(InterruptedException e){
isSuccess=false;
mUDPResponseCallback.onResponse(null,isSuccess);   //将返回结果传递给callback去解析
e.printStackTrace();
}
return;
}

}catch(IOException e){
isSuccess=false;
mUDPResponseCallback.onResponse(null,isSuccess);   //将返回结果传递给callback去解析
e.printStackTrace();
}

}

/**发送数据**/
public void senddata(byte[] senddata,Socket connectsocket1){
synchronized(this) {
try {
ByteArrayInputStream byteArrayinputstream = new ByteArrayInputStream(senddata);
Log.i("Data", "read line......" + ByteUtils.bytesToHexString(senddata));
if (byteArrayinputstream != null) {
BufferedReader in = new BufferedReader(new InputStreamReader(byteArrayinputstream));
Log.i("Data", "向服务器发送数据,发送时间="+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
if (connectsocket1.isClosed()) {
connectsocket1.close();
} else {
connectsocket1.getOutputStream().write(senddata);
Log.i("Data", "获取输出流成功");
}

}
} catch (IOException e) {
e.printStackTrace();

}
}
}

/**接收数据**/
public byte[] acceptdata(Socket connectsocket) {
byte[] acceptdata1=null;
try {
InputStream istream=null;
//Thread.sleep(1000);
if (connectsocket.isConnected()) {
if (!connectsocket.isInputShutdown()) {
istream=connectsocket.getInputStream();
int datalength=istream.available();
Log.i("Data","接收到的字节数"+datalength);
if(datalength >0) {
acceptdata1 = new byte[datalength];
istream.read(acceptdata1);
if (acceptdata1 != null) {
isSuccess = true;
lastResult = ByteUtils.bytesToHexString(acceptdata1);
Log.i("Data", "the lastresult=" + lastResult);
mUDPResponseCallback.onResponse(lastResult, isSuccess);   //将返回结果传递给callback去解析
}
}
} else {
isSuccess=false;
Log.i("Data", "connectsocket 失败 isInputShutdown=false");
mUDPResponseCallback.onResponse(null, isSuccess);   //将返回结果传递给callback去解析
}
}
} catch(IOException e){
e.printStackTrace();
}
return acceptdata1;

}

}</span><strong style="font-size: 12pt;">
</strong>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: