JAVA网络编程(UDP与TCP)

  • Post author:
  • Post category:java



目录


一、网络编程的三要素


1、IP地址:设备在网络中的地址,是唯一的标识。


2、端口:应用程序在设备中唯一的标识。


3、协议:数据在网络中传输的规则,常见的协议有UDP协议和TCP协议。


二、UDP通信编程


1、发送端


2、接收端


3、UDP的三个通信方式


(1)单播:一对一,如上。


(2)组播:一对一组,通过组播地址进行通信


(3)广播:一对全部,和单播的编程方式一样,只不过是将接收端发送的IP地址设置为广播地址255.255.255.255即可。


三、TCP通信编程


1、客户端


2、服务器端


3、TCP协议的细节点


4、三次握手协议和四次挥手协议


tips:


一、网络编程的三要素

1、IP地址:设备在网络中的地址,是唯一的标识。


IPV4的格式:

具有32位,采用点分十进制进行表示,即每八位转换为十进制并用点进行分隔。


IPV6的格式:

具有128位,采用冒分十六进制表示法,即把每一组(16位2字节)转化为16进制并用冒号分隔开来。


常用cmd命令:

ipconfig:查看本机IP地址。

ping IP地址:检查两台设备之间网络是否连通。


Java提供查看IP地址的类InetAddress类:

static InetAddress  getByname(String str) 根据字符串str表示的主机名或ip地址获取一个InetAddress对象
String getHostName() 获取主机名
String getHostAddress() 获取IP地址

2、端口:应用程序在设备中唯一的标识。


端口号:

用两个字节表示的整数,取值范围为0~65535。其中0~1023之间的端口用于一些知名的网络服务或者应用,我们自己使用1024以上的端口号就行了。一个端口只能被一个应用程序使用。

3、协议:数据在网络中传输的规则,常见的协议有UDP协议和TCP协议。


UDP协议(用户数据报协议):

是面向无连接的通信协议,速度快,有大小限制,一次最多发送64k,数据不安全,易丢失数据。


TCP协议(传输控制协议):

TCP协议是面向连接的通信协议,速度慢,没有大小限制,数据安全。

二、UDP通信编程

1、发送端


步骤:

(1)创建DatagramSocket对象,可以不带参数(参数为指定端口号),缺省为随机。

(2)打包数据,即创建DatagramPacket对象对通信的字节数据进行打包,并设定目标主机的InetAdress对象和其端口号。

(3)调用send()方法进行数据的发送。

(4)完成发送后需要调用DatagramSocket对象的close()方法进行释放资源


例如:

package net;

import java.util.Scanner;

import java.io.IOException;
import java.net.*;

public class WYnet {
    public static void main(String[] args) throws IOException {
        //1、创建DatagramSocket对象
        DatagramSocket ds= new DatagramSocket();
        String s;
        Scanner in =new Scanner(System.in);
        //输入要发送的数据
        s=in.next();
            byte[] bytes =s.getBytes();
            System.out.println(bytes.length);
            //2、创建DatagramPacket对象封装字节数组
            DatagramPacket dp=new DatagramPacket(bytes,bytes.length,InetAddress.getByName("127.0.0.1"),10000);

            //3、调用send()方法发送
            ds.send(dp);

        //4、释放资源
        ds.close();
    }
}

2、接收端


步骤:

(1)创建DatagramSocket对象并向其构造方法中传入需要使用哪个端口作为接收数据的端口号。

(2)创建DatagramPacket对象来接收数据,构造方法参数需要设定一个byte数组进行接收数据。

(3)调用DatagramSocket对象的recive()方法来接收数据。

(4)解析数据包,通过调用DatagramPacket对象的getData()方法来获取接收到的数据。

(5)通过调用DatagramSocket对象的close()方法来释放资源。


例如:

package net;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class WYnet1 {
    public static void main(String[] args) throws IOException {
        //(1)创建DatagramSocket对象并向其构造方法中传入需要使用哪个端口作为接收数据的端口号。
        DatagramSocket ds = new DatagramSocket(10000);
        //(2)创建DatagramPacket对象来接收数据,构造方法参数需要设定一个byte数组进行接收数据。
        DatagramPacket dp = new DatagramPacket(new byte[1024],1024);
       //(3)调用DatagramSocket对象的recive()方法来接收数据。
        ds.receive(dp);
        //(4)通过调用DatagramPacket对象的getData()方法来获取接收到的数据。
       byte[] data = dp.getData();
        System.out.println(new String(data,0,data.length));
      //(5)通过调用DatagramSocket对象的close()方法来释放资源。
        ds.close();
    }
}

3、UDP的三个通信方式

(1)单播:一对一,如上。

(2)组播:一对一组,通过组播地址进行通信

组播地址:224.0.0.0~239.255.255.255,其中224.0.0.0~224.0.0255为预留的组播地址,操作系统使用,我们只能使用224.0.1.0以后的组播地址。


发送端步骤:

1)创建DatagramSocket对象

2)将数据打包,即创建DatagramPacket对象,其中目的IP地址为组播地址

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

4)调用DatagramSocket对象的close()释放资源

例如:

package net;

import java.util.Scanner;

import java.io.IOException;
import java.net.*;

