通过一个Socket例子理解Http协议(实战Java Web服务器--使用HTTP协议和JAVA类实现)

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
Web服务器与客户端的通信使用HTTP协议(超文本传输协议),所以也叫做HTTP服务器。用Java构造Web服务器主要用二个类,java.net.Socket和java.net.ServerSocket,来实现HTTP通信。因此,本文首先要讨论的是HTTP协议和这两个类,在此基础上实现一个简单但完整的Web服务器。

   一、超文本传输协议

  Web服务器和浏览器通过HTTP协议在Internet上发送和接收消息。HTTP协议是一种请求-应答式的协议——客户端发送一个请求,服务器返回该请求的应答。HTTP协议使用可靠的TCP连接,默认端口是80。HTTP的第一个版本是HTTP/0.9,后来发展到了HTTP/1.0,现在最新的版本是HTTP/1.1。HTTP/1.1由 RFC 2616 定义(pdf格式)。

  本文只简要介绍HTTP 1.1的相关知识,但应该足以让你理解Web服务器和浏览器发送的消息。如果你要了解更多的细节,请参考RFC 2616。

  在HTTP中,客户端/服务器之间的会话总是由客户端通过建立连接和发送HTTP请求的方式初始化,服务器不会主动联系客户端或要求与客户端建立连接。浏览器和服务器都可以随时中断连接,例如,在浏览网页时你可以随时点击“停止”按钮中断当前的文件下载过程,关闭与Web服务器的HTTP连接。

   1.1 HTTP请求

  HTTP请求由三个部分构成,分别是:方法-URI-协议/版本,请求头,请求正文。下面是一个HTTP请求的例子:

GET /servlet/default.jsp HTTP/1.1
Accept: text/plain; text/html 
Accept-Language: en-gb 
Connection: Keep-Alive 
Host: localhost 
Referer: http://localhost/ch8/SendDetails.htm 
User-Agent: Mozilla/4.0 (compatible; MSIE 4.01; Windows 98) 
Content-Length: 33 
Content-Type: application/x-www-form-urlencoded 
Accept-Encoding: gzip, deflate 

userName=JavaJava&userID=javaID


  请求的第一行是“方法-URI-协议/版本”,其中GET就是请求方法,/servlet/default.jsp表示URI,HTTP/1.1是协议和协议的版本。根据HTTP标准,HTTP请求可以使用多种请求方法。例如,HTTP 1.1支持七种请求方法:GET,POST,HEAD,OPTIONS,PUT,DELETE,和TRACE。在Internet应用中,最常用的请求方法是GET和POST。

  URI完整地指定了要访问的网络资源,通常认为它相对于服务器的根目录而言,因此总是以“/”开头。URL实际上是 URI 一种类型。最后,协议版本声明了通信过程中使用的HTTP协议的版本。

  请求头包含许多有关客户端环境和请求正文的有用信息。例如,请求头可以声明浏览器所用的语言,请求正文的长度,等等,它们之间用一个回车换行符号(CRLF)分隔。

  请求头和请求正文之间是一个空行(只有CRLF符号的行),这个行非常重要,它表示请求头已经结束,接下来的是请求的正文。一些介绍Internet编程的书籍把这个CRLF视为HTTP请求的第四个组成部分。

  在前面的HTTP请求中,请求的正文只有一行内容。当然,在实际应用中,HTTP请求正文可以包含更多的内容。

   1.2 HTTP应答

  和HTTP请求相似,HTTP应答也由三个部分构成,分别是:协议-状态代码-描述,应答头,应答正文。下面是一个HTTP应答的例子:

HTTP/1.1 200 OK
Server: Microsoft-IIS/4.0
Date: Mon, 3 Jan 1998 13:13:33 GMT
Content-Type: text/html
Last-Modified: Mon, 11 Jan 1998 13:23:42 GMT
Content-Length: 112

