Day40 网络编程(二) InetAddress类, Socket ,TCP编程,UDP编程

Day40 网络编程(二) InetAddress类, Socket ,TCP编程,UDP编程

文章目录

  • [Day40 网络编程(二) InetAddress类, Socket ,TCP编程,UDP编程](#Day40 网络编程(二) InetAddress类, Socket ,TCP编程,UDP编程)

一、 InetAddress类

1、概念:

InetAddress类是Java中用于表示 IP 地址的类,它提供了一些方法来操作 IP 地址,包括获取主机名、IP 地址、进行主机名解析等功能。InetAddress类位于java.net包中。

理解:用来表示主机的信息

2、主要方法:

  1. 获取本地主机地址getLocalHost()方法可以获取本地主机的InetAddress对象。
java 复制代码
public static InetAddress getLocalHost() throws UnknownHostException
    //返回本地主机。

​ 2.根据主机名获取 IP 地址getByName(String host)方法根据主机名获取对应的InetAddress对象。

java 复制代码
public static InetAddress getByName(String host) throws UnknownHostException
    //在给定主机名的情况下确定主机的 IP 地址

注意 :主机名可以是机器名(如 "java.sun.com"),也可以是其 IP 地址的文本表示形式。如果提供字面值 IP 地址,则仅检查地址格式的有效性。

​ 3.根据 IP 地址获取主机名getHostName()方法可以获取 IP 地址对应的主机名。

​ 4.获取 IP 地址的字节数组getAddress()方法可以获取 IP 地址的字节数组形式。

​ 5.判断 IP 地址的类型isReachable(int timeout)方法可以判断该 IP 地址是否可达。

​ 6.其他方法:还有一些其他方法用于比较 IP 地址、获取主机名等操作。

3、示例:

java 复制代码
import java.net.InetAddress;
import java.net.UnknownHostException;

public class Test01 {
	/**
	 * 知识点:InetAddress 
	 * 理解:表示主机类
	 */
	public static void main(String[] args) throws UnknownHostException {
		
		//获取本机的IP地址
//		InetAddress localHost = InetAddress.getLocalHost();
//		System.out.println(localHost);
		
		//获取域名对应的服务器地址
//		InetAddress byName = InetAddress.getByName("www.baidu.com");
//		System.out.println(byName);
		
		//获取域名对应的所有的服务器地址
		InetAddress[] allByName = InetAddress.getAllByName("www.baidu.com");
		for (InetAddress inetAddress : allByName) {
			System.out.println(inetAddress);
		}
		
		/**
		 * 一个域名 对应 多个IP地址
		 */
		
	}
}

二、 Socket

1、概念:

Socket是Java中用于实现网络通信的基本类,它提供了客户端和服务器之间的双向通信机制。通过Socket类,可以在客户端和服务器之间建立连接,并进行数据的传输和通信 。

2、经验:

Scoket也叫套接字,其表示的是IP地址和端口号的组合。

网络编程主要就是指Socket编程,网络间的通信其实就是Socket间的通信,数据就通过IO流在两个Scoket间进行传递。

3、主要特性

  1. 基于TCP协议Socket基于TCP协议实现,提供可靠的、面向连接的通信。
  2. 客户端-服务器模型Socket类支持客户端和服务器之间的通信,客户端通过Socket与服务器建立连接。
  3. 双向通信Socket类提供了输入流和输出流,可以实现双向数据传输。
  4. 阻塞式通信 :默认情况下,Socket是阻塞式的,即在进行读写操作时会阻塞当前线程,直到操作完成或超时。
  5. 多线程支持 :可以在多线程环境下使用Socket,实现并发的网络通信。

4、基本用法:

  1. 创建Socket对象 :在客户端,使用Socket类创建一个Socket对象,并指定服务器的IP地址和端口号。
  2. 建立连接 :调用Socket对象的connect()方法与服务器建立连接。
  3. 发送和接收数据:通过Socket对象的输入流和输出流进行数据的发送和接收。
  4. 关闭连接 :通信结束后,调用Socket对象的close()方法关闭连接。

5、示例:

客服端:

java 复制代码
import java.io.*;
import java.net.Socket;

public class Client {
    public static void main(String[] args) {
        try {
            // 创建Socket对象,指定服务器地址和端口号
            Socket socket = new Socket("127.0.0.1", 8080);

            // 获取输出流,向服务器发送数据
            OutputStream outputStream = socket.getOutputStream();
            PrintWriter out = new PrintWriter(outputStream, true);
            out.println("Hello, Server!");

            // 获取输入流,接收服务器返回的数据
            InputStream inputStream = socket.getInputStream();
            BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
            String response = in.readLine();
            System.out.println("Server response: " + response);

            // 关闭连接
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

三、TCP编程

1、概念:

TCP是一种面向连接的、可靠的、基于字节流的传输层协议,用于在网络中实现可靠的数据传输。在Java中,可以通过SocketServerSocket类来实现TCP编程,建立客户端和服务器之间的TCP连接,进行数据的传输和通信。

2、基本步骤:

  1. 创建服务器端
    • 创建ServerSocket对象,指定服务器端口。
    • 调用accept()方法接受客户端连接,返回Socket对象。
    • 使用Socket对象的输入流和输出流进行数据传输。
  2. 创建客户端
    • 创建Socket对象,指定服务器地址和端口。
    • 使用Socket对象的输入流和输出流进行数据传输。

3、示例:

服务器端:

java 复制代码
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPServer {
    public static void main(String[] args) {
        try {
            // 创建ServerSocket对象,指定端口号
            ServerSocket serverSocket = new ServerSocket(8080);

            // 等待客户端连接
            System.out.println("Server waiting for client...");
            Socket clientSocket = serverSocket.accept();
            System.out.println("Client connected.");

            // 获取输入流,接收客户端数据
            BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            String clientMessage = in.readLine();
            System.out.println("Client message: " + clientMessage);

            // 发送响应给客户端
            PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
            out.println("Hello, Client!");

            // 关闭连接
            clientSocket.close();
            serverSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

客服端:

java 复制代码
import java.io.*;
import java.net.Socket;

public class TCPClient {
    public static void main(String[] args) {
        try {
            // 创建Socket对象,指定服务器地址和端口号
            Socket socket = new Socket("127.0.0.1", 8080);

            // 发送数据给服务器
            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
            out.println("Hello, Server!");

            // 接收服务器响应
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String serverResponse = in.readLine();
            System.out.println("Server response: " + serverResponse);

            // 关闭连接
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

四、UDP编程

1、概念:

UDP是一种无连接的、不可靠的传输层协议,它提供了数据包的无序传输,适用于对实时性要求较高、数据丢失可以容忍的场景。在Java中,可以通过DatagramSocketDatagramPacket类来实现UDP编程,实现客户端和服务器之间的UDP通信。

2、基本步骤:

  1. 创建服务器端
    • 创建DatagramSocket对象,指定服务器端口。
    • 创建DatagramPacket对象用于接收客户端数据。
    • 使用receive()方法接收客户端数据,处理数据并发送响应。
  2. 创建客户端
    • 创建DatagramSocket对象。
    • 创建DatagramPacket对象用于发送数据到服务器。
    • 使用send()方法发送数据到服务器。

3、示例:

服务器端:

java 复制代码
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UDPServer {
    public static void main(String[] args) {
        try {
            // 创建DatagramSocket对象,指定端口号
            DatagramSocket serverSocket = new DatagramSocket(9876);

            // 接收客户端数据
            byte[] receiveData = new byte[1024];
            DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
            serverSocket.receive(receivePacket);

            String clientMessage = new String(receivePacket.getData(), 0, receivePacket.getLength());
            System.out.println("Client message: " + clientMessage);

            // 发送响应给客户端
            byte[] sendData = "Hello, Client!".getBytes();
            DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, receivePacket.getAddress(), receivePacket.getPort());
            serverSocket.send(sendPacket);

            // 关闭连接
            serverSocket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

客服端:

java 复制代码
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UDPClient {
    public static void main(String[] args) {
        try {
            // 创建DatagramSocket对象
            DatagramSocket clientSocket = new DatagramSocket();

            // 发送数据给服务器
            String message = "Hello, Server!";
            byte[] sendData = message.getBytes();
            InetAddress serverAddress = InetAddress.getByName("127.0.0.1");
            int serverPort = 9876;
            DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, serverAddress, serverPort);
            clientSocket.send(sendPacket);

            // 接收服务器响应
            byte[] receiveData = new byte[1024];
            DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
            clientSocket.receive(receivePacket);

            String serverResponse = new String(receivePacket.getData(), 0, receivePacket.getLength());
            System.out.println("Server response: " + serverResponse);

            // 关闭连接
            clientSocket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
相关推荐
AskHarries1 小时前
系统提示词、开发者指令和用户输入的优先级
java·前端·数据库
daidaidaiyu2 小时前
ThingsBoard 规则链系统源码分析和自定义定时器
java
志栋智能2 小时前
AI驱动无代码:降低巡检超自动化的门槛
大数据·运维·网络·人工智能·自动化
专业机床数据采集2 小时前
C# 精雕数控 数据采集 Demo|实时读取精雕机床坐标、主轴、负载、加工工时全量参数
网络·网络协议·tcp/ip·mes·精雕数控数据采集
小毛驴8502 小时前
spring-boot-maven-plugin,maven-compiler-plugin 功能对比
java·python·maven
AOwhisky2 小时前
Ceph系列第六期:Ceph 文件系统(CephFS)精讲
linux·运维·网络·笔记·ceph
我爱C编程2 小时前
基于ECC簇内分组密钥管理算法的无线传感器网络matlab性能仿真
网络·matlab·ecc·密钥管理·无线传感器网络·簇内分组
csdn_aspnet2 小时前
Java 霍尔分区算法(Hoare‘s Partition Algorithm)
java·开发语言·算法
霸道流氓气质2 小时前
通义灵码 IDEA 插件完全使用指南
java·ide·intellij-idea
诸葛务农3 小时前
道路行驶条件下电动汽车永磁电机的有效使用寿命及永磁体的失效和回收再利用(下)
java·开发语言·算法