天天看点

java基础 网络编程学习笔记一、网络编程三要素二、InetAddress类三、UDP通信程序四、TCP协议

文章目录

  • 一、网络编程三要素
    • 1.1、IP
    • 1.2、端口号
    • 1.3、协议
  • 二、InetAddress类
  • 三、UDP通信程序
    • 3.1、单播
    • 3.2、组播
    • 3.3、广播
  • 四、TCP协议

一、网络编程三要素

  1. IP
  2. 端口号
  3. 协议

1.1、IP

IP:分配给上网设备的数字标签(上网设备在网络上的唯一地址)

IPV4:采用

32位

地址长度,分

4

  • 目前主流方案
  • 最多

    2

    32

    次方个IP,目前已经用完
    java基础 网络编程学习笔记一、网络编程三要素二、InetAddress类三、UDP通信程序四、TCP协议

IPV6:采用

128

位的地址长度,分

8

  • 为了解决

    IPV4

    不够用的问题而出现的
  • 最多

    2

    128

    次方个IP
  • 甚至可以给地球上每一粒沙子都设定IP
java基础 网络编程学习笔记一、网络编程三要素二、InetAddress类三、UDP通信程序四、TCP协议

1.2、端口号

由两个字节表示的整数,

0-65535

,其中

0-1023

用于知名的网络服务和应用

反正要使用的话用

1024

以上的端口号

注意:一个端口号只能被一个程序应用

java基础 网络编程学习笔记一、网络编程三要素二、InetAddress类三、UDP通信程序四、TCP协议

1.3、协议

数据传输的规则

UDP协议:用户数据报协议

  • 面向

    无连接

    通信协议
  • 速度快

    大小限制(一次最多64K)

    数据不安全

    容易丢失数据

  • 应用在丢失一些数据无所谓的场景,如:网络会议,语音通话
  • 不管两台电脑网络是否连通,

    收不到就拉倒

TCP协议: 传输控制协议

  • 面向

    连接

    通信协议
  • 速度慢

    大小不限制

    数据安全

  • 应用在需要完整数据的场景,如:下载软件,文字通信
    java基础 网络编程学习笔记一、网络编程三要素二、InetAddress类三、UDP通信程序四、TCP协议

二、InetAddress类

此类表示IP对象
  • 有两个子类,

    Inet4Address

    Inet6Address

  • 所以在创建

    InetAddress

    时,底层会判断当前系统使用的是

    IP4

    还是

    IP6

注意:此类没有对外提供构造方法,所以不能new,只能使用InetAddress.getByName()的方法创建对象,参数为主机名或IP

那么创建出来的对象表示什么?

就是IP对象,可以看做是一台电脑的对象

//    获取InetAddress对象
    public void testInetAddress() throws UnknownHostException {
//        IP的对象  一台电脑的对象
        InetAddress address = InetAddress.getByName("DESKTOP-6RGC961");

//      getHostName() 小细节:如果因为网络原因或者局域网中压根没有这个台电脑,会返回IP
        String hostName = address.getHostName();
        System.out.println(hostName);

        String hostAddress = address.getHostAddress();
        System.out.println(hostAddress);
    }
           

三、UDP通信程序

UDP的三种通信方式:

  1. 单播:发送给一台电脑
  2. 组播:发送给一组电脑
组播地址:224.0.0.0 ~ 239.255.255.255,其中224.0.0.0 ~ 224.0.0.255 为预留的组播地址
  1. 广播:发送给局域网的所有电脑
广播地址:255.255.255.255

3.1、单播

发送端步骤:

  1. 创建发送端的

    DatagramSocket

    对象
  2. 数据打包(

    DatagramPacket

    对象)
  3. 发送数据
  4. 关闭连接
public void testUDPsend() throws IOException {
//        1.创建DatagramSocket对象
//        细节:
//           绑定端口以后就是用这个端口发送
//           有参:指定端口绑定
//           无参:随机端口绑定
        DatagramSocket datagramSocket = new DatagramSocket();
//        2.打包数据
        String str = "我是发送的数据!";//数据
        byte[] strBytes = str.getBytes();//数据转字节
        InetAddress address = InetAddress.getByName("127.0.0.1");//得到接受的IP对象
        int port = 10086;//设置端口号
        DatagramPacket datagramPacket=new DatagramPacket(strBytes,strBytes.length,address,port);
//        3.发送
        datagramSocket.send(datagramPacket);
//        4.关闭连接,释放资源
        datagramSocket.close();
    }
           

