javaSE 第二十天

Day20

----------------------------------------------------------------------------------

今天内容:

   (1)网络编程的常识

   (2)基于tcp协议的编程模型

   (3)tcp协议和udp协议的比较

   (4)基于udp协议的编程模型

1.网络编程的常识(熟悉)

   目前主流的网络通讯软件有:QQ、陌陌、微信、钉钉、飞信、阿里旺旺、...

   在吗?

1.1 七层网络模型

   ISO将数据的传递从逻辑上划分为了以下七层,来保证数据传递的可靠性和安全性等,具体如下:

   应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。

   当发送数据之前需要按照上述七层模型一层层进行加包处理,然后再发送出去;

   当接收到数据后需要按照上述七层模型相反的次序一层层拆包处理,然后再解析出来;

1.2 常见的网络协议

   http - 超文本传输协议,主要用于浏览网页时使用。

   ftp  - 文件传输协议,主要用于上传和下载文件时使用。

   tcp  - 传输控制协议,主要用于进行网络通信时使用,如:呵呵。

   udp  - 用户数据报协议,主要用于网络通信时使用。

   ip   - 互联网协议,是上述协议的底层协议。

   协议 - 本质上就是双方的通信规则,约定了双方的通信方式。

1.3 IP地址(重点)

如: 

   192.168.1.1 - 绝大多数路由器的登录地址。

   

   IP地址是互联网中的唯一地址标识,通过IP地址可以定位到具体某一台设备。

   IP地址上本质上就是由32位二进制组成的整数,叫做IPv4,当然也有128位二进制组成的整数,叫做IPv6,目前主流的配置还是IPv4.

   日常生活中采用点分十进制表示法进行IP地址的描述,也就是将每个字节的二进制转换为一个十进制整数,不同的整数之间采用小数点分隔。

如:

   0x01020304 => 1.2.3.4 

      

查看IP地址的方式:

    windows系统 - 在dos窗口中使用命令ipconfig 或 ipconfig/all即可

    linux系统   - 在终端窗口中使用命令ifconfig 或 /sbin/ifconfig即可

1.4 端口号(重点)

   IP地址 - 可以定位到具体某台设备。

   端口号 - 可以定位到具体某个进程。

   网络编程需要提供:IP地址 + 端口号。

   端口号本质上就是由16位二进制组成的整数,范围是:0 ~ 65535,其中0 ~ 1024之间的端口号通常被系统占用,因此编程从1025开始使用。

2.基于tcp协议的编程模型(重中之重

2.1 编程模型

服务器:

   (1)创建ServerSocket类型的对象并提供端口号;

   (2)等待客户端的连接请求,调用accept()方法;

   (3)使用输入输出流进行通信;

   (4)关闭Socket并释放有关的资源;

客户端:      

   (1)创建Socket类型的对象,并提供服务器的IP地址和端口号;

   (2)使用输入输出流进行通信;

   (3)关闭Socket并释放有关的资源;

2.2 相关类和方法的解析

(1)ServerSocket类

   java.net.ServerSocket类用于描述服务器的套接字(大插排)。

   ServerSocket(int port) - 根据参数指定的端口号构造对象。

   Socket accept() - 侦听并接收到此套接字的连接请求。

   void close() - 关闭套接字。

(2)Socket类

   java.net.Socket类用于描述客户端套接字,是两台设备间通信的端点(小插排)。

   Socket(String host, int port) - 根据参数指定的主机名和端口号构造对象。

   InputStream getInputStream() - 用于获取当前套接字的输入流。

   OutputStream getOutputStream() - 用于获取当前套接字的输出流。

   void close() - 关闭套接字。

练习:

   a.要求服务器接收到客户端发送的"hello"后向客户端回发消息"I received!";

   b.要求客户端发送的内容由用户从键盘输入;

   c.要求服务器和客户端可以不断地通信,直到客户端发送"bye"聊天结束;

   d.要求服务器可以不断地响应客户端的连接请求,采用多线程技术。

3.tcp协议和udp协议的比较(笔试题)

3.1 tcp协议

    - 传输控制协议,是一种面向连接的协议,类似于打电话。

    - 建立连接 => 进行通信 => 断开连接

    - 在通信的整个过程中全程保持连接

    - 保证了数据传输的可靠性和有序性

    - 是一种全双工的字节流通信方式

    - 服务器压力比较大,资源消耗比较多,相对来说发送数据的效率比较低

3.2 udp协议

    - 用户数据报协议,是一种非面向连接的协议,类似于写信。

    - 在通信的整个过程中不保持连接

    - 不保证数据传输的可靠性和有序性

    - 是一种全双工的数据报通信方式

    - 服务器压力比较小,资源消耗比较少,相对来说发送数据的效率比较高

4.基于udp协议的编程模型(重点)

4.1 编程模型

接收方:

   (1)创建DatagramSocket类型的对象并提供端口号;

   (2)创建DatagramPacket类型的对象用于接收数据内容;

   (3)接收数据内容,调用receive()方法;

   (4)关闭Socket并释放有关的资源;

发送方:  

   (1)创建DatagramSocket类型的对象;

   (2)创建DatagramPacket类型的对象并提供接收方的IP地址和端口号;

   (3)发送数据内容,调用send()方法;

   (4)关闭Socket并释放有关的资源;

4.2 相关类和方法的解析

(1)DatagramSocket类

   java.net.DatagramSocket类用于描述发送或接受数据报的套接字(邮局点);

   DatagramSocket() - 无参的方式构造对象。

   DatagramSocket(int port) - 根据参数指定的端口号来构造对象。

   void receive(DatagramPacket p) - 用于接收数据并存放到参数指定的变量中。

   void send(DatagramPacket p) - 用于将参数指定的数据发送出去。

   void close()

(2)DatagramPacket类

   java.net.DatagramPacket类用于描述数据报信息(信件);

   DatagramPacket(byte[] buf, int length) - 用于接收数据包并记录到参数变量中; 

   DatagramPacket(byte[] buf, int length, InetAddress address, int port) 

       - 用于将参数指定的数据发送到参数指定的位置

   InetAddress getAddress() - 用于获取发送方或接收方的通信地址信息。

   int getPort() - 用于获取发送方或接收方的端口信息。

   int getLength() - 用于获取发送或接收数据的长度。

(3)InetAddress类

   java.net.InetAddress类用于描述互联网协议地址。

   static InetAddress getLocalHost() - 用于获取本地主机的通信地址信息。

   static InetAddress getByName(String host) - 根据参数指定的主机名来获取通信地址。

   String getHostName() - 用于获取通信地址中的主机名信息。

   String getHostAddress() - 用于获取通信地址中的IP地址信息。

作业:

   1.重点掌握基于tcp协议的编程模型;

   2.记录基于udp协议的相关内容;

 

猜你喜欢

转载自blog.csdn.net/zgzdcxy/article/details/82804494