public class WYnet {
    public static void main(String[] args) throws IOException {
        //1、创建DatagramSocket对象
        DatagramSocket ds= new DatagramSocket();
        String s;
        Scanner in =new Scanner(System.in);
        //输入要发送的数据
        s=in.next();
            byte[] bytes =s.getBytes();
            System.out.println(bytes.length);
            //2、创建DatagramPacket对象封装字节数组
            DatagramPacket dp=new DatagramPacket(bytes,bytes.length,InetAddress.getByName("224.0.1.1"),10000);  //组播地址

            //3、调用send()方法发送
            ds.send(dp);

        //4、释放资源
        ds.close();
    }
}


接收端步骤:

1)创建接收端的MulticastSocket对象,并向其构造方法中传入需要使用哪个端口作为接收数据的端口号。

2)创建DatagramPacket对象来接收数据,构造方法参数需要设定一个byte数组进行接收数据。

3)通过调用MulticastSocket对象的joinGroup()方法加入组。

4)调用DatagramSocket对象的recive()方法来接收数据。

5)解析数据包,通过调用DatagramPacket对象的getData()方法来获取接收到的数据。

6)通过调用MulticastSocket对象的close()方法来释放资源。

例如:

package net;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;

public class WYnet1 {
    public static void main(String[] args) throws IOException {
        //(1)创建MulticastSocket对象并向其构造方法中传入需要使用哪个端口作为接收数据的端口号。
        MulticastSocket ms = new MulticastSocket(10000);
        //(2)创建DatagramPacket对象来接收数据,构造方法参数需要设定一个byte数组进行接收数据。
        DatagramPacket dp = new DatagramPacket(new byte[1024],1024);
        //(3)调用MulticastSocket对象的joinGroup()加入组。
        ms.joinGroup(InetAddress.getByName("224.0.1.1"));
        //(4)调用MulticastSocket对象的recive()方法来接收数据。
        ms.receive(dp);
        //(5)通过调用DatagramPacket对象的getData()方法来获取接收到的数据。
        byte[] data = dp.getData();
        System.out.println(new String(data,0,data.length));
        //(6)通过调用MulticastSocket对象的close()方法来释放资源。
        ms.close();
    }
}

(3)广播:一对全部,和单播的编程方式一样,只不过是将接收端发送的IP地址设置为广播地址255.255.255.255即可。


注意:先运行接收端再运行发送端!不然可能接收不到。因为UDP是面向无连接的通信协议。

三、TCP通信编程

1、客户端


步骤:

(1)创建一个Socket对象,构造方法参数为IP地址和端口号。

(2)通过调用Socket对象的getOutputStream()方法获取一个IO流对象(字节流)调用其write()方法开始写数据。

(3)通过调用Socket对象的close()方法进行释放资源。


例如:

package net;

import java.io.OutputStream;
import java.util.Scanner;

import java.io.IOException;
import java.net.*;

public class WYnet {
    public static void main(String[] args) throws IOException {
        //1、创建Socket对象设置需要目的IP和端口号
        Socket st= new Socket("127.0.0.1",1000);
        String s;
        Scanner in =new Scanner(System.in);
        //输入要发送的数据
        s=in.next();
        byte[] bytes =s.getBytes();
        System.out.println(bytes.length);
        //2、调用Socket对象的getOutputStream获取IO流对象进行数据写入
        OutputStream os = st.getOutputStream();

        //3、调用write()方法发送
            os.write(bytes,0,bytes.length);

        //4、释放资源
        os.close();
        st.close();
    }
}

2、服务器端


步骤:

(1)创建ServerSocket对象,并设置其接收数据的端口号。

(2)调用ServerSocket对象的accept()方法获取一个Socket对象并等待连接。

(3)通过调用Socket对象的getInputStream()方法获取IO流(字节流)对象调用其read()方法进行数据接收。

(4)调用InputStream对象和ServserSocket对象的close()方法进行释放资源。


例如:

package WYnet;

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class WYnet {
    public static void main(String[] args) throws IOException {
        //1、创建ServerSocket对象并设置接收数据的端口
        ServerSocket st= new ServerSocket(10020);
        //2、调用ServerSocket对象的accept()方法等待连接(进入阻塞),获取Socket对象
        Socket stt= st.accept();
        //3、连接完成,调用Socket对象的getInputStream()方法获取InputStream对象,并调用其read()方法获取数据。
        InputStream is= stt.getInputStream();
        //读取数据
        int k;
        while((k=is.read())!=-1){
            System.out.print((char)k);
        }
        //4、释放资源
        is.close();
        st.close();
    }
}

3、TCP协议的细节点

(1)accept()方法是阻塞的,作用就是等待客户端连接。

(2)客户端创建对象并连接服务器端,此时是通过三次握手协议来保证客户端与服务器端的连接。

(3)针对客户端来讲,是往外写,所以是输出流,针对服务器端来讲是往里读,所以是输入流。

(4)read()方法也是阻塞的,解决方案:在客户端写完数据后通过调用Socket对象的shutdownOutput()方法进行断流即Socket对象再发送一个结束标记。

(5)客户端在关流的时候,还多了一个往服务器端写结束标记的动作。

(6)最后一步断开连接,通过四次握手协议保证连接的终止。

4、三次握手协议和四次挥手协议


三次握手过程(建立连接):


四次挥手过程(取消连接):

tips:

可以UUID类生成随机的文件名,防止多次上传文件时出现文件覆盖的现象。



版权声明:本文为weixin_45994580原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。