package hillfly.wifichat.common.socket.tcp;
import hillfly.wifichat.common.BaseApplication;
import hillfly.wifichat.common.socket.udp.UDPMessageListener;
import hillfly.wifichat.consts.Constant;
import hillfly.wifichat.consts.IPMSGConst;
import hillfly.wifichat.model.FileState;
import hillfly.wifichat.model.FileStyle;
import hillfly.wifichat.model.Message;
import hillfly.wifichat.util.DateUtils;
import hillfly.wifichat.util.FileUtils;
import hillfly.wifichat.util.Logger;
import hillfly.wifichat.util.SessionUtils;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.ArrayList;
import android.content.Context;
import android.os.Handler;
public class TcpClient implements Runnable {
private static final Logger logger = Logger.getLogger(TcpClient.class);
private Thread mThread;
private boolean IS_THREAD_STOP = false; // 是否线程开始标志
private boolean SEND_FLAG = false; // 是否发送广播标志
private static TcpClient instance;
// private ArrayList<FileStyle> fileStyles;
// private ArrayList<FileState> fileStates;
private ArrayList<SendFileThread> sendFileThreads;
private SendFileThread sendFileThread;
private static Handler mHandler = null;
private TcpClient() {
sendFileThreads = new ArrayList<TcpClient.SendFileThread>();
mThread = new Thread(this);
logger.d("建立线程成功");
}
public static void setHandler(Handler paramHandler) {
mHandler = paramHandler;
}
public Thread getThread() {
return mThread;
}
/**
* <p>
* 获取TcpService实例
* <p>
* 单例模式,返回唯一实例
*/
public static TcpClient getInstance(Context context) {
if (instance == null) {
instance = new TcpClient();
}
return instance;
}
public void sendFile(ArrayList<FileStyle> fileStyles, ArrayList<FileState> fileStates,
String target_IP) {
while (SEND_FLAG == true)
;
for (FileStyle fileStyle : fileStyles) {
SendFileThread sendFileThread = new SendFileThread(target_IP, fileStyle.fullPath);
sendFileThreads.add(sendFileThread);
}
SEND_FLAG = true;
}
private TcpClient(Context context) {
this();
logger.d("TCP_Client初始化完毕");
}
public void startSend() {
logger.d("发送线程开启");
IS_THREAD_STOP = false; // 使能发送标识
if (!mThread.isAlive())
mThread.start();
}
public void sendFile(String filePath, String target_IP) {
SendFileThread sendFileThread = new SendFileThread(target_IP, filePath);
while (SEND_FLAG == true)
;
sendFileThreads.add(sendFileThread);
SEND_FLAG = true;
}
public void sendFile(String filePath, String target_IP, Message.CONTENT_TYPE type) {
SendFileThread sendFileThread = new SendFileThread(target_IP, filePath, type);
while (SEND_FLAG == true)
;
sendFileThreads.add(sendFileThread);
FileState sendFileState = new FileState(filePath);
BaseApplication.sendFileStates.put(filePath, sendFileState);// 全局可访问的文件发送状态读取
SEND_FLAG = true;
}
@Override
public void run() {
// TODO Auto-generated method stub
logger.d("TCP_Client初始化");
while (!IS_THREAD_STOP) {
if (SEND_FLAG) {
for (SendFileThread sendFileThread : sendFileThreads) {
sendFileThread.start();
}
sendFileThreads.clear();
SEND_FLAG = false;
}
}
}
public void release() {
while (SEND_FLAG == true)
;
while (sendFileThread.isAlive())
;
IS_THREAD_STOP = false;
}
public class SendFileThread extends Thread {
private boolean SEND_FLAG = true; // 是否发送广播标志
private byte[] mBuffer = new byte[Constant.READ_BUFFER_SIZE]; // 数据报内容
private OutputStream output = null;
private DataOutputStream dataOutput;
private FileInputStream fileInputStream;
private Socket socket = null;
private String target_IP;
private String filePath;
private Message.CONTENT_TYPE type;
public SendFileThread(String target_IP, String filePath) {
this.target_IP = target_IP;
this.filePath = filePath;
}
public SendFileThread(String target_IP, String filePath, Message.CONTENT_TYPE type) {
this(target_IP, filePath);
this.type = type;
}
public void sendFile() {
int readSize = 0;
try {
socket = new Socket(target_IP, Constant.TCP_SERVER_RECEIVE_PORT);
fileInputStream = new FileInputStream(new File(filePath));
output = socket.getOutputStream();
dataOutput = new DataOutputStream(output);
int fileSize = fileInputStream.available();
dataOutput.writeUTF(filePath.substring(filePath.lastIndexOf(File.separator) + 1)
+ "!" + fileSize + "!" + SessionUtils.getIMEI() + "!" + type);
long length = 0;
FileState fs = BaseApplication.sendFileStates.get(filePath);
fs.fileSize = fileSize;
fs.type = type;
while (-1 != (readSize = fileInputStream.read(mBuffer))) {
length += readSize;
dataOutput.write(mBuffer, 0, readSize);
fs.percent = (int) (length * 100 / fileSize);
switch (type) {
case IMAGE:
break;
case VOICE:
break;
case FILE:
android.os.Message msg = mHandler.obtainMessage();
msg.obj = fs;
msg.sendToTarget();
break;
default:
break;
}
dataOutput.flush();
}
logger.d(fs.fileName + "发送完毕");
output.close();
dataOutput.close();
socket.close();
switch (type) {
case IMAGE:
Message imageMsg = new Message(SessionUtils.getIMEI(),
DateUtils.getNowtime(), fs.fileName, type);
imageMsg.setMsgContent(FileUtils.getNameByPath(imageMsg.getMsgContent()));
UDPMessageListener.sendUDPdata(IPMSGConst.IPMSG_SENDMSG, target_IP, imageMsg);
logger.d("图片发送完毕");
break;
case VOICE:
Message voiceMsg = new Message(SessionUtils.getIMEI(),
DateUtils.getNowtime(), fs.fileName, type);
voiceMsg.setMsgContent(FileUtils.getNameByPath(voiceMsg.getMsgContent()));
UDPMessageListener.sendUDPdata(IPMSGConst.IPMSG_SENDMSG, target_IP, voiceMsg);
logger.d("语音发送完毕");
break;
case FILE:
android.os.Message msg = mHandler.obtainMessage();
fs.percent = 100;
msg.obj = fs;
msg.sendToTarget();
break;
default:
break;
}
BaseApplication.sendFileStates.remove(fs.fileName);
}
catch (UnknownHostException e) {
// TODO Auto-generated catch block
logger.d("建立客户端socket失败");
SEND_FLAG = false;
e.printStackTrace();
}
catch (IOException e) {
// TODO Auto-generated catch block
logger.d("建立客户端socket失败");
SEND_FLAG = false;
e.printStackTrace();
}
finally {
// IS_THREAD_STOP=true;
}
}
@Override
public void run() {
// TODO Auto-generated method stub
logger.d("SendFileThread初始化");
if (SEND_FLAG) {
sendFile();
}
}
}
}