Java Socket带你了解什么是协议

338 阅读4分钟

Http协议

HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。

什么是协议?

通信协议(英語:Communications Protocol,也称传输协议)在电信領域中指的是,在任何物理介质中允许两个或多个在传输系统中的终端之间传播信息的系统标准,也是指计算机通信或網路設備的共同语言。 通信协议定义了通信中的语法学、语义学和同步规则以及可能存在的错误检测与纠正。通信协议在硬件、软件或两者之间皆可实现

简单的举一个例子,现在我们模拟有两个通信对象,通信对象A,和通信对象B,然后通信对象A和通信对象B都需要知道一个协议(这里就叫它AB协议),通信对象A给通信对象B发送了一个0xAABB,在AB协议上0xAABB这个字符串的含义是我要读取你的文件列表,然后通信对象B接收到了A发送的0xAABB字符串,就知道通信对象A想要读取通信B的文件列表,然后通信对象B将自己的文件列表读取出来之后在传输给通信对象A。

import java.io.*;
import java.net.*;
public class HttpServer extends Thread{   

    private ServerSocket serverSocket;

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

    public void run()
    {
       while(true)
       {
    	   try {
             System.out.println("等待远程连接,端口号为:" + serverSocket.getLocalPort() + "...");
             Socket server = serverSocket.accept();
             System.out.println("远程主机地址:" + server.getRemoteSocketAddress());

             //获取输入流,即从服务器获取的数据
             final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(server.getInputStream()));
             //获取输出流,即我们写出给服务器的数据
             BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(server.getOutputStream()));
             String line;
            	 //输出请求数据
                 while ((line = bufferedReader.readLine()) != null && !line.equals("")) {
                     System.out.println(line);
                 }
                 System.out.println("请求结束");
                 //将HelloWorld响应给客户端 HTTP协议
                 StringBuffer html = new StringBuffer();
                 //响应头
                 html.append("HTTP/1.1 200 OK \n");
                 html.append("Content-Type: text/html;charset=UTF-8 \n");
                 //换行
                 html.append("\n");
                 //响应体
                 html.append("<!DOCTYPE html>");	
                 html.append("<html>");	
                 html.append("<head>");
                 html.append("<meta charset=\"UTF-8\">");
                 html.append("<title>");
                 html.append("十万");
                 html.append("</title>");
                 html.append("</head>");
                 html.append("<body>");
                 html.append("<p>");
                 html.append("十万你好");
                 html.append("</p>");
                 html.append("</body>");
                 html.append("</html>");
                 //String默认为系统编码格式
                 //在CMD中输入chcp可以获得一个数值936,这就表示了是GBK的编码方式。
                 //下边将其转换为UTF-8编码方式
                 bufferedWriter.write(new String(new String(html.toString()).getBytes("UTF-8")));
                 bufferedWriter.flush();
             server.close();							
          }catch(SocketTimeoutException s)
          {
             System.out.println("Socket timed out!");
             continue;
          }catch(IOException e)
          {
             e.printStackTrace();
             break;
          }
       }
    }
    public static void main(String [] args)
    {
       int port = Integer.parseInt(args[0]);
       try
       {
          Thread t = new HttpServer(port);
          t.run();
       }catch(IOException e)
       {
          e.printStackTrace();
       }
    }
}

这里写了一个简单实现HTTP协议的代码。

我们将其编译运行。

java HttpServer 80 这里的80指的是服务端口。因为我们一会需要使用浏览器进行访问,所以这里设置成80,因为HTTP协议默认端口号为80,当然你也可以改成别的。

回车将程序启动,然后就到了我们的浏览器环节。

在浏览器地址栏直接输入自己的IP地址,当然127.0.0.1也可以,localhost一般也没什么问题。

然后我们就得到了这样的一个页面。

返回了一个十万你好,到这里就结束了。

怎么可能! 这次我们可是要了解到底什么是协议的!

重来,我们使用GET请求方式,在URL后面添加一点参数。

然后我们在来查看我们的程序看看输出了什么。

可以看到浏览器给我们的程序发了很多的信息,我们输入的请求URL在倒数第四行。

我们得到这些信息之后可以做一些什么呢?

通过读取请求信息中的参数,就可以完成后台的路由,可以根据你传输的参数去选择执行什么方法,也可以进行通信。

因为HTTP协议是无连接,无状态的。所以在我们输入URL并按下回车的那一刻,从我们的浏览器向服务器建立了一个连接,然后服务器经过处理之后在将HTML或CSS,JS代码返回给我们的浏览器,返回之后就关闭了本次连接。这里说的是正常情况。

我按照HTTP响应报文的格式编写了一段HTML代码,返回给我们的浏览器,然后关闭了本次连接。