HTTP协议是基于TCP协议的,TCP协议在Java中的体现就是套接字.在了解HTTP协议的基础上,完全可以通过TCP来实现一套HTTP库,这个库可以发起网络请求和接受网络请求.只要能用URLConnection能实现的事情,用Socket同样能够实现.

代理是"代理服务器",我不直接向百度发起请求,而是向代理服务器发起请求,然后代理服务器代替我向百度发起请求.这样一来,我的IP地址就不会暴露.在编写爬虫时,同一个IP爬多了就会被要求输入验证码,这时就可以通过代理来不停地换IP从而规避验证码.

本文提供四种方法,第一种方法通过设置环境变量,第二种方法通过URLConnection,第三种方法通过nio中的SocketChannel,第四种方法通过Socket.

  1. public class TestProxy {
  2. static String host = "112.126.65.26";
  3. static int port = 12345;
  4. static String url = "http://1212.ip138.com/ic.asp";
  5. public static void main(String[] args) throws Exception {
  6. four();
  7. }
  8. static void one() throws MalformedURLException, IOException {
  9. // 没有这句话是不行的
  10. System.setProperty("http.proxySet", "true");
  11. System.setProperty("http.proxyHost", host);
  12. System.setProperty("http.proxyPort", port + "");
  13. URLConnection connection = new URL(url).openConnection();
  14. show(connection.getInputStream());
  15. }
  16. static void two() throws MalformedURLException, IOException {
  17. SocketAddress addr = new InetSocketAddress(host, port);
  18. Proxy proxy = new Proxy(Proxy.Type.HTTP, addr);
  19. // 下面这个网址会告诉你你的ip地址
  20. URLConnection connection = new URL(url).openConnection(proxy);
  21. show(connection.getInputStream());
  22. }
  23. // 使用socket也是一样
  24. static void three() throws IOException {
  25. SocketChannel sc = SocketChannel
  26. .open(new InetSocketAddress(host, port));
  27. sc.write(Charset.forName("utf8")
  28. .encode("GET " + url + " HTTP/1.1\r\n\r\n"));
  29. ByteBuffer buffer = ByteBuffer.allocate(1024);
  30. while (sc.read(buffer) != -1) {
  31. buffer.flip();
  32. System.out.println(Charset.forName("utf8").decode(buffer));
  33. buffer.clear();
  34. }
  35. sc.close();
  36. }
  37. static void four() throws IOException {
  38. // 以下地址是代理服务器的地址
  39. Socket socket = new Socket(host, port);
  40. // 写与的内容就是遵循HTTP请求协议格式的内容,请求百度
  41. socket.getOutputStream().write(
  42. new String("GET " + url + " HTTP/1.1\r\n\r\n").getBytes());
  43. show(socket.getInputStream());
  44. socket.close();
  45. }
  46. static void show(InputStream in) throws IOException {
  47. Scanner cin = new Scanner(in);
  48. StringBuilder builder = new StringBuilder();
  49. while (cin.hasNext()) {
  50. builder.append(cin.nextLine());
  51. }
  52. cin.close();
  53. Pattern pattern = Pattern
  54. .compile("\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}");
  55. Matcher matcher = pattern.matcher(builder.toString());
  56. matcher.find();
  57. System.out.println(matcher.group());
  58. }
  59. }