接受端步骤:

  1. 创建发送端的

    DatagramSocket

    对象
  2. 接受打包好的数据(

    DatagramPacket

  3. 解析数据包
  4. 释放资源

注意:接受打包好的数据是阻塞的,执行到这里会死等,直到有信息发过来

//    创建UDP通信,接受端
    public void testUDPreceive() throws IOException {
//        1.创建接受对象
//        细节:
//        接受一定要绑定端口
//        发送时指定的是什么端口,就绑定什么端口
        DatagramSocket datagramSocket = new DatagramSocket(10086);
//        2.接受数据
        byte[] bytes = new byte[1024];
        DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);
        datagramSocket.receive(datagramPacket);
//        3.解析数据
        byte[] data = datagramPacket.getData();
        System.out.println("接受到的数据是:"+new String(data,0,data.length));
        InetAddress address = datagramPacket.getAddress();
        System.out.println("接受到的地址是:"+address);
        int port = datagramPacket.getPort();
        System.out.println("发送的端口是:"+port);
//        4.释放资源
        datagramSocket.close();
    }

           

3.2、组播

在单播的基础上做了修改
  1. 不再是创建

    DatagramSocket

    对象,而是

    MulticastSocket

    对象
  2. InetAddress.getByName("225.0.0.1");

    更换成组播的地址来设定传送的地址,只要是组播内能使用的地址都行
  3. 接受端需要将本机添加到 发送端设置的地址添加到组播中

    InetAddress address = InetAddress.getByName("225.0.0.1");

    multicastSocket.joinGroup(address );

  4. 组播接受对象可以很多个
public static void main(String[] args) throws IOException {
//      1.创建发送对象
        MulticastSocket multicastSocket = new MulticastSocket();
//      2.打包数据
        String str = "我是发送的数据";
        byte[] bytes = str.getBytes();
        InetAddress address = InetAddress.getByName("225.0.0.1");
        int port = 10086;
        DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, address, port);
//      3.发送数据
        multicastSocket.send(datagramPacket);
//      4.释放资源
        multicastSocket.close();
    }
           
public static void main(String[] args) throws IOException {
//      1.创建接受对象
        MulticastSocket multicastSocket = new MulticastSocket(10086);
//       2.将本机添加到225.0.0.1这一组
        InetAddress byName = InetAddress.getByName("225.0.0.1");
        multicastSocket.joinGroup(byName);
//       3.得到数据
        byte[] bytes = new byte[1024];
        DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);
        multicastSocket.receive(datagramPacket);
//        4.解析数据
        byte[] data = datagramPacket.getData();
        InetAddress address = datagramPacket.getAddress();
        String str = new String(data, 0, data.length);
        System.out.println(address + "说:" + str);
//        5.关闭连接
        multicastSocket.close();
    }

           

3.3、广播

在单播的基础上,将发送的地址改成广播的地址(255.255.255.255)

四、TCP协议

TCP通信协议是一种可靠的网络协议
  • 它在通信的两端各自建立

    Socket

    对象
  • 通信之前

    确保通信连接

  • 通过

    Socket

    产生

    IO流

    来进行网络通信

客户端书写步骤:

  1. 创建客户端Socket对象(

    Socket

    )与指定服务端连接

Socket(String host,int port)

  1. 获取输出流,写数据

OutputStream getOutputStream()

  1. 关闭连接

void close()

服务端书写步骤:

  1. 创建服务端的Socket对象(

    serverSocket

serverSocket(int port)

  1. 创建监听,监听客户端,返回一个

    Socket

    对象

Socket accept()

  1. 获取输入流,读数据

InputStream getInputStream()

  1. 关闭连接

void close()

客户端代码:

public class Main {
    public static void main(String[] args) throws IOException {
//        1.创建Socket连接
//        细节:
//        在创建的同时会连接服务端
//                连接不上会报错
        Socket socket = new Socket("127.0.0.1",10086);
//        2.调用输入流
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write("你好啊".getBytes());
//        3.关闭
        outputStream.close();
        socket.close();
    }
}
           

服务端代码:

public class MainServerSocket {
    public static void main(String[] args) throws IOException {
//        1.创建ServerSocket连接
        ServerSocket serverSocket = new ServerSocket(10086);
//        2.监听客户端的连接
        Socket socket = serverSocket.accept();
//            3.获取输入流
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        int b;
        while ((b =bufferedReader.read())!=-1){
            System.out.print((char) b);
        }
//        4.关闭连接
        socket.close();
        serverSocket.close();
    }
}