网络通信(network communications)

概述

网络编程:可以让设备中的程序与网络上其他设备中的程序进行数据交互(实现网络通信的)

基本的通信架构

●基本的通信架构有2种形式:CS架构( Client客户端/Server服务端)、BS架构(Browser浏览器/Server服务端)

网络通信(network communications)_第1张图片

网络通信(network communications)_第2张图片

        网络通信三要素:IP地址(设备在网络中的地址,是唯一的标识)、端口号(应用程序在设备中唯一的标识)、协议(连接和数据在网络中传输的规则)

IP地址

概述

        IP (Internet Protocol):全称”互联网协议地址”,是分配给上网设备的唯一 标志。

        IP地址有两种形式:IPV4、 IPv6

        IPv4:32bit(4字节),点分十进制表示法(xxx.xxx.xxx)

        IPv6:共128位,分成8段表示,每段每四位编码成一个十六进制位表示, 数之间用冒号(: )分开。

        公网IP:是可以连接互联网的IP地址;内网|P:也叫局域网IP,只能组织机构内部使用。

        192.168.开头的就是常见的局域网地址,范围即为192.1 68.0.0--192.1 68.255.255,专门为组织机构内部使用。

        特殊IP地址:127.0.0.1、localhost 代表本机IP,只会寻找当前所在的主机。

        IP常用命令:ipconfig(查看本机IP地址),ping IP地址(检查网络是否连通)

InetAddress

在Java中InetAddress代表IP地址。

InetAddress的常用方法 说明
public static InetAddress getLocalHost() 获取本机IP,会以一个inetAddress的对象返回
public static InetAddress getByName (String host) 根据ip地址或者域名,返回一-个inetAdress对象
public String getHostName() 获取该ip地址对象对应的主机名。
public String getHostAddress() 获取该ip地址对象中的ip地址信息。
public boolean isReachable(int timeout ) 在指定毫秒内,判断主机与该ip对应的主机是否能连通

端口号

        标记正在计算机设备上运行的应用程序的,被规定为一个16位的二进制,范围是0~65535。

        分类:周知端口、周知端口、周知端口。

  • 周知端口:0~1023,被预先定义的知名应用占用(如:HTTP占用80,FTP占用21)
  • 注册端口:1024~49151,分配给用户进程或某些应用程序。
  • 动态端口:49152到65535,之所以称为动态端口,是因为它一般不固定分配某种进程,而是动态分配。

        注意:我们自己开发的程序一般选择使用注册端口,且一个设备中不能出现两个程序的端口号一样,否则出错。

协议

概述

        网络上通信的设备,事先规定的连接规则,以及传输数据的规则被称为网络通信协议。

        OSI网络参考模型:全球网络互联标准。

        TCP/IP网络模型:事实上的国际标准。

OSI网络参考模型 TCP/IP网络模型 各层对应 面向操作
应用层 应用层 HTTP、FTP、SMTP... 应用程序需要关注的:浏览器,邮箱。程序员一般在这一层开发
表示层
会话层
传输层 传输层 UDP、TCP...  选择使用的TCP , UDP协议
网络层 网络层 IP... 封装源和目标IP
数据链路层 数据链路层+物理 比特流... 物理设备中传输
物理层

 UDP

快速入门

UDP(User Datagram Protocol)用户数据报协议

        特点:无连接、不可靠通信。通信效率高!

        不事先建立连接,数据按照包发,一包数据包含:自己的IP、程序端口,目的地IP、程序端口和数据(限制在64KB内)等。

        发送方不管对方是否在线,数据在中间丢失也不管,如果接收方收到数据也不返回确认,故是不可靠的。

        Java提供了一个java.net.DatagramSocket类来实现UDP通信。

DatagramSocket

        DatagramSocket用于创建客户端、服务端

构造器 说明
public DatagramSocket() 创建客户端的Socket对象,系统会随机分配一个端口号。
public DatagramSocket(int port) 创建服务端的Socket对象,并指定端口号
方法 说明
public void send(DatagramPacket dp) 发送数据包
public void receive(DatagramPacket p) 使用数据包接收数据

         用完后要释放资源

