前言
在开始这个之前,我想 应该先把HTTP看一下,请求格式和响应格式之类的。
Socket是分UDP和TCP两种连接方式的(TCP和UDP的区别:TCP有状态连接,TCP的三次握手,TCP不丢包,占用资源多;UDP无状态连接,丢包,速度快,占用资源少。实际生活中TCP的应用场景:HTTP,FTP,SMTP,UDP的应用:微信,小视频等)
请求步骤(客户端)
- 通过host和port创建socket连接
- 获取socket中的输出流,往输出流中写入请求数据
- 获取socket中的输入流,读取输入流中的响应数据
响应步骤(服务端)
- 建立监听端口,等待TCP连接请求
- 获取socket中的输入流,读取输入流中的请求数据
- 获取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();
}
}