java是如何实现的http协议
本文的主要目的是通过一个小例子来看应用层如何发送的消息,消息又是如何收到的呢。本文比较基础,但是对一些和我一样不知道的朋友应该是一个启发。
java是如何实现的网络连接呢?
当然通过Socket,下面就以客户端访问百度为例来说明。
public class BasicConnect {
public static void main(String[] args) {
Socket socket = new Socket();
try {
socket.connect(new InetSocketAddress("www.baidu.com", 80));
} catch (IOException e) {
e.printStackTrace();
System.exit(0);
}
try {
// OutputStream outputStream = socket.getOutputStream();
// outputStream.write("GET/ HTTP/1.1\r\n /n/n Host: www.baidu.com\r\n".getBytes());
OutputStreamWriter streamWriter = new OutputStreamWriter(socket.getOutputStream());
BufferedWriter bufferedWriter = new BufferedWriter(streamWriter);
bufferedWriter.write("GET " + "/" + " HTTP/1.1\r\n");
bufferedWriter.write("Host: " + "www.baidu.com" + "\r\n");
bufferedWriter.write("\r\n");
bufferedWriter.flush();
} catch (IOException e) {
e.printStackTrace();
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
InputStream inputStream = socket.getInputStream();
byte[] bytes = new byte[1024];
int read = 0;
while (read != -1){
read = inputStream.read(bytes);
System.out.println(new String(bytes));
}
} catch (IOException e) {
e.printStackTrace();
}
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Socket连接的建立
- 我们来看这句代码
socket.connect(new InetSocketAddress("www.baidu.com", 80));
,这句代码的含义是告诉系统内核,在底层给我们创建一个连接。其实这句话成功后,操作系统底层就已经3次握手成功了。 bufferedWriter.write();
这句代码后就会把我们发送的消息发送给内核的缓存 ,内核稍后就会发送信息给对应的服务器。InputStream inputStream = socket.getInputStream();
这句话是获取到输入流。在这句话中其实不会从访问的服务器去获取返回数据,而是服务器把返回的信息返回给我们的内核缓存,我们其实读取的是内核缓存的数据,如果这时候内核没有收到返回,这个流在Bio模型下就会阻塞。当然也可能我们在读取的时候内核也没收到完整的返回,这时也会将这部分数据读回来。