<html>
<head>
<title>HTTP应答示例</title></head><body>
Hello HTTP!
</body>
</html>


  HTTP应答的第一行类似于HTTP请求的第一行,它表示通信所用的协议是HTTP 1.1,服务器已经成功地处理了客户端发出的请求(200表示成功),一切顺利。

  应答头也和请求头一样包含许多有用的信息,例如服务器类型、日期时间、内容类型和长度等。应答的正文就是服务器返回的HTML页面。应答头和正文之间也用CRLF分隔。

   二、Socket类

  Socket代表着网络连接的一个端点,应用程序通过该端点向网络发送或从网络读取数据。位于两台不同机器上的应用软件通过网络连接发送和接收字节流,从而实现通信。要把消息发送给另一个应用,首先要知道对方的IP地址以及其通信端点的端口号。在Java中,通信端点由java.net.Socket类表示。

  Socket类有许多构造函数,其中一个构造函数的参数是主机名称和端口号:

public Socket(String host, int port)


  host是远程机器的名字或IP地址,port是远程应用的端口号。例如,如果要连接到yahoo.com的80端口,我们可以用“new Socket("yahoo.com", 80);”语句构造一个Socket。

  成功创建了Socket类的实例之后,我们就可以用它来发送和接收字节流形式的数据。要发送字节流,首先要调用Socket类的getOutputStream方法获得一个java.io.OutputStream对象;为了向远程应用发送文本数据,我们经常要从返回的OutputStream对象构造一个java.io.PrintWriter对象。要从连接的另一端接收字节流,首先要调用Socket类的getInputStream方法获得一个java.io.InputStream对象。

  例如,下面的代码片断创建一个与本地HTTP服务器(127.0.0.1代表本地主机的IP地址)通信的Socket,发送一个HTTP请求,准备接收服务器的应答。它创建了一个StringBuffer对象来保存应答,然后把应答输出到控制台。

Socket socket    = new Socket("127.0.0.1", "8080");
OutputStream os   = socket.getOutputStream();
boolean autoflush = true;
PrintWriter out   = new PrintWriter( socket.getOutputStream(), autoflush );
BufferedReader in = new BufferedReader( 
    new InputStreamReader( socket.getInputStream() ));

// 向Web服务器发送一个HTTP请求
out.println("GET /index.jsp HTTP/1.1");
out.println("Host: localhost:8080");
out.println("Connection: Close");
out.println();

// 读取服务器的应答
boolean loop    = true;
StringBuffer sb = new StringBuffer(8096);

while (loop) {
    if ( in.ready() ) {
        int i=0;
        while (i!=-1) {
            i = in.read();
            sb.append((char) i);
        }
        loop = false;
    }
    Thread.currentThread().sleep(50);
}

// 把应答显示到控制台
System.out.println(sb.toString());
socket.close();


  注意,为了保证Web服务器能够返回正确的应答,客户端发送的HTTP请求应该遵从双方约定的HTTP协议版本。

   三、ServerSocket类

  Socket类代表的是“客户”通信端点,它是一个连接远程服务器应用时临时创建的端点。对于服务器应用,例如HTTP服务器或FTP服务器,我们需要另一种端点,因为我们不知道客户端应用什么时候会试图连接服务器,服务器必须一直处于等待连接的状态。

  因此,对于服务器端的通信端点,我们要使用java.net.ServerSocker类。ServerSocket等待来自客户端的连接请求;一旦接收到请求,ServerSocket创建一个Socket实例来处理与该客户端的通信。

  ServerSocket提供了四个构造函数。创建ServerSocket的实例时,我们必须指定监听客户端消息的IP地址(称为“绑定地址”,Binding Address)和端口。通常情况下,这个IP地址总是127.0.0.1,也就是说服务器端点将在本地机器上监听。服务器端点的另一个重要属性是它的backlog值,这是保存客户端连接请求的最大队列长度,一旦超越这个长度,服务器端点开始拒绝客户端的连接请求。

  下面是ServerSocket类构造函数的其中一种形式:

