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,一经查实,立即删除!

相关文章

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

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

一个实例配置多个服务名

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

YOLOv8/v10项目使用教程

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

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

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

Go 语言学习笔记之通道 Channel

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

《Mybatis-Plus》系列文章目录

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

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

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

10--7层负载均衡集群

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

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…

C语言 | Leetcode C语言题解之第166题分数到小数

题目: 题解: struct HashMapNode {int key;int val;UT_hash_handle hh; };struct HashMapNode* hashMap NULL;int hashMapAdd(int key, int val) {struct HashMapNode* node;HASH_FIND_INT(hashMap, &key, node);if(node ! NULL){return node->…

fiddler抓https包

1,安装fiddler省略 2,下载证书步骤:tools-options-https 点击确认,点击OK,点击是 把证书安装到谷歌浏览器上步骤:点击谷歌浏览器右上角的设置,在搜索框中搜索证书,点击“证书管理”…

从0搭建一个vue项目,不使用脚手架从html到vue

前言 从最开始学习web网页开始,搭建一个网页只需要创建一个html文件对其进行编写dom标签语言即可;后来分离了html,css和js,搭建一个网页开始需要文件夹,文件夹包含了这3类文件以及静态文件,图片&#xff0c…

【会议征稿】2024年应用计算智能、信息学与大数据国际会议(ACIIBD 2024,7月26-28)

2024年应用计算智能、信息学与大数据国际学术会议(ACIIBD 2024)将于2024年7月26-28日在中国广州举办。会议将聚焦于计算智能及其应用、信息、大数据等相关的研究领域, 广泛邀请国内外知名专家学者,共同探讨相关学科领域的最新发展…

26.高级特性(上)

目录 一、不安全的Rust二、不安全的超能力2.1 概念2.2 解引用裸指针2.3 调用不安全的函数或方法2.3 创建不安全代码的安全抽象2.4 使用extern函数调用外部代码2.5 访问或修改可变静态变量2.6 实现不安全trait2.7 访问联合体中的字段 三、高级trait3.1 关联类型在trait定义中指定…

【昇思初学入门】第七天打卡-模型训练

训练模型 学习心得 构建数据集。这通常包括训练集、验证集(可选)和测试集。训练集用于训练模型,验证集用于调整超参数和监控过拟合,测试集用于评估模型的泛化能力。 (mindspore提供数据集https://www.mindspore.cn/d…

使用Python和NLTK进行NLP分析的高级指南

在本文中,将利用数据集来比较和分析自然语言。 本文涵盖的基本构建块是: WordNet和同义词集相似度比较树和树岸命名实体识别 WordNet和同义词集 WordNet是NLTK中的大型词汇数据库语料库。WordNet维护与名词,动词,形容词&#…

Unity 弧形图片位置和背景裁剪

目录 关键说明 Unity 设置如下 代码如下 生成和部分数值生成 角度转向量 计算背景范围 关键说明 效果图如下 来自红警ol游戏内的截图 思路:确定中心点为圆的中心点 然后 计算每个的弧度和距离 Unity 设置如下 没什么可以说的主要是背景图设置 代码如下 …