Java网络编程之UDP通信与TCP通信交互代码实现

​import java.net.InetAddress;
import java.io.IOException;
class Main {public static void main(String[] args) {try {
InetAddress localAddress = InetAddress.getLocalHost();
//获得本地主机
InetAddress remoteAddress =InetAddress.getByName("www.itcast.cn");//由主机名获得IP地址
System.out.println("本机主机名"+localAddress.getHostName()+
"本机IP地址: " + localAddress.getHostAddress() +",www.itcast.cn的IP地址: " + remoteAddress.getHostAddress() + ",3秒是否可以到达主机名为www.itcast的IP地址: " +remoteAddress.isReachable(3000));} catch (IOException e) {e.printStackTrace();}}
}

 

e8d3161de517093c1a8f96ea332ea456.png

URL编程

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Scanner;
class Main {public static void main(String[] args) {try {URL url=new URL(https://www.baidu.com");// 注意URL地址需要包含协议部分            InputStream input = url.openStream(); // 注意正确的方法为openStream(),//openStream()方法会抛出IOException,类型为InputStreamScanner scan = new Scanner(input);//实例化Scanner对象scan.useDelimiter("\n");//读取分隔符while (scan.hasNext()) {System.out.println(scan.next());}} catch (IOException e) {e.printStackTrace();}}
}

 

如下所示,读取了网页HTML文件。将其复制然后加到新建的HTML文档,运行可见网页。

 

86cdd2b190446665d22955ac7351868e.png

 

fba3ed3751f6ad7ab9ab4216652dd03f.png

 

TCP通信

ServerSocket服务器端,用于连接客户端请求。

Socket客户端,向服务器发出连接请求。

1对1的TCP通信

服务器端程序

import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPServer {public static void main(String[] args) {Socket client = null;OutputStream os = null;//输出流对象声明try {ServerSocket serverSocket = new ServerSocket(7788);//创建端口号为7788的SerSocket对象System.out.println("等待建立连接");client = serverSocket.accept();//服务端等待客户端连接os = client.getOutputStream();//获得客户端输出流System.out.println("开始连接");os.write("北京欢迎你".getBytes());//使用输出流输出数据Thread.sleep(5000);//线程休眠一段时间System.out.println("结束通信");} catch (IOException | InterruptedException e) {e.printStackTrace();} finally {try {if (os != null) {os.close();}if (client != null) {client.close();}} catch (IOException e) {e.printStackTrace();}}}
}

 

 

c93d5740501bacafb516c1f7aecbbcc9.png

 

客户端

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
​
class Main{public static void main(String[] args) throws  Exception{Socket client = null;//声明客户端对象BufferedReader buf = null;//声明BufferedReadered对象,用于接收信息try {client = new Socket("BF-201911291316",7788);//以指定主机名与端口号创建对象buf = new BufferedReader(new InputStreamReader(client.getInputStream()));//创建一个BufferedReader对象用于接收客户端输入流信息String str = buf.readLine();//读取该信息System.out.println("服务器输出内容:" + str);//输出} catch (IOException e) {e.printStackTrace();} finally {try {if (buf != null) {buf.close();//关闭输入流}if (client != null) {client.close();//关闭Socket对象}} catch (IOException e) {e.printStackTrace();}}}
}
 

 

3571043ec8951505edf12b3eca3c1254.png

 

执行程序时,先启动服务器端,再启动客户端

多线程TCP网络程序

服务器端允许多个客户端程序同时访问

(1)TCPClient客户端程序1

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
​
public class TCPClient {public static void main(String[] args) throws  Exception{
​Socket client = null;BufferedReader buf = null;try {client = new Socket("BF-201911291316",7798);//客户端指派主机名和端口号buf = new BufferedReader(new InputStreamReader(client.getInputStream()));String str = buf.readLine();System.out.println("服务器输出内容:" + str);} catch (IOException e) {e.printStackTrace();} finally {try {if (buf != null) {buf.close();}if (client != null) {client.close();}} catch (IOException e) {e.printStackTrace();}}}
}

 

(2)Client客户端程序2

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
​
public class Client {public static void main(String[] args) throws  Exception{
​Socket client = null;BufferedReader buf = null;try {client = new Socket("BF-201911291316",7798);buf = new BufferedReader(new InputStreamReader(client.getInputStream()));String str = buf.readLine();System.out.println("服务器输出内容:" + str);} catch (IOException e) {e.printStackTrace();} finally {try {if (buf != null) {buf.close();}if (client != null) {client.close();}} catch (IOException e) {e.printStackTrace();}}}
}

 

TCPserver服务端程序

import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPServer {public static void main(String[] args) {try (ServerSocket serverSocket = new ServerSocket(7798)) {while (true) {Socket client;try {client = serverSocket.accept();int port = client.getPort();System.out.println("与端口号为" + port + "的客户端连接成功");
​new Thread(() -> {try (OutputStream os = client.getOutputStream()) {System.out.println("开始交换数据");os.write("北京欢迎你".getBytes());Thread.sleep(5000);System.out.println("交换数据结束");} catch (IOException | InterruptedException e) {e.printStackTrace();} finally {try {if (client != null && !client.isClosed()) {client.close();}} catch (IOException ex) {ex.printStackTrace();}}}).start();} catch (IOException e) {e.printStackTrace();}}} catch (IOException e) {e.printStackTrace();}}}
​

 

依次启动三个程序,可以看到两个客户端与服务器端交互情况。

 

fe2e2592e28de091984d2d95cde8926d.png

 

dacff7377c512589d380c70f66c89e51.png

 

f74f9ae76794c7b5e91465f8d4e2a941.png

 

UDP通信

(1)DatagramPacket类,即数据报对象,包含数据以及数据报长度,IP地址和端口号等信息。接收端用一个字符数组作为参数存储接收的信息,发送端不但要存放发送信息的字符数组,还要指明端口号和IP地址。

(2)DatagramSocket类,用于发送主机中建立数据报通信方式。

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
​
public class Receiver {public static void main(String[] args) {try {byte[] buffer = new byte[1024];DatagramSocket ds = new DatagramSocket(8954);DatagramPacket dp = new DatagramPacket(buffer, buffer.length);System.out.println("等待接收数据");try{ ds.receive(dp);}catch(IOException e){System.out.println(e);}String S = new String(dp.getData(), 0, dp.getLength()) + "from" + dp.getAddress().getHostAddress() + ":"+ dp.getPort();System.out.println(S);ds.close();}catch (     SocketException e) {e.printStackTrace();}}
}
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
​
public class Sender {public static void main(String[] args) {try {DatagramSocket ds = new DatagramSocket(3000);
​String S = "hello world";byte[] b = S.getBytes();DatagramPacket dp = new DatagramPacket(b, b.length, InetAddress.getByName("BF-201911291316"), 8954);System.out.println("发送信息");ds.send(dp);ds.close();} catch (Exception e) {System.out.println(e);}}
}

 

7d120cf5012e1d192998d0e5faa9a1f9.png

 

ee3c12bbe3209b80b263619189a70090.png

 

多线程UDP网络程序

 

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;
​
public class TT{public static void main(String[] args) {new Receive().start();new Send().start();}
}
class Receive extends Thread{public void run(){try {DatagramSocket socket=new DatagramSocket(6666);DatagramPacket packet=new DatagramPacket(new byte[1024], 1024);
​while(true){socket.receive(packet);byte[] arr=packet.getData();int len=packet.getLength();String ip=packet.getAddress().getHostAddress();System.out.println(ip+":"+new String(arr,0,len));
​
​}
​}catch(IOException e){e.printStackTrace();
​}}
}
class Send extends Thread{public void run(){try {DatagramSocket socket=new DatagramSocket();Scanner sc=new Scanner(System.in);while(true){String ip=sc.nextLine();if("quiet".equals(ip)){break;}DatagramPacket packet=new DatagramPacket(ip.getBytes(),ip.getBytes().length, InetAddress.getByName("BF-201911291316"),6666);socket.send(packet);socket.close();}}catch (IOException e){System.out.println(e);}
​}
}

 

e678d5f21a279c5737ed42f78b94665f.png

 

 

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

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

相关文章

EtherCAT主站IGH-- 1 -- IGH之cdev.h/c文件解析

EtherCAT主站IGH-- 1 -- IGH之cdev.h/c文件解析 0 预览一 该文件功能cdev.c 文件功能函数预览 二 函数功能介绍cdev.c 中主要函数的作用1. ec_cdev_init2. ec_cdev_clear3. eccdev_open4. eccdev_release5. eccdev_ioctl6. eccdev_mmap7. eccdev_vma_fault8. eccdev_vma_nopage…

批处理脚本参数传递:掌握命令行的艺术

批处理脚本参数传递:掌握命令行的艺术 批处理脚本(Batch Script)是Windows操作系统中一种自动化执行任务的脚本文件,通常以.bat或.cmd为文件扩展名。在编写批处理脚本时,我们经常需要从命令行接收参数以提供更大的灵活…

【Android面试八股文】说一说ListView卡顿的原因以及相对应的优化策略

文章目录 一、ListView卡顿的原因1.1 Item没有复用1.2 布局的层级过深1.3 数据绑定逻辑过多1.4 滑动时不必要的图片刷新1.5 频繁的notifyDataSetChanged二、优化策略2.1 使用 ViewHolder 进行视图复用2.2 优化布局结构2.3 优化数据绑定逻辑过多2.4 图片加载优化2.5 避免频繁调用…

电机故障检测系统的通用性限制分析

电机故障检测系统因应用环境、功能需求、经济性等多方面差异而难以实现通用。工厂与实验室在环境条件、使用频率、功能需求、成本、维护及数据处理方面有显著不同,此外,LabVIEW软件在两者中的应用和数据处理也存在差异,这进一步限制了系统的通…

一个实例配置多个服务名

更改参数实现配置多个服务名 需求背景 在做案例模拟的时候发现博主的环境配置的是3个服务名,通常都是一个服务名,服务名就是数据库名,出于好奇进行了以下实验。 环境:Oracle 11.2.0.4 单点 配置多个服务名的意义 可以通过服务…

数组方法总结

创建数组的方法 Array.of(): 创建包含所有传入参数的数组。Array.from(): 从类数组或可迭代对象创建数组。 let arr1 Array.of(1, 2, 3); // [1, 2, 3] let arr2 Array.from(hello); // [h, e, l, l, o]添加/删除元素 push(): 在数组末尾添加一个或多个元素,返…

YOLOv8/v10项目使用教程

根据改好的YOLOv8.yaml改yolov10.yaml教程 打开ultralytics/cfg/models/v8路径,找到需要移植的yaml文件,从其中复制相关的模块。打开一个YOLOv10的yaml文件。 注释掉之前相应位置的模块,并粘贴上面复制的模块,完成。 其余使用步骤…

云原生面试

云原生面试 Kubernetes原理Kubernetes 如何保证集群的安全性。简述 Kubernetes 准入机制简述Kubernetes Secret 有哪些使用方式简述Kubernetes PodSecurityPolicy机制简述Kubernetes PodSecurityPolicy机制能实现哪些安全策略简述Kubernetes 网络策略原理简述Kubernetes 数据持…

基于SpringBoot+Vue的美容美发在线预约系统的设计与实现【附源码】

毕业设计(论文) 题目:基于SpringBootVue的美容美发在线预约系统的设计与实现 二级学院: 专业(方向): 班 级: 学 生: 指导教师&#xff…

072、对象的创建与调用方法

071、Python 类的定义 当我们定义好一个类后,肯定是为了使用其中的功能来解决某些问题的,那么如何使用呢? 首先就是需要通过类创建对象,也就是类的实例化(只有实例化后的对象才能够调用里面的属性和方法)…

Go 语言学习笔记之通道 Channel

Go 语言学习笔记之通道 Channel 大家好,我是码农先森。 概念 Go 语言中的通道(channel)是用来在 Go 协程之间传递数据的一种通信机制。 通道可以避免多个协程直接共享内存,避免数据竞争和锁的使用,从而简化了并发程…

【解决方案】Mysql 数据库千万数据插入脚本

一.背景 要做数据模拟,需要在测试环境创建7千万的流水数据,进行迁移的模拟动作。 二.具体代码 private static final String DB_URL "jdbc:mysql://IP:3306/twallet_dev?zeroDateTimeBehaviorconvertToNull&allowMultiQueriestrue&useAf…

《Mybatis-Plus》系列文章目录

什么是 MyBatis-Plus? Mybatis-Plus是一个在MyBatis基础上进行增强和扩展的开源Java持久层框架。 Mybatis-Plus(简称MP)旨在简化开发、提高效率,通过提供一系列便捷的功能和工具,大幅度减少开发人员编写重复代码的时…

element-ui 下拉菜单el-dropdown-item添加点击事件

使用element-ui下拉菜单组件Dropdown时绑定点击事件,事件不生效。 click 常见于其用在Vue中的事件绑定,而实际上是 v-on 的简写,而 v-on 则是对 vue 的事件体系封装之后的 API接口。 native修饰符用于处理DOM原生事件,由于组件 …

如何在web页面下做自动化测试?

自动化测试是在软件开发中非常重要的一环,它可以提高测试效率并减少错误率。在web页面下进行自动化测试,可以帮助我们验证网页的功能和交互,并确保它们在不同浏览器和平台上的一致性。本文将从零开始,详细介绍如何在web页面下进行…

10--7层负载均衡集群

前言:动静分离,资源分离都是在7层负载均衡完成的,此处常被与四层负载均衡比较,本章这里使用haproxy与nginx进行负载均衡总结演示。 1、基础概念详解 1.1、负载均衡 4层负载均衡和7层负载均衡是两种常见的负载均衡技术&#xff…

PHP 语言特定指南

PHP 语言特定指南 本指南将教您如何使用 Docker 创建容器化的 PHP 应用程序。通过本指南,您将学习如何: 容器化并运行一个 PHP 应用程序设置用于开发 PHP 应用程序的本地环境在容器内运行 PHP 应用程序的测试使用 GitHub Actions 配置容器化 PHP 应用程…

vite+vue3+ts项目搭建流程 (pnpm, eslint, prettier, stylint, husky,commitlint )

vitevue3ts项目搭建 项目搭建项目目录结构 项目配置自动打开项目eslint①vue3环境代码校验插件②修改.eslintrc.cjs配置文件③.eslintignore忽略文件④运行脚本 prettier①安装依赖包②.prettierrc添加规则③.prettierignore忽略文件④运行脚本 stylint①.stylelintrc.cjs配置文…

前端自动化

前端自动化的内容 自动化代码检查自动化测试自动化构建自动化部署自动化文档 前端自动化的最佳实践

基于改进YOLOv5的安全帽检测算法 | 引入Ghost卷积 + 添加CA注意力机制 + 更换Neck网络之BiFPN + 更换损失函数之WIoU

前言:Hello大家好,我是小哥谈。为了解决建筑工地、隧道、煤矿等施工场景中现有安全帽检测算法对于小目标、密集目标以及复杂环境下的检测精度低的问题,设计实现了一种基于YOLOv5的改进目标检测算法,记为YOLOv5-GBCW。首先使用Ghos…