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.mzph.cn/bicheng/2742.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ATFX汇市:澳大利亚一季度CPI年率大降,澳元升值态势延续

▲ATFX图 据澳大利亚统计局数据,第一季度CPI年率最新值3.6%,相比前值4.1%大降0.5个百分点,但仍高于3.5%的预期值。历史数据看,自从2022年四季度创出7.8%阶段性高点之后,澳大利亚的季度CPI年率就保持着稳定的下降态势。…

ssm项目启动的时候 修改 配置文件 定义的值

ssm项目启动的时候 修改 配置文件 定义的值 import org.springframework.beans.factory.InitializingBean; import org.springframework.core.env.ConfigurableEnvironment;import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import …

SQLite去除.db-shm和.db-wal文件【已解决】

原因是开启了WAL 日志模式,实现日志回滚功能; 如果是多个连接访问数据库就会出现共享内存-shm文件 PRAGMA journal_modeWAL; 解决办法就是设置为默认模式 PRAGMA journal_modeDELETE; 执行成功后断开再重新连接,就不会出现这两个文件了…

翻译《The Old New Thing》 - Why are HANDLE return values so inconsistent?

Why are HANDLE return values so inconsistent? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20040302-00/?p40443 Raymond Chen 2004年01月27日 简介 在处理 Windows 编程中的句柄时,开发者需要面对的一个挑战是不同函数可…

SWCTF

easy_php 源码 <?php// flag is in flag.php highlight_file(__FILE__); ini_set(display_errors, 0); error_reporting(0);if (isset($_GET[myon1]) && isset($_GET[myon2]) && isset($_GET[myon3])) {$myon1 $_GET[myon1];$myon2 $_GET[myon2];$myon…

苍穹外卖day12 (Apache POI) 数据统计-Excel报表

文章目录 前言一、工作台1.1 今日数据1.1.1 接口设计1.1.2 代码实现 1.2 订单管理接口1.3菜品总览接口1.4 套餐总览接口1.5 订单搜索&#xff08;已完成&#xff09;1.6 各个状态的订单数量统计&#xff08;已完成&#xff09; 二、Apache POI2.1 概述2.2 效果展示 三、导出运营…

vue中web端播放rtsp视频流(摄像头监控视频)(海康威视录像机)

一、ffmpeg安装​​​​​​ ffmpeg下载 https://ffmpeg.org/download.html找ffmpeg-release-essentials.zip点击下载&#xff0c;下载完解压ffmpeg.exe 程序运行 二、配置ffmpeg环境变量 添加成功后验证是否生效任意地方打开cmd窗口输入 ffmpeg 打印如下表示成功 三、node…

谈谈对情绪周期和题材轮动的个人理解

首先讲两个概念&#xff1a; 1、情绪周期 我个人理解的情绪周期&#xff0c;就是不管在大盘跌与涨的过程中&#xff0c;短线情绪都会有几个阶段&#xff0c;低位震荡&#xff0c;主升浪&#xff0c;高位震荡&#xff0c;退潮期&#xff0c;这几个阶段。 低位震荡指的是&#xf…

未来五十年,智能科技将如何改变传统行业格局?

未来五十年内&#xff0c;随着人工智能&#xff08;AI&#xff09;和智能科技的不断发展&#xff0c;许多行业将面临被取代的风险。虽然这种趋势可能会带来一些担忧&#xff0c;但也将为人类社会带来巨大的变革。下面将详细探讨哪些行业可能会在未来被智能科技所取代。 ▶ 制造…

利用弹性云主机部署高效数据库系统

在当今云计算的时代&#xff0c;弹性云主机&#xff08;EC2&#xff09;为我们提供了前所未有的灵活性和可扩展性&#xff0c;使得在云端部署高效的数据库系统成为可能。本文将从选择适当的云服务配置、优化数据库设置、建立完备的数据备份与恢复策略&#xff0c;以及加强数据库…

ardupilot开发 --- Jetson Orin Nano 篇

