1.学习视频**:**公开课 20210208拯救稀碎的基础—Socket
2.学习内容:
1>TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计的 。
补充:
1)三次握手:
1. 客户端发送一个SYN段,并指明客户端的初始序列号,即ISN©.1. 服务端发送自己的SYN段作为应答,同样指明自己的ISN(s)。为了确认客户端的SYN,将ISN©+1作为ACK数值。这样,每发送一个SYN,序列号就会加1. 如果有丢失的情况,则会重传。1. 为了确认服务器端的SYN,客户端将ISN(s)+1作为返回的ACK数值。
2)四次挥手:
1. 客户端发送一个FIN段,并包含一个希望接收者看到的自己当前的序列号K. 同时还包含一个ACK表示确认对方最近一次发过来的数据。1. 服务端将K值加1作为ACK序号值,表明收到了上一个包。这时上层的应用程序会被告知另一端发起了关闭操作,通常这将引起应用程序发起自己的关闭操作。1. 服务端发起自己的FIN段,ACK=K+1, Seq=L1. 客户端确认。ACK=L+1
3)为什么建立连接是三次握手,而关闭链接却是四次挥手呢?
这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方是否现在关闭发送数据通道,需要上层应用来决定,因此,己方ACK和FIN一般都会分开发送。
2>UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是属于TCP/IP协议族中的一种。 不安全 如何避免(人为握手 消息队列)
3>HTTP超文本传输协议(Hypertext Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII形式给出;而消息内容则具有一个类似MIME的格式。这个简单模型是早期Web成功的有功之臣,因为它使开发和部署非常地直截了当。
补充:
MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
它是一个互联网标准,扩展了电子邮件标准,使其能够支持:
MIME规定了用于表示各种各样的数据类型的符号化方法。 此外,在万维网中使用的HTTP协议中也使用了MIME的框架,标准被扩展为互联网媒体类型
4>Socket**是什么呢?
Socket(套接字)是应用层与TCP/IP协议族通信的中间软件抽象层(将两种(TCP UDP)不同的协议都封装好啦 提供现成的类),它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
工作流程:
要通过互联网进行通信,至少需要一对套接字,其中一个运行于客户端,我们称之为 Client Socket,另一个运行于服务器端,我们称之为 Server Socket 。
根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:
(1)服务器监听。
(2)客户端请求。
(3)连接确认
5>UIL(uniform resource locator)—>统一资源定位器—不是所谓的HTTP协议
UIL是因特网的万维网服务程序上用于指定信息位置的表示方法。它最初是由蒂姆·伯纳斯·李发明用来作为万维网的地址。现在它已经被万维网联盟编制为互联网标准REC1738。
**
public class Server {// 先了解一下什么叫做--协议// IP// TCP UDP ARP// TCP三次握手 四次挥手// UDP不安全为什么 如何避免(人为握手 消息队列)// HTTP协议 JavaWEB HTTP是高层协议 底层是TCP实现的// Socket(套接字)// 将两种(TCP UDP)不同的协议都封装好啦 提供现成的类// 网络传输 网络编程// TCP// 服务端ServerSocket、客户端Socket// I/O方式发送// B浏览器(客户端)/S服务端// UDP// 发送端DatagramSocket、接收端DatagramSocket// 数据包方式DatagramPacketpublic static void main(String[] args) {try {System.out.println("开启服务");//1.创建一个服务端// 开放一个端口 选择数字大一点的 0-65535ServerSocket server = new ServerSocket(9999);//2.等待客户端的连接/访问//方法本身有一个阻塞的效果Socket socket = server.accept();System.out.println("有一个客户端连接成功");Scanner input = new Scanner(System.in);System.out.println("请跟客户端说点什么吧");String message = input.nextLine();//服务端被访问到--数据的通信//服务器 --> 字符形式的//需要一个输出流 --> 不能自己new 通过socket获取OutputStream os = socket.getOutputStream();//os是字节流 发送中文不是很方便 字节流包装成字符流PrintWriter pw = new PrintWriter(os);//多态 java.net.SocketOutputStream//可以说话了pw.println(message);pw.flush();//刷新 清空流管道//服务端读取客户端回写的消息InputStream is = socket.getInputStream();InputStreamReader isr = new InputStreamReader(is);BufferedReader br = new BufferedReader(isr);String value = br.readLine();System.out.println(value);} catch (IOException e) {e.printStackTrace();}}}
public class Tomcat {public static void main(String[] args) {try {//1.创建一个服务端System.out.println("开启Tomcat服务");ServerSocket server = new ServerSocket(9999);//2.等待客户端的连接/访问Socket socket = server.accept();System.out.println("有一个客户端连接成功");//浏览器输入URL---统一资源定位器---不是所谓的HTTP协议// URL---> ip:port/项目名/包名/资源名?参数key=参数value&参数key=参数value// 浏览器底层 解析URL// ip port 创建Socket连接// 输出流 将后面部分发送出去 项目名/包名/资源名?参数key=参数value&参数key=参数value// 而且在发送出去的时候 除了上述信息 还需要遵循HTTP协议规范//3.浏览器发送过来的数据是什么// 读取刚刚浏览器发送过来的那一次请求 到底涵盖了哪些BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));String value = reader.readLine();while(null!=value && !"".equals(value)){System.out.println(value);value = reader.readLine();}/*GET /index.html?name=zzt HTTP/1.1Host: localhost:8888Connection: keep-aliveUpgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,* /*;q=0.8,application/signed-exchange;v=b3;q=0.9Sec-Fetch-Site: noneSec-Fetch-Mode: navigateSec-Fetch-User: ?1Sec-Fetch-Dest: documentAccept-Encoding: gzip, deflate, brAccept-Language: zh-CN,zh;q=0.9*///服务端想要给浏览器写一些东西//浏览器只认识一种格式 HTML 超文本标签语言 字符串---有规则 <><>PrintWriter out = new PrintWriter(socket.getOutputStream());//给浏览器写东西 需要遵循HTTP协议 同时还要遵循HTML的标签语言规则out.write("HTTP/1.1 200 OK\r\n");out.write("Content-Type:text/html;charset=utf-8\r\n");out.write("\r\n");//分割out.write("<html>");out.write(" <body>");out.write(" <font color='red'>响应信息</font><br>");out.write(" </body>");out.write("</html>");out.flush();// Tomcat Servlet Request Response Session// Servlet-->JSP// Servlet-->Filter 机制 责任链设计模式 动态代理 AOP思想} catch (IOException e) {e.printStackTrace();}}}
public class Client {public static void main(String[] args) {try {System.out.println("我是客户端");//客户端//1.主动产生一个连接-----连接服务器// 想要访问服务器 知道两个服务器的条件// 服务器所在的地址IP(127.0.0.1 localhost) 服务器开放的那个端口号9999Socket socket = new Socket("localhost",9999);//客户端连接服务器 为了数据通信//读取服务器发来的消息//2.获取一个输入流InputStream is = socket.getInputStream();//3.对面发送过来是中文 字符流更方便 字节流--字符流InputStreamReader isr = new InputStreamReader(is);//4.因为对面发送过来的是以println方法发送的一行数据 再次包装BufferedReaderBufferedReader reader = new BufferedReader(isr);//5.读取数据String value = reader.readLine();System.out.println(value);//客户端接收到数据Scanner input = new Scanner(System.in);System.out.println("请跟服务端回写点什么吧");String message = input.nextLine();//客户端回写消息OutputStream os = socket.getOutputStream();PrintWriter writer = new PrintWriter(os);writer.println(message);writer.flush();} catch (IOException e) {e.printStackTrace();}}}
总结:
公开课用到了 Socket、IO、线程、String、解析、文件、反射、HTML 等相关知识点,对socket的认识与应用也更深入,但是对于一些方法的使用以及用途并不是很清楚,还需要多学多练吧……
hhh从开始学Java到现在已经4个多月了,时间好快哎,我希望在接下来的日子也可以一直坚持下去,为了未来啊!
