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

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

文章目录

  • Day40 网络编程(二) InetAddress类, Socket ,TCP编程,UDP编程
    • 一、 InetAddress类
    • 二、 Socket
    • 三、TCP编程
    • 四、UDP编程

一、 InetAddress类

1、概念:

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

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

2、主要方法:

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

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

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、示例:

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、示例:

客服端:

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、示例:

服务器端:

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();
        }
    }
}

客服端:

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、示例:

服务器端:

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();
        }
    }
}

客服端:

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();
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/579852.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于HTML+CSS+JavaScript的表白网页

基于HTMLCSSJavaScript的表白网页 前言效果截图(为GIF格式)部分代码领取源码下期更新预报 前言 大部分人都有喜欢的人,学会这个表白代码,下次表白你肯定会成功。 效果截图(为GIF格式) 部分代码 index.htm…

使用 Python 和 DirectShow 从相机捕获图像

在 Python 中使用 OpenCV 是视觉应用程序原型的一个非常好的解决方案,它允许您快速起草和测试算法。处理从文件中读取的图像非常容易,如果要处理从相机捕获的图像,则不那么容易。OpenCV 提供了一些基本方法来访问链接到 PC 的相机(通过对象),但大多数时候,即使对于简单的…

在no branch上commit后,再切换到其他分支,找不到no branch分支的修改怎么办?

解决办法 通过git reflog我们可以查看历史提交记录,这里的第二条提交(fbd3ea8)就是我在no branch上的提交。 再通过git checkout -b backup fbd3ea8,恢复到上次提交的状态,并且为其创建个分支backup,此时…

B+tree - B+树深度解析+C语言实现+opencv绘图助解