多情应笑我早生华发 0. 一些概念1. 系统安装&#xff08;刷机、flash&#xff09;1.1 使用SD卡安装系统1.2 使用固态硬盘安装系统 0. 一些概念 官网&#xff1a;https://www.nvidia.com/en-us/ Developers Documentation Getting Started Jetson Developer Kits User Guid…

「C++ 内存管理篇 1」C++动态内存分配

〇、C语言的动态内存分配方式 关于C语言的动态内存分配方式&#xff0c;简单来讲就是使用四个库函数&#xff1a;malloc、calloc、 realloc、free对堆区的内存进行灵活的分配和回收。有兴趣的话可以看看这篇文章: 「C语言进阶1」动态内存分配 一、C的动态内存分配方式 1. 什么…

国产大模型各自优势如何?大家都怎么选?

近日&#xff0c;一份国产大模型排行榜在网上流传&#xff0c;显示文心一言、通义千问、Kimi位居前三名&#xff0c;其中文心一言用户数为2亿&#xff0c;与其他产品拉开明显差距&#xff1b;前三名月访问量总计超过3000万。国内大模型也开始出现分化效应。

Linux部署MySQL

部署MySQL 先停掉虚拟机中的MySQL&#xff0c;确保你的虚拟机已经安装Docker&#xff0c;且网络开通的情况下&#xff0c;执行下面命令即可安装MySQL&#xff1a; docker run -d \ --name mysql \ -p 3306:3306 \ -e TZAsia/Shanghai \ -e MYSQL_ROOT_PASSWORD123 \ mysql 安…

Linux fcntl函数

fcntl函数 读法&#xff1a;file control函数 作用&#xff1a;复制文件描述符、设置/获取文件的状态标志 int fcntl(int fd, int cmd, ... /* arg */ )fd是文件描述符&#xff0c;cmd是命令&#xff08;定义的宏&#xff09;&#xff0c;… 表示可变的参数&#xff08;可有可…

Linux 安装 Docker +Docker Compose + cucker/get_command_4_run_container

TIP&#xff1a;下面演示的 Linux 系统为 CentOS 7.9。 Docker 更新你的系统并安装必要的依赖项&#xff1a; sudo yum update -y sudo yum install -y yum-utils device-mapper-persistent-data lvm2添加 Docker 的官方仓库&#xff1a; sudo yum-config-manager --add-rep…

如何在职场中有效管理时间和任务?好用的待办事项提醒软件

身在职场&#xff0c;时间管理和任务安排是每个人都必须面对的挑战。有效的时间管理不仅能提高工作效率&#xff0c;还能让我们在繁忙的工作中保持清醒的头脑。那么&#xff0c;如何在职场中有效管理时间和任务呢&#xff1f; 制定一个清晰的工作计划是非常必要的&#xff0c;…

Python构建学生信息管理系统:搭建开发环境

在本系列的前一篇文章中&#xff0c;我们详细规划了学生信息管理系统&#xff08;SIMS&#xff09;的数据库设计。接下来&#xff0c;我们将进入开发环境的搭建阶段。本文将指导您如何设置Python虚拟环境&#xff0c;安装Flask框架&#xff0c;以及项目所需的依赖库&#xff0c…

springcloud - ribbon 饥饿加载

一、未饥饿加载前 我们的服务者端口是8081&#xff0c;消费者端口是8085 当我们将两个项目都启动的时候&#xff0c;在消费者里日志级别设置未debug&#xff0c;发现找不到8081 二、开启饥饿加载 # 配置饥饿加载,d1为服务名 ribbon.eager-load.enabledtrue ribbon.eager-loa…

Spring Boot 2.5.3升级Spring Boot 3.2.2的方案设计及落地计划

Spring Boot 2.5.3升级Spring Boot 3.2.2的方案设计及落地 一、方案设计调研升级优势兼容性及风险评估引入开源软件评审备份与版本控制升级依赖代码修改测试 二、落地计划项目准备环境搭建实施升级验证与部署总结与反馈 一、方案设计 调研升级优势 首先&#xff0c;查看Sprin…