DatagramPacket

         DatagramPacket:创建数据包

构造器 说明
public DatagramPacket(byte[ ] buf, int length, InetAddress address, int port) 创建发出去的数据包对象。
public DatagramPacket(byte[ ] buf, int length) 创建用来接收数据的数据包

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

  • 参数一(byte[ ] buf):封装要发出去的数据。
  • 参数二(nt length):发送出去的数据大小(字节个数)。
  • 参数三(InetAddress address):服务端的IP地址(找到服务端主机)。
  • 参数四( int port):服务端程序的端口。
方法 说明
public int getLength( ) 获取数据包,实际接收到的字节个数

实现步骤

客户端
  1. 创建DatagramSocket对象(客户端对象)
  2. 创建DatagramPacket对象封装需要发送的数据( 数据包对象)
  3. 使用DatagramSocket对象的send方法,传入DatagramPacket对象
  4. 释放资源
  • 反复发送数据:使用while死循环不断的接收用户的数据输入,如果用户输入的exit则退出程序
服务端
  1. 创建DatagramSocket对象并指定端口(服务端对象)
  2. 创建DatagramPacket对象接收数据 (数据包对象)
  3. 使用DatagramSocket对象的receive方法,传入DatagramPacket对象
  4. 释放资源
  • 反复接收数据:使用while死循环不断的进行第3步

TCP

快速入门

TCP(Transmission Control Protocol)传输控制协议

        特点:面向连接、可靠通信。通信效率相对不高!

        TCP的最终目的:要保证在不可靠的信道上实现可靠的传输。

        TCP主要有三个步骤实现可靠传输:三次握手建立连接,传输数据进行确认,四次挥手断开连接。

  • 可靠连接:确定通信双方,收发消息都是正常无问题的(全双工模式)
  • 三次握手:客户端先发出连接请求,服务器端返回一个响应,然后客户端再次发出确认信息,连接建立。
  • 传输数据会进行确认,以保证数据传输的可靠性。
  • 四次握手:客户端先发出断开连接请求,服务器端返回一个响应:稍等,服务器将最后的数据处理完毕后返回一个响应:确认断开,最后客户端发出正式确认断开连接。

Java提供了一个java.net.Socket类来实现TCP通信 。

客户端开发

        客户端程序就是通过java.net包下的Socket类来实现的。

构造器 说明
public Socket(String host,int port) 根据指 定的服务器ip、端口号请求与服务端建立连接,连接通过,就获得了客户端socket
方法 说明
public OutputStream getOutputStream() 获得字节输出流对象
public InputStream getInputStream() 获得字节输入流对象

        客户端实现步骤

  1. 创建客户端的Socket对象,请求与服务端的连接。
  2. 使用socket对象调用getOutputStream()方法得到字节输出流。
  3. 使用字节输出流完成数据的发送。
  4. 释放资源:关闭socket管道。
服务端程序的开发 

●服务端是通过java.net包下的ServerSocket类来实现的。

ServerSocket

构造器 说明
public ServerSocket(int port) 为服务端程序注册端口
方法 说明
public Socket accept() 阻塞等待客户端的连接请求,一旦与某个客户端成功连接,则返回服务端这边的Socket对象。

        服务端实现步骤

  1. 创建ServerSocket对象, 注册服务端端口。
  2. 调用ServerSocket对象的accept()方法,等待客户端的连接,并得到Socket管道对象。
  3. 通过Socket对象调用getInputStream()方法得到字节输入流、完成数据的接收。
  4. 释放资源:关闭socket管道

多发多收

  1. 客户端使用死循环,让用户不断输入消息。
  2. 服务端也使用死循环,控制服务端收完消息,继续等待接收下一个消息。

多用户同时通信

        服务端可以使用多线程,让主线程接收客户端的连接请求,每与一个客户端建立连接都创建一个子线程与之连接。

网络通信(network communications)_第3张图片

你可能感兴趣的:(JavaNotes,java)