package cn.com.uangel.adsys.server.thread; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.FileInputStream; import java.io.IOException; import java.net.Socket; import cn.com.uangel.adsys.server.DataManager; import cn.com.uangel.adsys.util.Log; /** * 处理请求广告的线程 * * @author Tree * */ public class SolveRequest extends Thread { private Socket socket; private DataManager dataManager; private DataInputStream in; private DataOutputStream out; // private String adImgFolder = "/root/ad.uangel.com.cn/files/ad/"; private String adImgFolder = "D:\\Program Files\\apache-tomcat-6.0.14\\webapps\\adsys\\files\\ad\\"; private String adFullADFolder = "D:\\Program Files\\apache-tomcat-6.0.14\\webapps\\adsys\\files\\fullad\\"; public SolveRequest(Socket socket, DataManager dataManager) throws IOException { this.socket = socket; this.dataManager = dataManager; in = new DataInputStream(new BufferedInputStream(this.socket.getInputStream(), 8 * 1024)); out = new DataOutputStream(new BufferedOutputStream(this.socket.getOutputStream(), 8 * 1024)); start(); } private void writeUTF(String utfStr) throws IOException { out.writeUTF(utfStr); out.flush(); } private String readUTF() throws IOException { return in.readUTF(); } private void writeByte(String filePath) throws IOException { DataInputStream fis = new DataInputStream(new BufferedInputStream(new FileInputStream(filePath))); int bufferSize = 8192; byte[] buf = new byte[bufferSize]; int read = 0; int size = 0; while ((read = fis.read(buf)) != -1) { out.write(buf, 0, read); size += read; } Log.debug(size); out.flush(); fis.close(); } @Override public void run() { try { long start = System.currentTimeMillis(); String what = in.readUTF(); if (what != null) { writeUTF("ok"); // 直接读两次时间会很慢,有时间查查为什么 } Log.debug("Do what: " + what); if ("RequestAD".equals(what)) { String requestMsg = readUTF(); Log.debug("requestMsg: " + requestMsg); String returnMsg = dataManager.parseRequestMessage(requestMsg); // Log.debug("returnMsg: " + returnMsg); writeUTF(returnMsg); if (!"No ADs".equals(returnMsg)) { String[] adInfos = requestMsg.split("‖"); int typeCode = Integer.parseInt(adInfos[5]); Log.debug("typeCode: " + typeCode); switch (typeCode) { case 1: // 条幅型,请求1条 String[] adMsgs = returnMsg.split("‖"); if ("全屏图片".equals(adMsgs[5])) { writeByte(adFullADFolder + adMsgs[7]); } writeByte(adImgFolder + adMsgs[4]); break; case 2:// 插屏型,请求一条 // 没测试 String[] fullMsgs = returnMsg.split("‖"); Log.debug("path: " + adFullADFolder + fullMsgs[4]); writeByte(adFullADFolder + fullMsgs[4]); break; case 3:// 悬浮型,请求N条 String[] adsStr = returnMsg.split("︴"); for (String adStr : adsStr) { String[] noName = adStr.split("‖"); writeByte(adImgFolder + noName[4]); } Log.debug("imgCount: " + adsStr.length); break; } } } else if ("ShowAD".equals(what)) { } else if ("ClickAD".equals(what)) { String clickMsg = readUTF(); String returnMsg = dataManager.parseClickMessage(clickMsg); writeUTF(returnMsg); } Log.debug("Solving time: " + (System.currentTimeMillis() - start) + "ms"); } catch (Exception e) { Log.error(e); } finally { try { socket.close(); } catch (IOException e) { } } } }