public ServerSocket(int port, int backLog, InetAddress bindingAddress);


  这个构造函数要求绑定地址必须是一个java.net.InetAddress的实例。要构造一个InetAddress对象,一种简单的办法是调用它的静态getByName方法,传入一个表示主机名称/地址的String。例如,下面的代码构造了一个在本地机器的8080端口监听的ServerSocket,它的backlog值是1:

new ServerSocket(8080, 1, InetAddress.getByName("127.0.0.1"));


  创建好ServerSocket实例之后,调用它的accept方法,要求它等待传入的连接请求。只有出现了连接请求时,accept方法才会返回,它的返回值是一个Socket类的实例。随后,这个Socket对象就可以用来与客户端应用通信。

   四、Web服务器实例

  本文的Web服务器由三个类构成,分别是:HttpServer,Request ,Response。

  应用的入口点(static main方法)在HttpServer类。main方法创建一个HttpServer实例,然后调用await方法。从await方法的名字也可以看出,它的功能是在指定的端口上等待HTTP请求,然后处理请求,把处理的结果返回给客户端。除非收到了关闭服务器的命令,否则await将一直保持等待客户端请求的状态。(之所以用await而不是wait作为方法名,是因为wait是System.Object类中一个用来操作线程的重要方法)。

  本文的Web服务器只能发送指定目录下的静态资源,例如HTML和图形文件。它不支持头信息(例如日期时间、Cookie等)。

   4.1 HttpServer类

  HttpServer类代表一个Web服务器,提供由WEB_ROOT变量指定的目录及其子目录下的静态资源。WEB_ROOT用下面的语句初始化:

public static final String WEB_ROOT =
    System.getProperty("user.dir") + File.separator  + "webroot";


  本文最后的下载代码包中有一个webroot目录,它里面有一些静态Web页面,可用来测试本文的服务器。要打开webroot目录下的静态页面,在浏览器的地址栏输入URL:http://machineName:port/staticResource。

  如果运行Web服务器的机器和浏览器所在的机器不同,machineName必须是Web服务器所在机器的IP地址或名称;如果浏览器和Web服务器在同一台机器上运行,machineName也可以是localhost。port是8080,staticResource是要请求的资源(页面)文件名称。

  例如,假设我们在同一台机器上运行Web服务器和浏览器,如果要求HttpServer返回index.html文件,则URL是:

http://localhost:8080/index.html


  要关闭Web服务器,在浏览器的地址栏输入一个预定义的关闭命令,即在URL的“主机名称:端口”之后,加上SHUTDOWN_COMMAND变量定义的字符。假设SHUTDOWN_COMMAND变量的值是“/SHUTDOWN”,我们可以在浏览器地址栏输入“http://localhost:8080/SHUTDOWN”关闭Web服务器。

  下面我们来看看await方法的代码,代码的说明随后给出。

【HttpServer类的await方法】

