javaWeb学习之旅1-java socket编程(请求和响应原理)

前言

在开始这个之前,我想 应该先把HTTP看一下,请求格式和响应格式之类的。
Socket是分UDP和TCP两种连接方式的(TCP和UDP的区别:TCP有状态连接,TCP的三次握手,TCP不丢包,占用资源多;UDP无状态连接,丢包,速度快,占用资源少。实际生活中TCP的应用场景:HTTP,FTP,SMTP,UDP的应用:微信,小视频等)

请求步骤(客户端)

  1. 通过host和port创建socket连接
  2. 获取socket中的输出流,往输出流中写入请求数据
  3. 获取socket中的输入流,读取输入流中的响应数据

响应步骤(服务端)

  1. 建立监听端口,等待TCP连接请求
  2. 获取socket中的输入流,读取输入流中的请求数据
  3. 获取socket中的输出流,往输出流中写入响应数据

总结

客户端和服务端就是通过socket中的输入输出流来进行通讯的。

客户端代码

package com.my.test.web;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

/**
 * @author lf
 * @Title: MyHttpClient
 * @Description: java socket 客户端
 * @date 2019/4/1 14:52
 */
public class MyHttpClient {

    public static void main(String[] args) throws Exception{
        String uri = "index.html";
        doGet("127.0.0.1",8080,uri);
    }

    private static void doGet(String host, int port, String uri) throws Exception{
        //1.建立socket连接
        Socket socket = new Socket(host, port);
        //2.从socket中获取输出流 写入请求数据
        StringBuffer requsetInfo = new StringBuffer();
        requsetInfo.append("GET "+uri+" HTTP/1.1\r\n");//请求第一行
        requsetInfo.append("Accept: */*\r\n");//请求头信息
        /*
        * requestInfo.append(.....);
        * */
        OutputStream socketOut = socket.getOutputStream();
        socketOut.write(requsetInfo.toString().getBytes());
        //3.从socket中获取输入流 读取响应数据
        InputStream socketIn = socket.getInputStream();
        int size = socketIn.available();
        byte[] buffer = new byte[size];
        socketIn.read(buffer);

        String responseStr = new String(buffer);
    }
}

服务端代码

package com.my.test.web;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @author lf
 * @Title: MyHttpServer
 * @Description: java socket http服务端
 * @date 2019/4/1 14:35
 */
public class MyHttpServer {

    public static void main(String[] args) throws Exception{
        int port = 8080;
        //1.监听8080端口
        ServerSocket serverSocket = new ServerSocket(port);
        System.out.println("服务器正在监听"+port+"端口,等待客户端请求");
        //2.等待客户连接
        while (true){
            Socket socket = serverSocket.accept();
            System.out.println("客户端和服务建立了连接!客户端的ip是:"+socket.getInetAddress());
            //3.处理请求
            service(socket);
        }
    }

    /**
      * @Description: 处理请求
      * @author lf
      * @date 2019/4/1 14:42
      */
    private static void service(Socket socket) throws Exception{
        //获取输入流 从输入流中读取请求数据
        InputStream socketIn = socket.getInputStream();
        int size = socketIn.available();
        byte[] buffer = new byte[size];
        socketIn.read(buffer);
        String requsetStr = new String(buffer);

        /*
        * 解析请求中的数据和请求的资源
        * */

        //
        OutputStream socketOut = socket.getOutputStream();
        String responseFirstLine = "HTTP/1.1 200 OK\r\n";
        String responseHeader = "Content-Type:text\\html";
        socketOut.write(responseFirstLine.getBytes());
        socketOut.write(responseHeader.getBytes());

        //关闭套接字
        socket.close();
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值