Java使用代理服务器的更多相关文章

  1. Java实现代理服务器

    Web代理(proxy)服务器是网络的中间实体. 代理位于Web客户端和Web服务器之间,扮演"中间人"的角色. HTTP的代理服务器即是Web服务器又是Web客户端. 代理服务器 ...

  2. 用Java开发代理服务器

    基础知识 不管以哪种方式应用代理服务器,其监控HTTP传输的过程总是如下: 步骤一:内部的浏览器发送请求给代理服务器.请求的第一行包含了目标URL. 步骤二:代理服务器读取该URL,并把请求转发给合适 ...

  3. Java实现sock5代理服务器

    入职练手socks5代理服务器,过程总结一下. 1.下载火狐浏览器,设定代理为socks5代理,地址为127.0.0.1:1080. 2.socks5协议1928,中文版,原版,认真阅读 3.按照协议 ...

  4. HTTP Proxy Servlet 代理服务使用

    java servlet  代理服务器 1. 使用 maven  依赖 <dependency> <groupId>org.mitre.dsmiley.httpproxy< ...

  5. tit.Atitit. http 代理原理  atiHttpProxy  大木马 h

    Atitit. http 代理原理  atiHttpProxy  大木马 1. 面这张图可以清晰地阐明HttpProxy的实现原理:1 2. 代理服务器用途1 3. 其中流程具体如下:2 4. 设计规 ...

  6. Atitit. http 代理原理  atiHttpProxy  大木马

    Atitit. http 代理原理  atiHttpProxy  大木马 1. 面这张图可以清晰地阐明HttpProxy的实现原理:1 2. 代理服务器用途1 3. 其中流程具体如下:2 4. 设计规 ...

  7. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  8. 基于jsoup的Java服务端http(s)代理程序-代理服务器Demo

    亲爱的开发者朋友们,知道百度网址翻译么?他们为何能够翻译源网页呢,iframe可是不能跨域操作的哦,那么可以用代理实现.直接上代码: 本Demo基于MVC写的,灰常简单,copy过去,简单改改就可以用 ...

  9. 01_Weblogic课程之概念篇:代理服务器,web服务器,应用程序服务器,JNDI概念,JTA概念,Java消息服务,Java验证和授权(JAAS),Java管理扩展,Web客户机,客户机应用程序

     1 什么是服务器 Weblogic中服务器分为两种,一种是受管服务器,另外一种是管理服务器. Weblogic课程(Weblogic是Oracle公司的,最开始的是BEA公司的) 一 系统管理 ...

随机推荐

  1. 3D banner(CSS3+HTML5)

    1.这是一篇 3Dbanner制作的简易流程,支持高版本的chrome和firefox浏览器,俩浏览器显示可能会有些差异 2.没有兼容性代码,因为仅仅只是熟悉流程,希望小伙伴们自己改善哈(>﹏& ...

  2. IIS10中使用OpenSSL来创建CA并且签发SSL证书

    参考: http://www.cnblogs.com/lierle/p/5140187.html http://alvinhu.com/blog/2013/06/12/creating-a-certi ...

  3. 去除GridView选中时的蓝色背景

    解决办法: android:listSelector="#00000000" android:listSelector="@android:color/transpare ...

  4. Android开发学习——Android项目的目录结构

    Android项目的目录结构: 资源文件夹: 清单配置文件: Android的四大组件在使用前全部需要在清单文件中配置 <?xml version="1.0" encodin ...

  5. 几个常用的adb命令

    adb全程为Android Debug Bridge,字面意思就是安卓调试桥接.就是android系统提供的一套 工具帮我们建议一个连接android设备的通道,然后在电脑上发送一些指令,完成工作. ...

  6. 【转】2016/2017 Web 开发者路线图

    链接:知乎 [点击查看大图] 原图来自LearnCodeAcademy最火的视频,learncode是YouTube上最火的Web开发教学频道,介绍包括HTML/CSS/JavaScript/Subl ...

  7. 查看数据库表的数据量和SIZE大小的脚本修正

    在使用桦仔的分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间)的脚本时,遇到下面一些错误 这个是因为这些表的Schema是Maint,而不是默认的dbo,造成下面这段SQ ...

  8. JavaSe:-javaagent,-agentlib,-agentpath

    内容简述 -javaagent,-agentlib, -agentpath 说明 -javaagent示例   -javaagent.-agentlib.-agentpath -agentlib:li ...

  9. Linux Daemon进程

    模型 创建孤儿进程 fork() 创建新的会话 setid() 改变当前目录为根目录chdir() 重设文件权限掩码umask() 关闭文件描述符close() 创建孤儿进程 创建孤儿进程只需要将父进 ...

  10. openstack-swift云存储部署(一)

    最近因为工作的需要搭建了一套swift云存储架构 我们先来解读一下里面的技术知识点:swift服务是属于openstack中的一种组件服务,openstack中的组件服务还有keystone.Nova ...