TCP/IP协议族
1.分为四层:应用层(FTP、DNS、HTTP)、传输层(TCPUDP)、网络层、数据链路层(硬件)。
2.传输流程:(发送端从应用层往下走,接收端从链路层网上走)
例如客户端是发送端,服务器是接收端:客户端从上到下到链路层,找到服务器的链路层,再从下到上传到应用层。
发送端每通过一层增加上该层的首部信息,接收端每通过一层删除该层的首部信息。这种把信息包装起来的方法叫做封装。
3.TCP协议的作用:请求端把HTTP请求报文分割成有序号的数据包+服务端按序号组合接收到的数据包
4.IP协议的作用:通过路由器,一边中转一边送达数据包。
5.HTTP协议的作用:请求端生成请求报文+服务端分析处理TCP层按序号组合好的请求报文。
6.TCP著名的三次握手众所周知,TCP协议提供可靠的字节流服务(把HTTP请求报文分割成数据包),那么为什么可靠呢?因为使用TCP协议发送完数据包后,发送端会与接收端进行三次握手:
第一次:发送端发送一个标有SYN的数据包
第二次握手:接收端接收到以后,回发一个标有SYN/ACK的数据包
第三次握手:发送端接收到,发送标有ACK的数据包。
ps:SYN和ACK都是TCP的标志。
如有哪个环节莫名中断,TCP协议会重复这个三次握手过程。
服务端代码
import java.util.Scanner; import java.io.*; import java.net.ServerSocket; import java.net.Socket; public class server { public static void main(String[] args) throws Exception{ //1.创建一个服务端socket ServerSocket serverSocket=new ServerSocket(8888); //2调用accept方法等待连接,线程会阻塞状态 System.out.println("Socket服务已启动,等待连接"); Socket socket=serverSocket.accept(); System.out.println("接收到客户端连接请求"); //3.实现数据的交互 //获取输入流 InputStream inputStream= socket.getInputStream(); InputStreamReader isr=new InputStreamReader(inputStream); BufferedReader br=new BufferedReader(isr); String info=null; while((info=br.readLine())!=null){//循环读取信息 System.out.println("收到客户端的请求:"+info); } socket.shutdownInput(); //4.获取输出流,相应客户端请求 OutputStream os=socket.getOutputStream(); PrintWriter out=new PrintWriter(os); out.write("这是server端"); out.flush(); //关闭资源 out.close(); os.close(); br.close(); isr.close(); isr.close(); socket.close(); serverSocket.close(); } }
客户端代码
import java.io.*; import java.net.Socket; public class client { public static void main(String[] args)throws Exception { //1.创建Socket客户端,指定服务器和端口 Socket socket=new Socket("127.0.0.1",8888); //2.连接成功后发送信息 //获取输出流 OutputStream outputStream=socket.getOutputStream(); PrintWriter out=new PrintWriter(outputStream); out.write("admin,admin"); out.flush(); //这一句很重要,要写在前面,如果不写在这里,Socket Server 端的代码就会卡在读取inputStream中 socket.shutdownOutput(); //3.获取输入流得到服务器端的响应 InputStream inputStream= socket.getInputStream(); InputStreamReader isr=new InputStreamReader(inputStream); BufferedReader br=new BufferedReader(isr); String info=null; while((info=br.readLine())!=null){//循环读取信息 System.out.println("收到服务端的响应:"+info); } br.close(); isr.close(); out.close(); out.close(); socket.close(); } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)