Skip to content

Latest commit

 

History

History
224 lines (152 loc) · 7.58 KB

File metadata and controls

224 lines (152 loc) · 7.58 KB

网络编程

网络编程入门

软件结构

  • C/S结构:客户端/服务器结构
  • B/S结构:浏览器/服务器结构

网络通信协议

  • 网络通信协议:在计算机网络中连接和通信的规则称为网络通信协议
  • TCP/IP协议:传输互联协议/因特网互联协议是最基本最广泛的协议

协议分类

  • UDP协议:用户数据报协议,是一个面向无连接的协议,消耗资源小、通信效率高,一般用于音频视频和普通数据的传输,不能保证数据的完整性

    特点:数据被限制在64kb以内

  • TCP协议:传输控制协议,是一个面向连接的通信协议,先建立逻辑连接再发送数据,提供了可靠无差错的数据传输

    创建连接需要“三次握手”

    1. 客户端向服务端发送连接请求,等待服务器确认
    2. 服务端向客户端回应一个响应,通知客户端收到请求
    3. 客户端再次向服务端发送确认信息,确认连接

    通过三次握手可以保证数据传输的安全,一般用于文件上传、文件下载、网页浏览等

网络编程三要素

  1. 协议

    计算机网络通信中必须遵守的规则

  2. IP地址

    互联网的协议地址,是计算机在一个网络中唯一的编号

  • IPv4:32位的二进制数,通常被分为4个字节0-255之间的十进制整数

  • IPv6:128位的二进制数,通常被分为8组十六进制数

    本机ip地址:127.0.0.1、localhost

  1. 端口号

    用两个字节表示的整数,可以唯一标识设备中的进程,范围是0-65535

    1024之前的端口号用于知名的网络服务和应用

TCP通信程序

通信步骤

  1. 服务端程序需要事先启动,等待客户端连接
  2. 客户端主动连接服务器端,连接成功才能通信

在Java中,客户端使用java.net.Socket类,服务端使用java.net.ServerSocket类

注意:

  1. 多个客户端同时和服务端交互,服务端必须明确和哪个客户端进行交互
  2. 多个客户端同时和服务端交互,就需要使用多个IO流对象(获取到客户端的Socket,使用客户端的IO流进行交互)

Socket类

java.net.Socket类实现客户端套接字

  1. 构造方法

    Socket(String host, int port):创建一个流套接字并将其连接到指定主机上的指定端口号

  2. 成员方法

    OutputStream getOutputStream():返回此套接字的输出流

    InputStream getInputStream():返回此套接字的输入流

    void close():关闭此套接字

  3. 实现步骤

    (1)创建一个客户端对象Socket,构造方法中指定服务器的ip地址和端口号

    (2)使用Socket对象中的方法getOutputStream获取网络字节输出流对象

    (3)使用网络字节输出流对象的write方法给服务器发送数据

    (4)使用Socket对象中的方法getInputStream获取网络字节输入流对象

    (5)使用网络字节输入流对象的read方法读取服务器回写的数据

    (6)释放资源(close)

  4. 注意:

    (1)客户端和服务端进行交互,必须使用Socket中提供的网络流,不能使用自己创建的流对象

    (2)当客户端创建Socket对象时就会请求服务器

ServerSocket类

java.net.ServerSocket类实现服务端套接字

  1. 构造方法

    ServerSocket(int port):创建绑定到特定端口号的服务器套接字

  2. 成员方法

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

  3. 实现步骤

    (1)创建一个服务端对象ServerSocket,构造方法中指定端口号

    (2)使用ServerSocket对象中的方法accpet获取请求的客户端Socket对象

    (3)使用Socket对象中的方法getInputStream获取网络字节输入流对象

    (4)使用网络字节输入流对象的read方法读取客户端发送的数据

    (5)使用Socket对象中的方法getOutputStream获取网络字节输出流对象

    (6)使用网络字节输出流对象的write方法给客户端回写数据

    (6)释放资源(close)

UDP通信程序

作者:意识流丶 链接:https://www.jianshu.com/p/0a1f8fe54ee1 来源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

UDP协议(用户数据报协议)是无连接的、不可靠的、无序的,速度快

进行数据传输时,首先将要传输的数据定义成数据报(Datagram),大小限制在64k,在数据报中指明数据索要达到的Socket(主机地址和端口号),然后再将数据报发送出去

DatagramPacket类:表示数据报包

DatagramSocket类:进行端到端通信的类

  • 服务器端实现步骤
    1. 创建DatagramSocket,指定端口号
    2. 创建DatagramPacket
    3. 接受客户端发送的数据信息
    4. 读取数据
public class UDPServer {
    public static void main(String[] args) throws IOException {
        /*
         * 接收客户端发送的数据
         */
        //1.创建服务器端DatagramSocket,指定端口
        DatagramSocket socket=new DatagramSocket(8800);
        //2.创建数据报,用于接收客户端发送的数据
        byte[] data =new byte[1024];//创建字节数组,指定接收的数据包的大小
        DatagramPacket packet=new DatagramPacket(data, data.length);
        //3.接收客户端发送的数据
        System.out.println("****服务器端已经启动,等待客户端发送数据");
        socket.receive(packet);//此方法在接收到数据报之前会一直阻塞
        //4.读取数据
        String info=new String(data, 0, packet.getLength());
        System.out.println("我是服务器,客户端说:"+info);

        /*
         * 向客户端响应数据
         */
        //1.定义客户端的地址、端口号、数据
        InetAddress address=packet.getAddress();
        int port=packet.getPort();
        byte[] data2="欢迎您!".getBytes();
        //2.创建数据报,包含响应的数据信息
        DatagramPacket packet2=new DatagramPacket(data2, data2.length, address, port);
        //3.响应客户端
        socket.send(packet2);
        //4.关闭资源
        socket.close();
    }
}
  • 客户端实现步骤
    1. 定义发送信息
    2. 创建DatagramPacket,包含将要发送的信息
    3. 创建DatagramSocket
    4. 发送数据
public class UDPClient {
    public static void main(String[] args) throws IOException {
        /*
         * 向服务器端发送数据
         */
        //1.定义服务器的地址、端口号、数据
        InetAddress address=InetAddress.getByName("localhost");
        int port=8800;
        byte[] data="用户名:jinbin;密码:1997".getBytes();
        //2.创建数据报,包含发送的数据信息
        DatagramPacket packet=new DatagramPacket(data, data.length, address, port);
        //3.创建DatagramSocket对象
        DatagramSocket socket=new DatagramSocket();
        //4.向服务器端发送数据报
        socket.send(packet);

        /*
         * 接收服务器端响应的数据
         */
        //1.创建数据报,用于接收服务器端响应的数据
        byte[] data2=new byte[1024];
        DatagramPacket packet2=new DatagramPacket(data2, data2.length);
        //2.接收服务器响应的数据
        socket.receive(packet2);
        //3.读取数据
        String reply=new String(data2, 0, packet2.getLength());
        System.out.println("我是客户端,服务器说:"+reply);
        //4.关闭资源
        socket.close();
    }
}