有关代理
package com.sangame.mgrab.controller.service;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.Socket;
import java.net.URL;
import java.net.URLConnection;
import java.util.List;
import javax.annotation.Resource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import com.test.controller.persistence.dao.GrabProxyInfosDao;
import com.test.controller.persistence.model.GrabProxyInfos;
import com.test.orm.hibernate.support.Page;
import com.test.service.EntityService;
import com.test.service.result.DefaultResult;
import com.test..service.result.Result;
import com.test.service.result.ResultCode;
import com.test.utils.SshBeanUtils;
@Service
public class GrabProxyInfosService extends EntityService<GrabProxyInfos, GrabProxyInfosDao> {
private static Logger LOG = LoggerFactory.getLogger(GrabProxyInfosService.class);
public static final int CONNECT_TIME_OUT = 5000; // 5秒超时
@Resource
private GrabProxyInfosDao grabProxyInfosDao;
public GrabProxyInfosDao getEntityDao() {
return grabProxyInfosDao;
}
public Page<GrabProxyInfos> findPage(GrabProxyInfos grabProxyInfos, int currentPage, int pageSize) {
return this.getEntityDao().findPage(grabProxyInfos, currentPage, pageSize);
}
private final static String UPDATE_COPY_COLUMNS = "modifier,updatedAt,connectTime,proxyIp,proxyName,proxyPort,proxyStatus,remark";
/**
* 修改
*
* @param keyword
* @param groupId
* @param keywordId
* @return
*/
public Result update(GrabProxyInfos grabProxyInfos) {
Result result = new DefaultResult();
if (grabProxyInfos != null) {
GrabProxyInfos dbGrabProxyInfos = this.get(grabProxyInfos.getId());
String[] properties = UPDATE_COPY_COLUMNS.split(",");
SshBeanUtils.copyProperties(grabProxyInfos, dbGrabProxyInfos, properties);
this.save(dbGrabProxyInfos);
result.setResultCode(new ResultCode(ResultCode.SUCCESS));
result.setModel(Result.DEFAULT_MODEL_KEY, "更新数据成功!");
}
return result;
}
public boolean checkExists(String ip) {
return grabProxyInfosDao.checkExists(ip);
}
public boolean checkUnique(GrabProxyInfos grabProxyInfos) {
return grabProxyInfosDao.checkUnique(grabProxyInfos);
}
public boolean telnetTestByProxyId(Long id) {
GrabProxyInfos proxyServer = super.get(id);
if (proxyServer == null) {
return false;
}
Socket server = new Socket();
try {
InetSocketAddress address = new InetSocketAddress(proxyServer.getProxyIp(), proxyServer.getProxyPort());
server.connect(address, CONNECT_TIME_OUT);
return true;
} catch (Exception e) {
if (LOG.isDebugEnabled())
LOG.error("连接失败,删除IP:" + proxyServer.getProxyIp() + " " + proxyServer.getProxyPort());
return false;
} finally {
try {
server.close();
} catch (Exception f) {
LOG.error("关闭socket出错", f);
return false;
}
}
}
public boolean testProxy(GrabProxyInfos proxyServer) {
String[] urlStrs = {"http://www.baidu.com","http://www.taobao.com"};
for (String urlStr : urlStrs) {
try {
// Proxy类代理方法
URL url = new URL(urlStr);
// 创建代理服务器
InetSocketAddress addr = new InetSocketAddress(proxyServer.getProxyIp(), proxyServer.getProxyPort());
Proxy proxy = new Proxy(Proxy.Type.HTTP, addr); // http 代理
URLConnection conn = url.openConnection(proxy);
conn.setConnectTimeout(CONNECT_TIME_OUT);
conn.connect();
return true;
} catch (Exception e) {
if (LOG.isDebugEnabled())
LOG.error("连接失败,删除IP:" + proxyServer.getProxyIp() + " " + proxyServer.getProxyPort());
}
}
return false;
}
/**
* 检测数据库中的IP代理是否过期,删除掉不可用的IP代理
*/
public void telnetTest() {
List<GrabProxyInfos> list = super.findAll();
if (list == null) {
return;
}
for (GrabProxyInfos proxyServer : list) {
if(!testProxy(proxyServer))
super.destory(proxyServer.getId());
}
}
/**
* 将捕捉到的数据存入数据库
*
* @param ip
* @param port
* @param name
*/
public Result addProxyServer(GrabProxyInfos proxyServer) {
Result result = new DefaultResult();
if (proxyServer == null) {
result.setResultCode(new ResultCode(ResultCode.FAILURE));
return result;
}
if (checkExists(proxyServer.getProxyIp())) {
result.setResultCode(new ResultCode(ResultCode.FAILURE));
return result;
}
Socket server = new Socket();
try {
InetSocketAddress address = new InetSocketAddress(proxyServer.getProxyIp(), proxyServer.getProxyPort());
// 检测IP代理是否可用,若不可用就不存入数据库
server.connect(address, CONNECT_TIME_OUT);
server.close();
save(proxyServer);
result.setResultCode(new ResultCode(ResultCode.SUCCESS));
result.setModel(Result.DEFAULT_MODEL_KEY, "添加成功!");
if (LOG.isDebugEnabled())
LOG.debug("捕获IP代理成功, ip:{}" + proxyServer.getProxyIp());
} catch (Exception e) {
result.setResultCode(new ResultCode(ResultCode.FAILURE));
result.setModel(Result.DEFAULT_MODEL_KEY, "添加失败!");
// log日志里大部分是这个错误,只在开发时打印
if (LOG.isDebugEnabled()) LOG.warn("IP代理不可用, ip:{},原因:{}", proxyServer.getProxyIp(), e.toString());
try {
server.close();
} catch (Exception f) {
if (LOG.isDebugEnabled()) LOG.warn("关闭socket出错", f);
}
}
return result;
}
}