Java Socket编程 - 获取WEB站点主页信息

简介: Java Socket编程 - 获取WEB站点主页信息

早就有想写一个Java Socket编程系列的文章,由于自己懒一直没动。决定从


今天开始,每周写一篇,从最简单的socket连接,到文件传输到协议实现,到


远程桌面控制,全面讲述Java socket编程的各个方面与各种技巧,从普通


socket到Java NIO。




本文算是第一篇,简述如何通过Java Socket获取网站的主页内容其中包括


如何获取本地机器名与IP地址,如何建立一个socket连接到远程WEB站点


如何使用HTTP GET方法获取网站主页内容与HTTP响应头。程序运行结果:


1351696543_2243.png



从中我们可以知道csdn网站是基于什么语言开发,服务器是什么,版本是多少。


具体的做法请看源代码:

package com.gloomyfish.socket.tutorial.one;
 
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.UnknownHostException;
 
public class HomePageVisitor {
  private Socket client;
  private SocketAddress address;
  public HomePageVisitor(String hostName, int port) throws UnknownHostException, IOException {
    client = new Socket();
    address = new InetSocketAddress(hostName, port);
  }
  // GET http://localhost:8080/blank/Welcome.do HTTP/1.1\r\n
  public void printHomePageInfo(String httpString)
  {
    try {
      // Get local host info
          InetAddress inetAddress = InetAddress.getLocalHost();
          System.out.println("Host Address = " + inetAddress.getHostAddress());
          System.out.println("Hostname = " + inetAddress.getHostName());
          
          // visit the WEBSITE
      client.connect(address);
      BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(client.getOutputStream(), "UTF8"));
      bufferedWriter.write(httpString);
      
      // -- HTTP/1.1 400 Bad Request if not send \r\n
      bufferedWriter.write("\r\n");
      bufferedWriter.flush();
      System.out.println("http request send out");
      
      BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(client.getInputStream()));
      String content = null;
      while((content = bufferedReader.readLine()) != null) {
        if(getStatusCde(content) == 400) {
          System.err.println("HTTP/1.1 | HTTP/1.0 400 Bad Request");
          break;
        }
        System.out.println("response contect -->> " + content);
      }
    } catch(Exception e) {
      e.printStackTrace();
    }
    
  }
  
  /**
   * <p> try to parse the HTTP response content</p>
   * @param content
   * @return status of HTTP
   */
  private static int getStatusCde(String content) {
    int status = 200; // default OK response
    if(content == null || "".equals(content))
      return status;
    else if (!content.contains("HTTP/1.1")&& !content.contains("HTTP/1.0"))
      return status;
    else if(content.contains("400") && content.contains("HTTP/1.1")
        || content.contains("HTTP/1.0")) {
      status = 400;
    }
    return status;
  }
  
  public static void main(String[] args) {
    try {
      HomePageVisitor httpVisitor = new HomePageVisitor("www.csdn.net", 80);
      httpVisitor.printHomePageInfo("GET http://www.csdn.net HTTP/1.0\r\n");
    } catch (UnknownHostException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

如果使用了代理,在初始化Address时候使用HTTP代理的地址与端口

接口,其它不变,代理会自动转发HTTP GET请求。代码如下:

address = new InetSocketAddress(http_proxy, proxy_port)
相关文章
|
Java API 微服务
为什么虚拟线程将改变Java并发编程?
为什么虚拟线程将改变Java并发编程?
492 83
|
9月前
|
Java
如何在Java中进行多线程编程
Java多线程编程常用方式包括:继承Thread类、实现Runnable接口、Callable接口(可返回结果)及使用线程池。推荐线程池以提升性能,避免频繁创建线程。结合同步与通信机制,可有效管理并发任务。
331 6
|
9月前
|
IDE Java 编译器
java编程最基础学习
Java入门需掌握:环境搭建、基础语法、面向对象、数组集合与异常处理。通过实践编写简单程序,逐步深入学习,打牢编程基础。
445 1
|
10月前
|
SQL Java 数据库
2025 年 Java 从零基础小白到编程高手的详细学习路线攻略
2025年Java学习路线涵盖基础语法、面向对象、数据库、JavaWeb、Spring全家桶、分布式、云原生与高并发技术,结合实战项目与源码分析,助力零基础学员系统掌握Java开发技能,从入门到精通,全面提升竞争力,顺利进阶编程高手。
1388 2
|
10月前
|
安全 Java API
Java Web 在线商城项目最新技术实操指南帮助开发者高效完成商城项目开发
本项目基于Spring Boot 3.2与Vue 3构建现代化在线商城,涵盖技术选型、核心功能实现、安全控制与容器化部署,助开发者掌握最新Java Web全栈开发实践。
822 1
|
9月前
|
安全 前端开发 Java
从反射到方法句柄:深入探索Java动态编程的终极解决方案
从反射到方法句柄,Java 动态编程不断演进。方法句柄以强类型、低开销、易优化的特性,解决反射性能差、类型弱、安全性低等问题,结合 `invokedynamic` 成为支撑 Lambda 与动态语言的终极方案。
344 0
|
11月前
|
安全 Java 数据库连接
2025 年最新 Java 学习路线图含实操指南助你高效入门 Java 编程掌握核心技能
2025年最新Java学习路线图,涵盖基础环境搭建、核心特性(如密封类、虚拟线程)、模块化开发、响应式编程、主流框架(Spring Boot 3、Spring Security 6)、数据库操作(JPA + Hibernate 6)及微服务实战,助你掌握企业级开发技能。
1226 3
|
10月前
|
存储 前端开发 Java
【JAVA】Java 项目实战之 Java Web 在线商城项目开发实战指南
本文介绍基于Java Web的在线商城技术方案与实现,涵盖三层架构设计、MySQL数据库建模及核心功能开发。通过Spring MVC + MyBatis + Thymeleaf实现商品展示、购物车等模块,提供完整代码示例,助力掌握Java Web项目实战技能。(238字)
1238 0
|
10月前
|
Java 开发者
Java并发编程:CountDownLatch实战解析
Java并发编程:CountDownLatch实战解析
627 100
|
10月前
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
614 16