Java网络编程OV

一、入门

1.1 软件结构

  • C/S结构: Client/Server,客户端访问数据库服务器
  • B/S结构: Browser/Server,浏览器访问数据库服务器
  • 两种架构都离不开网络的支持

1.2 网络通信协议

  • TCP/IP协议:传输控制协议/因特网互联协议,是Internet最基本、最广泛的协议,它定义了计算机如何连入因特网,以及数据如何在他们之间进行传输的标准。
    | 分层模型 | 相应的协议 |
    |————-:|————:|
    |应用层| HTTP、FTP、SMTP、SNMP、DNS|
    |传输层|TCP、UDP|
    |网络层|ICMP、IGMP、IP、ARP、RARP|
    |数据链路层||
    |物理层||

1.3 主要协议分类

  • UDP:用户数据报协议(User Datagram Protocol),UDP是无连接的通信协议,不考虑数据是否发送成功,即为不可靠连接,典型的例子有发短信(发送端发送数据,不会确认接收端是否存在,并且接收端也不会反馈到发送端是否接收到数据)

    • 但UDP的优点也很明显,消耗资源少,通讯效率高,所以对于音频、视频的传输时,偶尔出现丢包的现象也不会对最终的数据结果产生太大的影响
    • 在传输重要数据的时候,不建议使用UDP协议
    • 数据被限定在64KB以内
  • TCP:传输控制协议(Transmission Control Protocol),TCP是面向连接的通信协议,在通信之前,发送端和接收端必须建立逻辑连接,即确保发送端和接收端存在,再进行数据的传输,由客户端(发送端)对服务器(接收端)发送连接请求,即三次握手!

    • 三次握手:TCP协议中,发送数据的准备阶段,由客户端和服务端进行三次交互,确保连接的可靠
      • 第一次握手:客户端向服务端发送连接请求,等待客户端收到连接请求
      • 第二次握手:服务端向客户端应答,通知客户端已收到连接请求
      • 第三次握手:客户端再次向服务端发送确认信息,确认连接
        三次握手

1.4网络编程三要素

协议

  • 计算机网络通信的规则

    IP地址

  • 互联网协议地址
  • IP地址分类
    • IPv4 :一个32位的二进制数,被分成四个字节,都是0-255之间的整数,最多有42亿个,现在已经枯竭
    • IPv6:一个128位的地址,每16个字节为一组,分成8组的十六进制数
  • 常用命令
    • 查看本机ip地址
      ipconfig
      
    • 检查网络是否连通
      ping 空格 ip地址
      ping 192.168.1.2
      

      端口号

  • 端口号是一个逻辑端口,我们无法直接看到,只能借助一些软件进行查看,当我们使用网络软件时,操作系统会自动为网络软件分配一个随机的端口号或者由系统指定端口号
  • 端口号的长度
    • 是由2个字节组成,取值范围在0-65535之间
  • 注意: - 1024之前的端口不能使用,因为已经被系统分配给一些已知的网络软件 - 网络软件的端口号不能重复
  • 常见的端口号
    1. 80端口: 网络端口, www.baidu.com:80
    2. 数据库 MySQL :3306 Oracle:1521
    3. Tomcat服务器 :8080

      二、TCP通信程序

      2.1 概述

    • TCP通信时两台计算机实现数据交互,必须区分客户端和服务端
    • 通信的步骤:
  1. 服务端程序要提前启动,等待客户端的连接(就像你玩LOL一样,必须下载客户端应用程序,才能对LOL服务端(区服)进行访问)
  2. 客户端主动连接服务端,连接成功才能进行通信,但服务端不能主动连接客户端,只能被动连接
    • Java中用于实现TCP通信的两个类
  • 客户端java java.net.Socket类表示,创建Socket对象,向服务端发送连接请求,服务端响应请求,两端建立连接开始通信
  • 服务端java.net.ServerSocket类表示,创建ServerSocket对象,相当于开启了一个服务,并等待客户端连接
  • 服务端必须明确的两件事
    1. 多个客户端和服务器进行交互,服务器必须明确和哪个客户端进行交互——在服务端有一个accept方法获取请求客户端对象
    2. 多个客户端和服务端进行交互,就需要多个IO流对象
      1. 服务端没有IO流,服务器可以请求客户端对象Socket
      2. 使用每个客户端Socket中提供的IO流和客户端进行交互</font>
      3. 服务器使用客户端的字节输入流读取客户端发送的数据
      4. 服务器使用客户端的字节输出流给客户端回写数据</font>
        • 即服务器端使用客户端的流与客户端进行交互
          服务端与客户端通信

2.2 Socket 类

  • Socket类:该类实现客户端套接字,套接字指的是两台设备之间通信的端点

    TCP客户端

    构造方法
    • public Socket(String host ,int port) :创建套接字对象并将其连接到指定主机上的指定端口号,如果指定的host是null,则相当于指定地址为回环地址127.x.x.x
    • 参数:
      • 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)
  • 注意

    • 客户端和服务端进行交互,必须使用Socket中提供的网络流,不能使用自己创建的流对象
    • 当我们创建客户端对象Socket时,就会去请求服务器和客户端3次握手建立连接通信
      • 服务端没有启动,则抛出异常
      • 服务端已经启动,可以进行交互
  • 代码:

    public class TCPClient{
        public static void main(String[] args) throws IOException{
            Socket socket = new Socket("127.0.0.1",8888);//ip地址和端口号
    
            OutputStream os = socket.getOutputStream();
    
            os.write("你好服务器".getBytes());
    
            InputStream is = socket.getInputStream();
    
            byte[] bytes = new byte[1024];
            int len = is.read(bytes);
            System.out.println(new String(bytes,0,len));
    
            socket.close();
        }
    }
    

    TCP服务端

    表示服务端的类
    • java.net.SreverSocket 此类实现服务器套接字
      构造方法
    • ServerSocket(int port) 创建绑定特定端口的服务器套接字
    • 服务器端必须知道是哪个客户端请求的服务器,使用accept方法获取请求的客户端对象Socket
      服务器实现步骤
    1. 创建一个服务端对象ServerSocket对象和系统指定的端口号
    2. 使用ServerSocket对象中的方法accept,获取到请求的客户端对象Socket
    3. 使用Socket对象中的方法getInputStream()获取网络字节输入流InputStream对象
    4. 使用网络字节输入流InputStream对象中的方法read,读取客户端发送的数据
    5. 使用Socket对象中的方法getOutputStream()获取网络字节输出流OutputStream对象
    6. 使用网络字节输出流OutputStream对象中的方法write,给客户端回写数据
    7. 释放资源(Socket,ServerSocket)
  • 代码:

    public class TCPServer{
        Public static void main(String[] args) throws IOException{
            ServerSocket server = new ServerSocket(8888);
    
            Socket socket = server.accept();
    
            InputStream is = socket.getInputStream();
    
            byte[] bytes = new byte[1024];
            int len = is.read(bytes);
            System.out.println(new String(bytes,0,len));
    
            OutputStream os = socket.getOutputStream();
    
            os.write("收到谢谢".getbytes());
            socket.close();
            server.close();
        }
    }