Java网络编程

Java网络编程

网络基础

  • 软件结构:
    • C/S;Client/Server
    • B/S;Browser/Server

网络协议

  • TCP/IP协议;传输控制协议/因特网互联协议( Transmission Control Protocol/Internet Protocol)
    • 应用层
    • 传输层
    • 网络层
    • 数据链路层
    • 物理层
  • TCP;传输控制协议 (Transmission Control Protocol)。TCP协议是面向连接的通信协议,即传输数据之前,在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输。
    • 三次握手:TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可靠
      • 第一次:客户端—>服务器(发请求)
      • 第二次:客户端<—服务器(返回响应)
      • 第三次:客户端—>服务器(曲儿响应)
  • UDP;用户数据报协议(User Datagram Protocol)。UDP协议是一个面向无连接的协议。传输数据时,不需要建立连接,不管对方端服务是否启动,直接将数据、数据源和目的地都封装在数据包中,直接发送。每个数据包的大小限制在64k以内。它是不可靠协议,因为无连接,所以传输速度快,但是容易丢失数据。

    IP地址

  • IP地址:指互联网协议地址(Internet Protocol Address),俗称IP。IP地址用来给一个网络中的计算机设备做唯一的编号。
  • IP分类:
    • IPv4;是一个32位的二进制数,通常被分为4个字节,表示成 a.b.c.d的形式,例如192.168.65.100 。其中a、b、c、d都是0~255之间的十进制整数,那么最多可以表示42亿个是一个32位的二进制数,通常被分为4个字节,表示成a.b.c.d的形式,例如 192.168.65.100 。其中a、b、c、d都是0~255之间的十进制整数,那么最多可以表示42亿个
    • IPv6;采用128位地址长度,每16个字节一组,分成8组十六进制数,表示成 ABCD:EF01:2345:6789:ABCD:EF01:2345:6789
  • 本机IP地址:127.0.0.1localhost

    端口号

  • 用两个字节表示的整数,它的取值范围是0~65535。其中,0~1023之间的端口号用于一些知名的网络服务和应用,普通的应用程序需要使用1024以上的端口号。如果端口号被另外一个服务或应用所占用,会导致当前程序启动失败。
  • 常用端口号;
    • 80;网络端口
    • 3306;MySQL
    • 1521;Oracle
    • 8080:Tomcat

TCP通信

  • 客户端和服务器端进行一个数据交互,需要4个IO流对象
  • 服务器端必须明确;
    1. 多个客户端同时和服务器进行交互,服务器必须明确和哪个客户端进行的交互。在服务器端有个方法叫accept客户端获取到请求的客户端对象
    2. 多个客户端同时和服务器端进行交互,就需要使用多个IO流对象
      • 服务器是没有IO流的,服务器可以获取到请求的客户端对象Socket。使用每个客户端Socket中提供的IO流和客户端进行交互(服务器使用客户端的流和客户端交互)
  • TCP通信的客户端;向服务器发送连接请求,给服务i去发送数据,读取服务器回写的数据

    Socket类

  • 表示客户端的类;java.net.Socket;此类实现客户端套接字,套接字是两台机器之间通信的端点。套接字包含了IP地址和端口号的网络单位
  • 构造方法:
    • Socket(String host,int port);创建一个流套接字并将其连接到指定主机上的指定端口号。
      • String host;服务器主机的名称/服务器的IP地址
      • int port;服务器的端口号
  • 成员方法;
    • OutputStream getOutputStream();返回此套接字的输出流
    • InputStream getInputStream();返回此套接字的输入流
    • void close();关闭此套接字
  • 实现步骤;
    1. 创建一个客户端对象Socket,构造方法绑定服务器的IP地址和端口号
    2. 使用Socket对象中的方法getOutputStream()获取网络字节输出流OutputStream对象
    3. 使用网络字节输出流OutputStream对象中的方法write,给服务器发送数据
    4. 使用Socket对象中的方法getInputStream()获取网络字节输入流InputStream对象
    5. 使用网络字节输入流InputStream对象中的方法read,读取服务器回写的数据
    6. 释放资源(Socket)
  • 注意;
    1. 客户端和服务器端进行交互,必须使用Socket中提供网络流,不能使用自己创建的流对象
    2. 当我们创建客户端对象Socket时,就会去请求服务器和服务器经过3次握手建立连接通路。如果服务器没有启动,则抛出异常,如果服务器启动,则进行交互

ServerSocket类

  • 表示服务器的类;java.net.ServerSocket;此类实现服务器套接字
  • 构造方法;
    • ServerSocket(int port);创建绑定到特定端口的服务器套接字
  • 服务器端必须明确是哪个客户端请求的服务器,所以可以使用accpet方法获取到请求的客户端对象Socket
  • 成员方法;
    • Socket accept();侦听并接收到此套接字的连接
  • 实现步骤;
    1. 创建服务器ServerSocket对象和系统要指定的端口号
    2. 使用ServerSocket对象中的方法accpept获取到请求的客户端对象Socket
    3. 使用Socket对象中的方法getInputStream()获取网络字节输入流InputStream对象
    4. 使用网络字节输入流InputStream对象中的方法read,读取服务器回写的数据
    5. 使用Socket对象中的方法getOutputStream()获取网络字节输出流OutputStream对象
    6. 使用网络字节输出流OutputStream对象中的方法write,给客户端回写数据
    7. 释放资源(Socket、ServerSocket)

注意

  • 上传完文件,给服务器写一个结束标记
    • void shutdownOutput();禁用次套接字的输出流。对于TCP套接字,任何以前写入的数据都将发送,并且后跟TCP的正常连接终止序列
Knowledge is priceless, thanks for your support !