public void await() {
    ServerSocket serverSocket = null;
    int port = 8080;
    try {
        serverSocket =  new ServerSocket(port, 1,
        InetAddress.getByName("127.0.0.1"));
    }
    catch (IOException e) {
        e.printStackTrace();
        System.exit(1);
    }

    // 循环,等待客户端发来的请求
    while (!shutdown) {
        Socket socket = null;
        InputStream input = null;
        OutputStream output = null;
        try {
            socket = serverSocket.accept();
            input = socket.getInputStream();
            output = socket.getOutputStream();
            // 创建Request对象并予以解析
            Request request = new Request(input);
            request.parse();
            // 创建Response对象
            Response response = new Response(output);
            response.setRequest(request);
            response.sendStaticResource();
            // 关闭Socket
            socket.close();
            // 检查该URI是否为关闭服务器的命令
            shutdown = request.getUri().equals(SHUTDOWN_COMMAND);
        }
        catch (Exception e) {
            e.printStackTrace();
            continue;
        }
    }
}


  await方法首先创建一个ServerSocket实例,然后进入while循环等待来自客户端的请求。while循环里面的代码会在执行ServerSocket的accept方法时等待,直到8080端口收到一个HTTP请求。然后,从accept返回的Socket获得一个java.io.InputStream和一个java.io.OutputStream。接下来,await方法创建一个Request对象,调用parse方法解析原始的HTTP请求。接着,await方法又创建一个Response对象,把前面创建的Request对象传递给它,调用它的sendStaticRessource方法。

  最后,await方法关闭Socket,调用Request方法的getUri方法,查检该HTTP请求的URI是否为一个关闭服务器的命令。如果是,把shutdown变量的值设置为true,while循环结束。

   4.2 Request类

  Request类代表一个HTTP请求。创建Request类的实例时要传入一个从负责与客户端通信的Socket获得的InputStream对象。调用InputStream对象的其中一个read方法可获得HTTP请求的原始数据。

  Request类有两个公用方法parse和getUri。parse方法解析HTTP请求中的原始数据,其实它的功能并不多——它唯一提取的信息是HTTP请求的URI,通过调用私有的parseUri方法获得。parseUri把Uri保存在uri变量中。调用公用的getUri方法可返回HTTP请求的URI。

  要理解parse和parseUri的工作原理,首先要理解HTTP请求的结构,参见本文前面内容以及RFC 2616。如前所述,HTTP请求包含三个部分,现在我们感兴趣的是第一部分,即所谓的“请求行”,包括请求方法、URI和协议版本,最后是一个CRLF字符。请求行里面的各个部分由空格分隔,例如,用GET方法请求index.html文件的请求行是:

GET /index.html HTTP/1.1


  parse方法读取传递给Request对象的InputStream的整个字节流,把字节数据保存到缓冲区,然后利用buffer字节数组中的内容填写一个称为request的StringBuffer对象,把该StringBuffer的String描述传递给parseUri方法。parse方法的代码如下所示:

【Request类的parse方法】

public void parse() {
    // 从Socket读取一组数据
    StringBuffer request = new StringBuffer(2048);
    int i;
    byte[] buffer = new byte[2048];

    try {
        i = input.read(buffer);
    }
    catch (IOException e) {
        e.printStackTrace();
        i = -1;
    }

    for (int j=0; j<i; j++) {
        request.append((char) buffer[j]);
    }

    System.out.print(request.toString());
    uri   = parseUri(request.toString());
}


  parseUri从请求行获得URI,下面给出了parseUri方法的代码。parseUri方法搜索请求中的第一、二两个空格字符,提取出URI。

【Request类的parseUri方法】
private String parseUri(String requestString) {
    int index1, index2;
    index1 = requestString.indexOf(' ');

    if (index1 != -1) {
        index2 = requestString.indexOf(' ', index1 + 1);
        if (index2 > index1)
           return requestString.substring(index1 + 1, index2);
    }
    return null;
}


   4.3 Response类

  Response类代表一个HTTP应答。它的构造函数要求指定一个OutputStream对象,例如:

public Response(OutputStream output) {
    this.output = output;
}


  Response类有两个公用方法:setRequest和sendStaticResource。setRequest方法用来把Request对象传递给Response对象,很简单,如下所示:

【Response类的setRequest方法】

public void setRequest(Request request) {
    this.request = request;
}


  sendStaticResource方法用来发送静态资源,如HTML文件等。它的实现如下所示:

【Response类的sendStaticResource方法】

