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)
相关文章
|
16小时前
|
搜索推荐 Java 数据库连接
探索Java Web开发:Servlet与JSP的协同工作原理
【6月更文挑战第23天】Java Web开发中,Servlet和JSP协同打造动态网站。Servlet是服务器端的Java程序,处理HTTP请求并执行复杂逻辑;JSP则结合HTML和Java,生成动态内容。Servlet通过`doGet()`等方法响应请求,JSP在首次请求时编译成Servlet。两者常搭配使用,Servlet处理业务,JSP专注展示,通过`RequestDispatcher`转发实现数据渲染。这种组合是Java Web应用的基础,即使新技术涌现,其价值仍然重要,为开发者提供了强大的工具集。
|
16小时前
|
Java Android开发
Java Socket编程示例:服务器开启在8080端口监听,接收客户端连接并打印消息。
【6月更文挑战第23天】 Java Socket编程示例:服务器开启在8080端口监听,接收客户端连接并打印消息。客户端连接服务器,发送&quot;Hello, Server!&quot;后关闭。注意Android中需避免主线程进行网络操作。
10 4
|
2天前
|
网络协议 Java Linux
探索Java Socket编程:实现跨平台客户端-服务器通信的奥秘
【6月更文挑战第21天】Java Socket编程示例展示了如何构建跨平台聊天应用。服务器端使用`ServerSocket`监听客户端连接,每个连接启动新线程处理。客户端连接服务器,发送并接收消息。Java的跨平台能力确保代码在不同操作系统上无需修改即可运行,简化开发与维护。
|
2天前
|
Java
Java Socket编程与多线程:提升客户端-服务器通信的并发性能
【6月更文挑战第21天】Java网络编程中,Socket结合多线程提升并发性能,服务器对每个客户端连接启动新线程处理,如示例所示,实现每个客户端的独立操作。多线程利用多核处理器能力,避免串行等待,提升响应速度。防止死锁需减少共享资源,统一锁定顺序,使用超时和重试策略。使用synchronized、ReentrantLock等维持数据一致性。多线程带来性能提升的同时,也伴随复杂性和挑战。
|
2天前
|
安全 Java 网络安全
Java Socket编程技术详解:从基础到进阶的全方位指南
【6月更文挑战第21天】Java Socket编程是网络通信的关键,涉及`Socket`和`ServerSocket`类。基础教程展示了如何创建简单的客户端-服务端交互,而进阶内容涵盖了非阻塞I/O、多路复用(如使用`Selector`)以提升性能,以及通过SSL/TLS确保安全通信。学习Socket编程不仅是技术实践,也是理解网络原理的过程,强调了持续学习和实践的重要性。
|
2天前
|
Java 测试技术 开发者
Java Socket编程实战案例:打造实时通信应用
【6月更文挑战第21天】Java Socket编程用于构建实时通信应用,如简易聊天系统。阻塞式Socket在读写时会阻塞线程,适合入门级应用。非阻塞式Socket(NIO)更高效,适用于高并发场景,允许线程在无数据时立即返回。通过对比两者,可理解实时通信技术的选择关键。示例代码展示了服务器端和客户端的实现。学习Socket编程能为应对未来挑战打下基础。
|
2天前
|
安全 Java 网络安全
Java Socket编程教程:构建安全可靠的客户端-服务器通信
【6月更文挑战第21天】构建安全的Java Socket通信涉及SSL/TLS加密、异常处理和重连策略。示例中,`SecureServer`使用SSLServerSocketFactory创建加密连接,而`ReliableClient`展示异常捕获与自动重连。理解安全意识,如防数据截获和中间人攻击,是首要步骤。通过良好的编程实践,确保网络应用在复杂环境中稳定且安全。
|
2天前
|
Java 数据挖掘 开发者
Java网络编程进阶:Socket通信的高级特性与应用
【6月更文挑战第21天】Java Socket通信是分布式应用的基础,涉及高级特性如多路复用(Selector)和零拷贝,提升效率与响应速度。结合NIO和AIO,适用于高并发场景如游戏服务器和实时数据分析。示例展示了基于NIO的多路复用服务器实现。随着技术发展,WebSockets、HTTP/2、QUIC等新协议正变革网络通信,掌握Socket高级特性为应对未来挑战准备。
|
2天前
|
缓存 监控 Java
Java Socket编程最佳实践:优化客户端-服务器通信性能
【6月更文挑战第21天】Java Socket编程优化涉及识别性能瓶颈,如网络延迟和CPU计算。使用非阻塞I/O(NIO)和多路复用技术提升并发处理能力,减少线程上下文切换。缓存利用可减少I/O操作,异步I/O(AIO)进一步提高效率。持续监控系统性能是关键。通过实践这些策略,开发者能构建高效稳定的通信系统。
|
2天前
|
IDE Java 开发工具
从零开始学Java Socket编程:客户端与服务器通信实战
【6月更文挑战第21天】Java Socket编程教程带你从零开始构建简单的客户端-服务器通信。安装JDK后,在命令行分别运行`SimpleServer`和`SimpleClient`。服务器监听端口,接收并回显客户端消息;客户端连接服务器,发送“Hello, Server!”并显示服务器响应。这是网络通信基础,为更复杂的网络应用打下基础。开始你的Socket编程之旅吧!