java学习笔记:网络编程

一、网络通信协议

1、概述

计算机之间想要互通信息就必须使用网络,网络连接的规则就被成为网络通信协议,它对数据的传输格式、传输速率、传输步骤等做了统一规定,不同的计算机之间需要共同遵守才能进行通信。

七层模型,也称为 OSI(Open System Interconnection)参考模型,是国际标准化组织(ISO)制定的一个用于计算机或通讯系统间互联的标准体系。它是一个七层的、抽象的模型体,不仅包括一系列抽象的术语或概念,也包括具体的协议。TCP/IP 则借鉴了 OSI 的这些概念建立 TCP/IP 模型,在网络通讯协议中使用最为广泛的也是 TCP/IP 协议(包括 TCP 协议和 IP 协议),UDP 协议和其他一些协议的协议组。如图:

 

TCP/IP四层模型的每层分别负责不同的通讯功能:

  • 应用层:主要负责应用程序的协议,如 HTTP 协议、FTP 协议

  • 传输层:要使用网络程序进行端到端的通讯,主要使用 TCP 和 UDP

  • 网络层:是整个 TCP/IP 协议的核心,主要用于将传输的数据进行分组并发到目标计算机

  • 网络接口层:物理传输通道,主要是一些网络连接设备的驱动协议

2、IP地址和端口号

IP地址:网络中每台计算机的一个标识号

本机IP地址:127.0.0.1 或 localhost
​
目前,IP地址普遍都是IPv4版本的,它是由32位二进制数来表示的,但在实际中都是以十进制数来表示的。如:127.0.0.1
​
但由于计算机网络规模的不断扩大,对IP地址的需求也不断增加,IPv4的IP地址已经不够用了,因此,IPv6就诞生了。IPv4用4个字节表示IP地址,而IPv6用16个字节表示IP地址,它的容量为2的128次幂-1个。

端口号:计算机中应用程序的标识号

一台服务器有256*256个端口号
​
0-1023是公认端口号,即已经公认定义或为将要公认定义的软件保留的
​
1024-65535是并没有公共定义的端口号,用户可以自己定义这些端口的作用

二、网络通信的实现

1、TCP协议

TCP是一个面向连接的,可靠的,基于字节流的传输层协议,主要通过 ServerSocket 类和 Socket 类

三次握手

  • 第一次握手:客户端向服务器发出连接请求,等待服务器确认

  • 第二次握手:服务器向客户端发送一个相应,通知客户端收到了请求连接

  • 第三次握手:客户端再次向服务器发送确认信息,确认连接

四次挥手

  • 第一次挥手:服务端确认客户端需要断开连接

  • 第二次挥手:客户端确认服务端接收断开请求

  • 第三次挥手:客户端确认服务端数据发完

  • 第四次挥手:服务端确认客户端断开连接

ServerSocket 类

  • ServerSocket(int port):构造方法,创建 ServerSocket 对象,将其绑定到一个指定的端口号上

  • Socket accept():侦听并接受到此套接字的连接

Socket 类

  • Socket(String host,int port):构造方法,创建 Socket 对象,会根据参数去连接在指定地址和端口上运行的服务器程序

  • int getPort():返回一个 int 类型对象,该对象是 Socket 对象与服务器连接的端口号

  • InetAddress getLoclAddress():获取 Socket 对象绑定的本地 IP 地址,并将 IP 地址封装成 InetAddress 类型的对象返回

  • void close():关闭 Socket 连接,结束本次通信。在关闭 Socket 之前,应将与socket相关的所有输入/输出流全部关闭

  • InputStream getInputStream():返回一个 InputStream 类型的输入流对象,如果该对象是由服务器的 Socket 返回,就用于读取客户端发送的数据,反之,用于读取服务器端的数据

  • OutputStream getOutputStream():返回一个 OutputStream 类型的输出流对象,如果该对象是由服务器的 Socket 返回,就用于向客户端发送数据,反之,用于向服务器端发送数据

服务端实现:

  1. 创建 ServerSocket 对象

  2. 等待客户端连接,当客户端连接后,获取客户端Socket对象

  3. 给客户端反馈信息

  4. 与客户端收发数据......

  5. 关闭资源

public static void main(String[] args) throws IOException {
    ServerSocket serverSocket = new ServerSocket(6666);
    Socket client = serverSocket.accept();
​
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
    bw.write("你已经连接上服务器了");
    bw.newLine();
    bw.flush();
​
    bw.close();
    client.close();
}

客户端实现:

  1. 创建 Socket 对象

  2. 获取服务端的反馈信息

  3. 与服务端收发数据......

  4. 关闭资源

public static void main(String[] args) throws IOException {
    Socket socket = new Socket("localhost",6666);
​
    BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    System.out.println(br.readLine());
​
    br.close();
    socket.close();
}

2、UDP协议

UDP是一个面向无连接,不可靠的传输层协议,主要通过DatagramPacket 类和 DatagramSocket 类来实现。

DatagramPacket 类

  • DatagramPacket (byte[] buf,int length):接收端构造方法,接收一个字节数组来存放接收到的数据

  • DatagramPacket (byte[] buf,int length,InetAddress address,int port):发送端构造方法,接收存放发送数据的字节数组和指定发送端 IP 地址和端口号

  • InetAddress getAddress():返回某台计算机的 IP 地址

  • int getPort():返回某台远程主机的端口号

  • byte[] getData():返回数据缓冲区

  • int getLength():返回将要发送或接收到的数据长度

DatagramSocket 类

  • DatagramSocket():没有指定端口号,系统会分配一个没有被其它网络程序所使用的端口号

  • DatagramSocket(int port):指定一个端口号创建对象,可以监听指定的端口

  • void receive(DatagramSocket p):从此套接字接收数据包

  • void send(DatagramSocket p):从此套接字发送数据包

发送端实现:

  1. 创建 DatagramPacket 对象,并封装数据

  2. 创建 DatagramSocket 对象

  3. 调用 DatagramSocket 对象方法 send() 发送数据

  4. 释放资源

public static void main(String[] args) throws IOException {
    byte[] data = "我是发送端".getBytes();
    DatagramPacket dp = new DatagramPacket(data, data.length, InetAddress.getByName("127.0.0.1"),6666);
    DatagramSocket ds = new DatagramSocket();
    ds.send(dp);
    ds.close();
}

接收端实现:

  1. 创建 DatagramSocket 对象,绑定端口号(要和发送端一致)

  2. 创建字节数组,接收发来的数据

  3. 创建数据包 DatagramPacket 对象

  4. 调用 DatagramSocket 对象方法 receive(DatagramPacket DP) 接收数据

  5. 对接收到的数据 DP 进行拆包

  6. 释放资源

public static void main(String[] args) throws IOException {
    DatagramSocket ds = new DatagramSocket(6666);
    byte[] bytes = new byte[1024];
    DatagramPacket dp = new DatagramPacket(bytes,1024);
    ds.receive(dp);
​
    Inet4Address ipAddress = (Inet4Address) dp.getAddress();
    byte[] data = dp.getData();
    int length = dp.getLength();
    String str = new String(data,0,length);
    System.out.println(ipAddress + ":" + str);
​
    ds.close();
}

三、TCP 和 UDP 的区别

  1. TCP面向连接,UDP面向无连接

  2. TCP提供可靠的服务,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达。UDP是不可靠服务,只保证数据有交付

  3. TCP只能点对点,UDP支持一对一,一对多,多对一和多对多的交互通信

  4. TCP面向字节流,传输速率容易受影响;UDP面向报文,网络出现拥塞不会使源主机的发送速率降低(如实时对战游戏基本采用UDP协议)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值