public void sendStaticResource() throws IOException {
    byte[] bytes = new byte[BUFFER_SIZE];
    FileInputStream fis = null;

    try {
        File file  = new File(HttpServer.WEB_ROOT, request.getUri());
        if (file.exists()) {
            fis = new FileInputStream(file);
            int ch = fis.read(bytes, 0, BUFFER_SIZE);

            while (ch != -1) {
                output.write(bytes, 0, ch);
                ch = fis.read(bytes, 0, BUFFER_SIZE);
            }
        }
        else {
            // 找不到文件
            String errorMessage = "HTTP/1.1 404 File Not Found\r\n" +
                "Content-Type: text/html\r\n" +
                "Content-Length: 23\r\n" +
                "\r\n" +
                "<h1>File Not Found</h1>";
            output.write(errorMessage.getBytes());
        }
    }
    catch (Exception e) {
        // 如不能实例化File对象,抛出异常。
        System.out.println(e.toString() );
    }
    finally {
        if (fis != null)
            fis.close();
    }
}


  sendStaticResource方法首先创建一个java.io.File类的实例,在调用File类构造函数时指定了Web服务器的根目录和请求的目标URI。然后,sendStaticResource 检查用户请求的文件是否存在,如存在,它在该File对象的基础上创建一个java.io.FileInputStream对象,然后调用FileInputStream的read方法,把读取的字节数组写入到OutputStream输出。如果用户请求的文件不存在,sendStaticResource方法向浏览器发送一个错误信息。

   五、编译和运行

  下载本文后面提供的zip文件,解开压缩。解开压缩时你指定的目标目录称为“工作目录”。工作目录下有二个子目录:src,webroot。webroot目录下包含一些示例页面。在工作目录下执行下面的命令编译Web服务器:

javac -d . src/*.java


  “-d .”选项表示把编译结果保存到当前目录(即工作目录),而不是保存到src目录。执行java HttpServer就可以启动Web服务器。

  假设浏览器和Web服务器运行在同一台机器上,打开浏览器,输入URL:http://localhost:8080/index.html。浏览器显示出图一所示的页面。

  图一



  同时,在Java控制台上,可以看到Web服务器的输出,如图二。

  图二



  结束语:本文通过开发一个简单的JavaWeb服务器,介绍了Web服务器的基本工作原理。虽然本文开发的Web服务器不具备复杂的功能,但它足以作为一个不错的学习工具。
SocketHTTP解析 1.网络基础网络分层:计算机网络分层模型有两种 OSI参考模型 TCP/IP参考模型 网络层:根据IP查找到目的地址的主机 运输层:通过端口把数据发送给目的主机,实现进程间通信 2.端口端口规定有16位,及计算机有2的16次方65536个端口。3.C/S架构定义:即客户端/服务端,软件体系架构作用:利用客户端服务端的硬件资源,将任务合理的分配到客户端服务端来实现,降低开销 Soc 阅读详情

相关推荐

Java集成WebSocket服务

WebSocket实现长连接

ITKidKid的博客 4396

通过一个Socket例子理解Http协议

来自:http://tech.163.com/tm/030531/030531_95888.htmlWeb服务器与客户端的通信使用HTTP协议(超文本传输协议),所以也叫做HTTP服务器。用Java构造Web服务器主要用二个java.net.Socketjava.net.ServerSocket,来实现HTTP通信。因此,本文首先要讨论的是HTTP协议这两个,在此基础上实现一个简单但

autoinspired的专栏 2784

HTTP学习与Web服务器编程

这次的主题是查找HTTP协议的相关资料,基于此编写一个简单的Web服务器。 需要完成的几大主要的要求有: 1)编写一个简单的Web服务器; 2)实现服务器应能与标准的浏览器进行简单的交互; 3)记录浏览器与服务的交互过程; 4)利用HTML语言编写网页浏览器可通过编写的Web服务器正常访问该网页; 5)支持多用户并发访问; 6)扩展编写的简单Web服务器,使浏览器能够浏览Web上存储

codes_first的博客 5403

Java网络编程之简易Web服务器实现

这里,我们写入了HTTP/1.1 200 ok作为响应的状态行,Content-Type:text/html作为响应的Content-Type,Content-Length来指定响应体的长度。在Main的main方法中,我们首先创建一个ServerSocket对象,监听指定的端口号(这里设为7777)。通过InputStream的read()方法,我们可以读取字节流,并使用指定的字符编码将其转换为字符串。在实际的开发中,我们可能需要添加更多的功能错误处理逻辑,以提高服务器的稳定性安全性。

m0_64577506的博客 294

使用java自制简易web服务器

记得好多年前,刚刚开始学javaweb的时候,老师教的第一件事是安装jdk,第二件事就是安装tomcat了。当时老师的操作是,下载完压缩包后解压,然后把tomcat的bin目录添加到环境变量里面,然后打开黑乎乎的cmd,输入catalina就可以运行tomcat了。当时还不知道为什么只要添加了环境变量,就可以在cmd里面启动tomcat,更不要说为什么我们什么都没有设置,输入一个命令就能启动web服务器了。

haohulala的博客 2227

利用Java Socket编写一个简单的Web服务器

1-2 利用Java Socket编写一个简单的Web服务器,具体如下: (1)、使用 ServerSocket 监听某一端口,然后等待连接获取 Socket对象; (2)、创建一个 HttpServer 继承 java.lang.Thread ,重写 run()方法,执行浏览器请求; (3)、获得浏览器请求,解析资源文件路径; (4)、读取资源文件,响应给浏览器; (5)、浏览器地址栏输入: http://localhost:8000/index.html; (6)、效果如下: 代码: 启动 pu

Jackyyl729的博客 7604

深入理解 Tomcat(三)Tomcat 底层实现原理

又是一个周末,这篇文章将从一个简单的例子理解tomcat的底层设计;本文将介绍 Java Web 服务器是如何运行的, Web 服务器也称为超文本传输协议( HyperText Transfer Protocol, HTTP)服务器, 因为它使用 Http 与其客户端(通常是 Web 浏览器)进行通信, 基于 JavaWeb 服务器使用两个重要的: java.net.Socket

ignore 2万+

Socket编程到Http协议,了解Tomcat底层,实现自己的HTTP服务器

上节我们知道Tomcat里面的server里的service里的connector的endpoint部分作用在传输层,processor部分作用在应用层。 Web服务器 本文将介绍 Java Web 服务器是如何运行的, Web 服务器也称为超文本传输协议( HyperText Transfer Protocol, HTTP)服务器, 因为它使用 Http 协议与其客户端(通常是 Web 浏览...

DLyangzy的博客 853

JAVA编写的一个简单的Socket实现HTTP响应服务器

JAVA编写的一个简单的Socket实现HTTP响应服务器,看后就很容易理解Web服务器的原理了。 package test.io; import java.net.*; import java.io.*; /** * 一个简单的Socket实现HTTP响应服务器。 * 只用于熟悉HTTP协议的目的,可以看到浏览器发过来的数据格式。 * * @author */ publ

雷霄骅(leixiaohua1020)的专栏 7942

手写Socket Web服务器:深入HTTP协议底层原理

HTTP协议Web通信的基石,其本质是一套严格定义的文本格式与状态交互规范。理解它需回归传输层——TCP连接建立、请求响应格式(如状态行、头/体分隔符\r\n\r\n)、字符编码与字节长度一致性等核心原理。这些知识直接决定CORS拦截、中文乱码、Content-Length错误等高频问题的排查效率。在现代框架封装日益厚重的今天,亲手用Socket实现一个可被Chrome识别的极简Web服务器,成为掌握Web运行机制最有效的实践路径。本文即以DebugLZQ经典案例为蓝本,还原从URI解析、DNS查询、So

weixin_40192258的博客 514

socket编程 java多线程web服务器设计与实现

相信很多人在socket编程学习过程中,都会遇到似的web服务器的设计案例,可是对于刚接触socket的新手来说,往往难以迈出第一步,于是在此分享一个多线程的web服务器代码(参考计算机网络课程的代码框架),便于各位网友参考学习使用! 一、理解多线程 多线程是这样一种机制,它允许在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间互相独立。 线程又称为轻量级进程,它进程一样...