Btree - B树深度解析C语言实现opencv绘图助解 1. 概述2. Btree介绍3. Btree算法实现3.1 插入分裂 3.2 删除向右借位(左旋)向左借位(右旋)合并 3.3 查询和遍历3.3.1 查询3.3.2 遍历 3.4 优化优化1(匀key)优化2(升级key)优化3(拓展兄…

池化整合多元数据库,zData X 一体机助力证券公司IT基础架构革新

引言 近期,云和恩墨 zData X 多元数据库一体机(以下简称 zData X)在某证券公司的OA、短信和CRM业务系统中成功上线,标志着其IT基础架构完成从集中式存储向池化高性能分布式存储的转变。zData X 成功整合了该证券公司使用的达梦、O…

SEO之链接原理(三)

初创企业需要建站的朋友看这篇文章,谢谢支持: 我给不会敲代码又想搭建网站的人建议 (接上一篇) 4、 Google PR PR是 PageRank 的缩写。Google PR理论是所有基于链接的搜索引擎理论中最有名的。 PR是Google创始人之一拉里佩奇发明…

二维数组打印菱形(C语言)

一、N-S流程图&#xff1b; 二、运行结果&#xff1b; 三、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;char arr[5][5] { { , , *, , }, { , *, *, *, },{*, *, *, *, *}, { , *, *, *, …

【基于BP神经网络的多输入分类预测】

文章目录 前言环境准备导入数据划分训练集和测试集数据归一化建立模型设置训练参数训练网络仿真测试数据反归一化和排序性能评价结果可视化混淆矩阵 前言 在数据科学和机器学习领域&#xff0c;对复杂数据集进行高精度的分类预测是一个常见且关键的任务。本文通过MATLAB代码示例…

python3GUI--本地简易音乐播放器By:PyQt5(附下载地址)

文章目录 二&#xff0e;展示1.启动2.添加音乐&播放3.软件风格 三&#xff0e;软件整体功能-览四&#xff0e;实现原理1.界面设计2.音频播放3.打包 五&#xff0e;总结 博客二连发&#xff0c;继续为大家带来我使用PyQt5开发的软件&#xff0c;本次为大家分享我写的一款本地…

MySQL数据库常见SQL语句宝典

一 、常用操作数据库的命令 1.查看所有的数据库 : show databases;2.创建一个数据库 : create database if not exists 数据库名;3.删除一个数据库 : drop database if exists 数据库名;4.选择一张表 (注意在建表之前必须要选择数据库) : use 表名;* --tab 键的上面&#x…

如何我现在是本地的文件路径不是http,用html如何打开

--别给我BB 如何我现在是本地的文件架路径不是http&#xff0c;用html如何打开? 答&#xff1a; 如果你想在HTML中打开本地文件路径的视频&#xff0c;可以使用file://协议。假设你的视频文件在本地的路径为/path/to/your/video.mp4&#xff0c;那么你可以将src属性设置为file…

ULTIMATE VOCAL REMOVER V5 for Mac:专业人声消除软件

ULTIMATE VOCAL REMOVER V5 for Mac是一款专为Mac用户设计的人声消除软件&#xff0c;它凭借强大的功能和卓越的性能&#xff0c;在音乐制作和后期处理领域崭露头角。 ULTIMATE VOCAL REMOVER V5 for Mac v5.6激活版下载 这款软件基于深度神经网络&#xff0c;通过先进的训练模…

关于win11如何打开Hyper-V详解

文章目录 概要一、安装Hyper-V二、启用Hyper-V 概要 我是想要在win11家庭版用docker部署一个&#xff0c;gpt大模型&#xff0c;一开始走了很多弯路&#xff0c;因为要打开Hyper-V&#xff0c;所以我搜集到了一个方法&#xff0c;因为一般win11家庭版的Hyper-v是默认隐藏的&am…

rust前端web开发框架yew使用

构建完整基于 rust 的 web 应用,使用yew框架 trunk 构建、打包、发布 wasm web 应用 安装后会作为一个系统命令&#xff0c;默认有两个特性开启 rustls - 客户端与服务端通信的 tls 库update_check - 用于应用启动时启动更新检查&#xff0c;应用有更新时提示用户更新。nati…

redis基础(一)

启动与关闭 启动命令在/usr/local/bin目录 服务端后台启动&#xff1a;redis-server opt/redis-6.2.1/redis.conf 客户端连接&#xff1a;执行 redis-cli 关闭操作 ​ 方式1&#xff1a;进入终端后关闭 ​ 方式2&#xff1a;直接kill 掉进程 方式3&#xff1a;通过实例关闭 …

C++高级特性:C/C++内存结构模型(十一)

1、内存结构 C/C语言一只被认为是一种底层语言&#xff0c;与其他语言不一样&#xff0c;对内存结构理解是C/C程序员从入门到入土的开端。 其他编程语言对内存管理是透明的&#xff0c;程序员无序关心可以认为是一个黑盒&#xff1b;而C/C不一样理解好内存结构有利于编写健壮性…

碎碎念,最近做了几款小产品...

极简番茄时钟 一款 Mac 版「极简番茄时钟」软件。 知识卡片制作工具 主打简单&#xff0c;同时支持 Markdown 语法。 智能微信助手 让管理变得轻松&#xff0c;沟通更加高效。 感兴趣&#xff0c;欢迎来这里一起交流&#xff0c;限时免费 ~

【软件安装】(十六)双系统Ubuntu22.04引导启动菜单的默认项

一个愿意伫立在巨人肩膀上的农民...... 好学的人总是喜欢在电脑上安装双系统&#xff0c;可是安装好系统之后&#xff0c;就会出现默认启动优先级的苦恼&#xff0c;如果在Bios中设置Windows引导启动为优先启动&#xff0c;那么每次想要进如Ubuntu系统就都需要重新设置Bios。如…

基于 Redis 发布订阅实现服务注册与发现

写在前面 其实很少有公司会使用 Redis 来实现服务注册与发现&#xff0c;通常是ETCD、NACOS、ZOOKEEPER等等&#xff0c;但是也不妨碍我们了解。本文会先介绍 Redis 的发布/订阅模式&#xff0c;接着基于这个模式实现服务注册与发现。 Redis发布订阅流程图&#xff1a; Red…

北京半导体展会2024时间(入场时间+闭馆时间)

2024年第二十一届中国国际半导体博览会&#xff08;IC CHINA&#xff09; 时 间&#xff1a;2024 年 9 月 5 一 7 日 地 点&#xff1a;中国北京 北人亦创国际会展中心 作为中国半导体行业协会主办的唯一展览会&#xff0c;自 2003 年起已连续成功举办二十届&#xff0c;是…