1.http协议
http协议是一种用于在网络设备两端传输超文本的协议 此协议分为客户端和服务端 在详细了解此协议之前,我们要清楚 1.客户端一般是指运行在网络设备上的浏览器 2.服务端是提供内容服务的服务器软件 我们来看一下当客户端向服务端发送的请求报文头 这个是由客户端(浏览器)自动构造发送给服务端的
接下来是服务端向客户端的发送的回应报文头 这不是一个最简单的回应报文头,最简单的回应报文头其实只包含 HTTP/1.1 Transfer-Encoding: Content-Type: text/html;charset=UTF-8 data 即可。 接下来我们就用java来模拟一下http在服务器上的体现。 在此之前要先说明的是我的网络拓扑图,以便在运行时更好的讲解 ![在这里插入图片描述](https://img-blog.csdnimg.cn/2020041821423128.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMzNzcwNjg=,size_16,color_FFFFFF,t_70)
package protocols.http;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
public class service
{
public static void main(String args[])
{
try
{
ServerSocket serverSocket = new ServerSocket(4134);
Socket socket = new Socket();
while (true)
{
System.out.println("正在监听------");
socket = serverSocket.accept();
System.out.println("监听到一个客户端请求");
System.out.println("为该客户端创建一个线程实列并开始运行该线程");
serviceThread thread1 = new serviceThread(socket);
thread1.start();
}
}
catch (Exception e)
{
}
}
}
class serviceThread extends Thread
{
private Socket socket;
public serviceThread(Socket t_socket)
{
socket = t_socket;
}
@Override
public void run()
{
System.out.println("线程开始,打印该客户端的ip和端口");
System.out.println(socket.getLocalAddress() + ": " + socket.getLocalPort());
InputStream clientInput = null;
InputStreamReader clientInputStream = null;
BufferedReader clientBufferReader = null;
OutputStream clientOutStream = null;
Writer clientWriter = null;
System.out.println("打印该客户端的请求报文头");
try
{
clientBufferReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String st = null;
while ((st = clientBufferReader.readLine()) != null && st.length() != 0)
{
System.out.println(st);
}
socket.shutdownInput();
System.out.println("构造回应报文头并发送给还客户端");
clientWriter = new OutputStreamWriter(socket.getOutputStream(),"UTF-8");
clientWriter.write("HTTP/1.1 200 \r\n");
clientWriter.write("Transfer-Encoding: chunked");
clientWriter.write("Content-Type: text/html;charset=UTF-8\r\n");
clientWriter.write("\r\n");
clientWriter.write("helloWord\r\n");
clientWriter.flush();
socket.close();
}catch (Exception e)
{
}
}
}
这里要说明的是这个代码运行的流程 接下来我们分别用客户端1和客户端2向服务端发送请求,而后服务端会分别向客户端1和客户端发送回应,该回应到达客户端1和客户端2时,会被客户端1和客户端2(的浏览器)解析。我们用wireshark来分析这个过程。 1.首先我现在服务端运行这个Java代码 2.用客户端1向服务端发送请求 然后客户端1收到服务端的回应报文,并把它解析到浏览器上 接着我们来观察一下wireshark捕获到了什么 以上就是客户端1向服务端发送请求,然后服务端回应的过程
3.接着是客户端2,由于基本上和客户端1相似,这里就在过多讲解 用客户端2向服务端发送请求 4.有机会讲一下三次握手和四次挥手的过程,以及它们是如何保持了tcp的可靠连接
|