a1004070060的博客 3547

自己写一个简单的Web服务器(附Demo)

一、什么是Web服务器? 先来写个例子亲身体验一下。下面的示例代码演示了如何通过 java.net.Socketjava.net.ServerSocket这两个重要的创建一个简单基于 JavaWeb 服务器 。这个服务器通过8784号端口提供访问,向浏览器返回一个固定的静态网页。在这个示例中,请求的消息由浏览器生成, 并发送到服务器,这个程序将简单地显示请求的消息。 回应

剽悍的人生不需要解释,你到处解释就不彪悍了 8561

使用Java socket 实现 HTTP 协议

突然发现 CSDN 可以使用MarkDown编辑器了,真是一种进步啊!不过貌似出来的太晚了,呵呵。 这篇文章我们讲一下如何使用 简单地Java socket实现部分的 HTTP协议。 1. 要实现HTTP协议必须要了解 HTTP协议 HTTP协议是超文本传输协议(Hypertext Transfer Protocol),在OSI七层模型之中属于应用层协议。 在传输层由TCP/I

xiaorenwuzyh的专栏 1651

tomcat之web容器

深入学习Java Web服务器系列一一个简单的静态web服务器我们下面来实现一个简单的静态web服务器。 这个服务器实现的功能很简单,就是启动监听,当用户在浏览器输入URL发送http请求时,服务器进行解析并返回请求的静态资源。系统的时序图如下所示: 下面我们一起来实现这个简单的静态web服务器。本文分成三个部分,第一第二部分为知识介绍,简单介绍一下http协议Socket协议,因为这两个

hugua专栏 3473

Windows平台下使用Java构建Web服务器的实验指南

HTTP(HyperText Transfer Protocol,超文本传输协议)是一种用于分布式、协作式超媒体信息系统的应用层协议。它通过请求-响应模型在客户端与服务器间传递信息。了解HTTP的基本工作原理,是深入学习Java网络编程Web服务器开发的前提。网络编程是指编写程序以在计算机网络中进行通信的过程。随着互联网技术的发展,网络编程已成为软件开发中不可或缺的一部分。它使得软件应用能够实现数据传输、资源共享、服务交互等功能,为分布式应用全球访问提供了基础。

weixin_35390379的博客 1024

socket 请求Web服务器过程

HTTP协议只是一个应用层协议,它底层是通过TCP进行传输数据的。因此,浏览器访问Web服务器的过程必须先有“连接建立”的发生。 而有人或许会问:众所周知,HTTP协议有两大特性,一个是“无连接”性,一个是“无状态”性。这里的“无连接”岂不是跟上面的说法有冲突?其实这里并没有矛盾,只是人们对“连接”这个词的理解有差异。首先我们来看一下浏览器向Web服务器发出Http请求以及Web服务器给浏览器回

知秋一叶 5167

实战WEB 服务器JAVA编写WEB服务器

  一、超文本传输协议     1.1 HTTP请求     1.2 HTTP应答   二、Socket   三、ServerSocket   四、Web服务器实例     4.1 HttpServer     4.2 Request     4.3 Response   五、编译运行   ===================   正文:   ===================

浮白 2万+

基于TCP Socket实现HTTP WEB服务器

一、实验目的及任务 分析HTTP协议,编写一个简单的Web服务器。 利用Wireshark捕获数据包,分析一个浏览器与Web服务器的交互过程 编写一个简单的Web服务器 实现服务器应能与标准的浏览器(如IE浏览器)进行简单的交互 记录浏览器与服务的交互过程 利用HTML语音编写网页(可以不包括图像、声音等多媒体文件),浏览器可通过编写的Web服务器正常访问该网页 ...

demongwc的博客 1248
上一篇: TCP/IP,http,socket,长连接,短连接——小结。
下一篇: 用socket实现自己的HTTP代理服务器
rongwenbin
博客等级 码龄17年 291粉丝 244原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值