Skip to content

Web 编程

约 805 个字 87 行代码 预计阅读时间 4 分钟

简介

BS 体系

如今的web几乎都是B/S架构(Browser/Server),它的特点是客户端只需要浏览器,应用数据和逻辑都在服务器。在Web应用中,浏览器请求一个URL,服务器就把生成的HTML网页发送给浏览器。

Web 分类

Web 可以分为: * 静态 web是预先创建好的HTML文件,内容固定不变,用户每次访问时看到的内容相同,这部分由html、CSS、JS就可以完成,适用于内容不频繁变化的网站,如个人博客 * 动态 web:提供给所有的人看的数据始终会变化,每个人在不同的时间,不同的地点看到不同的信息,实际当中大部分网站都是动态的

java web

在服务器端,Java 主要用于处理业务逻辑、数据交互和动态内容生成,是现代 Web 应用开发的核心技术之一。

Java 在服务器端的常用技术: - Java EE / Jakarta EE:企业级开发标准,提供 Web 服务、数据库连接 - Spring 框架:广泛使用的轻量级框架,支持依赖注入、事务管理、安全 - Servlet 和 JSP:用于处理 HTTP 请求和生成动态内容。 - Spring Boot: 简化 Spring 应用的开发和部署。 - Apache Tomcat / Jetty:常用的 Java Web 服务器。

互联网协议

最常见的互联网协议有三个: * HTTP 是用于传输超文本(如网页)的协议,主要用于 Web 浏览器和服务器之间的通信。它是 Web 的基础协议。 * TCP 是一种面向连接的协议,提供可靠的、有序的、基于字节流的数据传输。 * UDP 是一种无连接的协议,提供简单的、不可靠的数据传输服务。

socket 编程

Socket(套接字) 是网络编程中的一个重要概念,用于实现不同主机或同一主机上的进程之间的通信。它提供了一种机制,使得应用程序可以通过网络发送和接收数据。当连接建立时,服务器会创建一个 Socket 对象。客户端和服务器现在可以通过对 Socket 对象的写入和读取来进行通信。

ServerSocket 类

服务器应用程序通过使用 java.net.ServerSocket 类以获取一个端口,并且侦听客户端请求。

Socket 类

java.net.Socket 类代表客户端和服务器都用来互相沟通的套接字。客户端要获取一个 Socket 对象通过实例化 ,而 服务器获得一个 Socket 对象则通过 accept() 方法的返回值。

实例

//客户端代码实现,只保留了关键部分

import java.io.*;
import java.net.*;

public class GreetingClient {
    // 服务器名称和端口通过命令行参数输入
    public static void main(String[] args) throws IOException {
        try (Socket client = new Socket(args[0], Integer.parseInt(args[1]));
             DataOutputStream out = new DataOutputStream(client.getOutputStream());
             DataInputStream in = new DataInputStream(client.getInputStream())) {

            out.writeUTF("Hello from " + client.getLocalSocketAddress());
            System.out.println("Server says: " + in.readUTF());
        }
    }
}
// 服务器端

import java.io.*;
import java.net.*;

public class GreetingServer extends Thread {
    private final ServerSocket serverSocket;

    public GreetingServer(int port) throws IOException {
        serverSocket = new ServerSocket(port);
        serverSocket.setSoTimeout(10000);
    }

    public void run() {
        while (true) {
            try (Socket server = serverSocket.accept();
                 DataInputStream in = new DataInputStream(server.getInputStream());
                 DataOutputStream out = new DataOutputStream(server.getOutputStream())) {

                System.out.println("远程主机地址:" + server.getRemoteSocketAddress());
                System.out.println(in.readUTF()); // 读取客户端消息
                out.writeUTF("谢谢连接我:" + server.getLocalSocketAddress() + "\nGoodbye!"); // 发送响应

            } catch (SocketTimeoutException e) {
                System.out.println("Socket timed out!");
                break;
            } catch (IOException e) {
                e.printStackTrace();
                break;
            }
        }
    }

    public static void main(String[] args) throws IOException {
        new GreetingServer(Integer.parseInt(args[0])).start();
    }
}

运行的话需要开两个命令行窗口,先编译并运行服务器端,然后再在另一个窗口编译并运行客户端,注意不要超时,最终效果: 服务器端: alt text 用户端: alt text

而 JSP、Servlet、Spring MVC 等只是在 这个基础上增添了许多方法,以让我们更方便地编写 web 应用。

URL 处理

在Java中,处理URL通常涉及以下几个步骤:解析URL、打开连接、读取数据等。Java提供了java.net.URL和java.net.HttpURLConnection等类来帮助处理URL相关的操作。

import java.net.HttpURLConnection;
import java.net.URL;

public class HttpURLConnectionExample {
    public static void main(String[] args) {
        try {
            URL url = new URL("https://www.example.com");
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");

            int responseCode = connection.getResponseCode();
            System.out.println("Response Code: " + responseCode);

            if (responseCode == HttpURLConnection.HTTP_OK) {
                // 读取响应数据
                BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                String inputLine;
                StringBuilder response = new StringBuilder();

                while ((inputLine = in.readLine()) != null) {
                    response.append(inputLine);
                }
                in.close();

                System.out.println("Response: " + response.toString());
            } else {
                System.out.println("GET request not worked");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}