网络编程(InetAddress类、UDP、TCP)

1、InetAddress类

(1)IP和端口号:

IP(InternetProtocol,IP)互联网协议地址:唯一标识一台计算机。

端口号:用于区分不同的应用程序。取值范围是0~65535,其中0~1023被系统保留。

在计算机A访问计算机B是通过IP地址进行查找的,接着在计算机B上通过应用程序的端口号找到相应的程序。

(2)InetAddress类常用方法:

import java.net.InetAddress;
import java.net.UnknownHostException;

public class InetAddressDemo {
    public static void main(String[] args) {

        try {
            InetAddress local = InetAddress.getLocalHost();

            System.out.println(local.getHostAddress());// 返回本地主机地址
            System.out.println(local.getHostName());// 主机名

            InetAddress address = InetAddress.getByName("主机名");
            System.out.println(address);

        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
    }
}

2、UDP协议

(1)概念:

UDP (User Datagram Protocol)用户数据报协议,在数据传输时彼此之间不需要建立连接,传输前需要把数据定义成数据报,并且传输效率高,但是不安全。

(2)DatagramPacket类

用于封装UDP通信中发送和接收的数据。

第一个构造方法指明了数据包的大小,用于接收数据。

第二个构造方法指明了数据包的大小,目标地址、端口号,用于发送数据。

(3)DatagramSocket类

接收和发送数据包。

 第一个构造方法中,系统会随机分配一个空闲端口,用于发送端。

第二个构造方法,需要指定端口号,既可以用于发送端也可用于接收端。

(4)应用:

发送端:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Scanner;

public class Send {
    public static void main(String[] args) {
        while (true) {
            DatagramSocket send;
            System.out.println("请输入数据:");

            Scanner sc = new Scanner(System.in);
            String str = sc.next();
            try {
                send = new DatagramSocket(3001);// 发送数据包
                byte[] buffer = str.getBytes();
                DatagramPacket dp = new DatagramPacket(buffer, buffer.length,
                        InetAddress.getByName("主机名"), 3000);// 封装数据
                // InetAddress.getByName("主机名"),获取端口号
                send.send(dp);// 发送
                send.close();
            } catch (SocketException e) {
                e.printStackTrace();
            } catch (UnknownHostException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}

接收端:

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

public class Receive {
    public static void main(String[] args) throws SocketException {

        DatagramSocket receive = new DatagramSocket(3000);

        byte[] buf = new byte[1024];
        while (true) {
            DatagramPacket dp = new DatagramPacket(buf, 1024);
            try {
                receive.receive(dp);
            } catch (IOException e) {

                e.printStackTrace();
            }
            String strRecv = new String(dp.getData(), 0, dp.getLength())
                    + "     " + "来自" + dp.getAddress() + "  " + dp.getPort();
            System.out.println(strRecv);
        }

    }
}

 3、TCP通信

(1)概念:

TCP通信分为客户端和服务器端,实现通信必须由客户端连接服务端。

(2)Socket类(客户端):

可以指定IP地址和端口号,可以根据IP和端口号运行服务端程序,只是IP地址的形式不同。

(3)ServerSocket类(服务器端):

没有绑定端口号,需要调用bind方法。

可以绑定端口号,默认最大连接数量为50。

可以绑定端口号,指定最大连接数量。

可以绑定端口号,指定最大连接数量、IP地址。适用于计算机上有多块网卡和多个 IP。

(4)应用:

客户端,可以一直发送数据:

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class Client {
    public static void main(String[] args) throws UnknownHostException,
            IOException {
        Socket s = new Socket(InetAddress.getByName("DESKTOP-R14D2UH"), 7999);// 通过IP和端口号连接服务器
        OutputStream out = s.getOutputStream();

        out.write("客户端已启动".getBytes());
        InputStream in = s.getInputStream();
        byte[] buffer = new byte[1024];
        int length = in.read(buffer);
        System.out.println(new String(buffer, 0, length));

        while (true) {
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入数据到服务器:");
            String str = sc.next();
            out.write(str.getBytes());

        }

    }
}

服务器,一直接收客户端发送的数据:

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

public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket ss = new ServerSocket(7999);
        Socket s = ss.accept();// 在服务端的指定端口监听客户端发来的连接请求,并与之连接
        OutputStream out = s.getOutputStream();
        out.write("你已经连接上了服务器".getBytes());// 字节输出
        while(true){
        InputStream in = s.getInputStream();
        byte[] buffer = new byte[1024];
        int length = in.read(buffer);
        System.out.println(new String(buffer, 0, length));}
    

    }
}
原文地址:https://www.cnblogs.com/zhai1997/p/11385495.html