【Java网络编程】二
本文主要介绍了传输层的UDP协议和TCP协议,以及在Java中如何通过Socket套接字实现网络编程(内附UDP和TCP版本的回显服务器代码)
一.网络通信
网络编程,就是写一个应用程序,让这个程序可以使用网络通信,这里就需要调用传输层提供的api了。
严格的来说,两台主机进行通信就是两台主机中的应用进程进行通信。
通信的两端应该是两个主机中的应用进程。
端到端的通信是应用进程之间的通信。
传输层和网络层的区别
网络层为主机之间的通信提供服务;
运输层在网络层的基础上,为应用进程提供通信服务;
二.传输层协议
传输层协议,主要有两个:
1.UDP 用户数据报协议
2.TCP传输控制协议
提供了两套不同的api,也叫做socket 套接字。
UDP和TCP对比:
UDP:无连接,不可靠传输,面向数据报,全双工
TCP:有连接,可靠传输,面向字节流,全双工
注意:
有连接就相当于使用一块内存来保存对端的信息,双方都保存这个信息,此时连接就出现了。
可靠传输,并不是说A发给B的消息百分百能到达,而是A尽可能地把消息传给B,并且在传输失败地时候,A可以感知到,或者传输成功地时候,也可以知道自己成功了
TCp是可靠传输,但是传输效率降低了
UDp是不可靠传输,但传输效率更高
并且这也不意味着,TCP更安全,网络安全更多指的是数据是否容易被黑客截获
面向字节流 VS 面向数据报
TCP 和文件操作类似,都是流式的,而且传输的单位是字节,故称字节流
UDP面向数据报,读写的基本单位是一个UDP数据报
全双工 VS 半双工
全双工:一个通道,可以双向通信(双向车道)
半双工:一个通道,只能单向通信(单向车道)
再比如:网线也是全双工的,通常来说,网线一般有八根铜缆,四四一组,一部分负责一个方向,另一部分则负责另一个方向。
三.UDP数据报协议
Java对于UDP的socket api,有两个核心的类:
1.DatagramSocket
是一个Socket对象
注意:操作系统,使用文件这样的概念来管理一些软硬件资源
对于网卡(计算机和外界局域网连接的网络设备) --> 操作系统也是使用 文件 的方式来管理网卡的
表示网卡的这类文件,就是socket文件
Java中的socket对象,就对应系统里的socket文件(最终还是要落到网卡)
结论:要进行网络通信,就必须调用网卡;
调用网卡,就必须先创建socket对象;
创建socket对象:
构造方法:
1没有参数 DatagramSocket()
在客户端这边使用(客户端使用哪个端口,系统自动分配)
2有参数 DatagramSocket(int port)
在服务器这边使用(服务器使用哪个端口,手动指定)
说明:
服务器:需要有一个固定的端口号,方便其他客户端找到
比如,食堂的16号窗口,就相当于服务器的IP地址和端口号,此时有一个同学来食堂16号窗口吃饭,它坐的位置不需要是固定的,这就相当于是是客户端端口号。
客户端:主机上面运行的程序很多,我们不知道手动指定的端口是不是被别的程序占用了,因此更合理的做法是让系统自动分配一个空闲的端口号。
其他方法:
- receive(DatagramPacket p) 接收
- send (DatagramPacket p)发送
Close 关闭
2.DatagramPacket
表示一个UDP数据报
代表了系统中设定的UDP数据报的二进制结构
构造方法:
说明:作为UDP数据报,必然要承载一些数据,通过手动指定的byte[]作为存储数据的空间。
其他方法:
3.回显服务器
回显服务器:客户端发什么,服务器就返回什么。
>服务器代码:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;/*** 实现一个回显服务器* 客户端发什么,服务器返回什么**/public class UdpEchoServer {private DatagramSocket socket=null;public UdpEchoServer(int port) throws SocketException {socket=new DatagramSocket(port);}/*** 启动服务器** 反复的长期的执行* @param*/public void start() throws IOException {System.out.println("服务器启动");while(true){//1读取请求,并解析/*** receive的参数是datagramPacket,是一个输出型参数,传入的receive是一个空的对象,receive内部会把这会填充这个对象当执行完就会得到一个转满内容的打他gramPacket*/DatagramPacket requestPacket=new DatagramPacket(new byte[4096],4096);/**datagrampacket对象是用来保存数据的内存时间,需要手动指定,不像集合类,内部可以自己管理内存第二个参数可以随便写,不能写太大。如果客户端的请求还没来,receive就会阻塞等待,直到有客户端发起请求过来了*/socket.receive(requestPacket);/*** 获得请求的内容* 这样的转字符串的前提是,后续客户端发起的数据就是一个文本的字符串**/String request=new String(requestPacket.getData(),0, requestPacket.getLength());//2根据请求,计算出相应(回显服务器,请求是啥,返回就是啥)/*** 由于是回显服务器,请求是啥,响应就是啥*/String response=process(request);//3把响应写给客户端/*** 此时需要告诉网卡,要发的内容是啥,要发给谁* 构造一个datagramPacket对象,把响应发给客户端*/DatagramPacket responsePacket=new DatagramPacket(response.getBytes(),response.getBytes().length,requestPacket.getSocketAddress());/*** 把数据包发给客户端,就需要直到客户端的ip和端口* datagrampacket这个对象里面包含着通信双方的ip和port*/socket.send(responsePacket);//打印日志信息System.out.printf("%s:%d req:%s,resp:%s \n",requestPacket.getAddress().toString(),responsePacket.getPort(),request,response);}}//根据请求计算响应public String process(String request){return request;}public static void main(String[] args) throws IOException {UdpEchoServer server=new UdpEchoServer(9090);server.start();}
}
>客户端代码:
import java.io.IOException;
import java.net.*;
import java.util.Scanner;/*** 实现一个udp的回显服务器* 客户端**/public class UdpEchoClient {private DatagramSocket socket=null;private String serverIp;private int serverPort;//服务器的ip和服务器的端口public UdpEchoClient(String ip,int port) throws SocketException {serverIp=ip;serverPort=port;//这个new操作,就不用再指定端口了,让系统自动分配一个空闲端口socket=new DatagramSocket();}/*** 让这个客户端反复的从控制台读取用户输入的内容,把这个内容构造成udp请求,发给服务器,再读取* 服务器返回的udp响应* 最终再显示在客户端的屏幕上*/public void start() throws IOException {System.out.println("客户端启动");Scanner scanner=new Scanner(System.in);while(true){//1.从控制台读取用户输入的内容System.out.println("->");String request=scanner.next();//2.构造请求对象,并发送给服务器DatagramPacket requestPacket=new DatagramPacket(request.getBytes(),request.getBytes().length,InetAddress.getByName(serverIp),serverPort);socket.send(requestPacket);//3.读取服务器的响应,并解析出响应内容DatagramPacket responsePacket=new DatagramPacket(new byte[4096],4096);socket.receive(responsePacket);String response=new String(responsePacket.getData(),0,responsePacket.getLength());//显示到屏幕上System.out.println(response);}}public static void main(String[] args) throws IOException {//云服务器ip地址
// UdpEchoClient client=new UdpEchoClient("8.130.66.119",9090);UdpEchoClient client=new UdpEchoClient("127.0.0.1",9090);client.start();}
}
另外,我们也可以把服务器代码打一个jar包,放到云服务器上,然后访问云服务器的地址ip地址。
IDEA手动打包方式:
1.
2.
3.选择入口类,选择jar包存放的路径,jar包就生成了
后面可以用Mobaxterm把这个jar包放到云服务器上去.....就不演示了
四.TCP传输控制协议
TCP提供的api也是主要的两个类
1.ServerSocket
给服务器使用的socket
2.Socket
既会给服务器使用,也会给客户端使用
TCP版本的回显服务器代码放在 【Java网络原理】三
相关文章:

【Java网络编程】二
本文主要介绍了传输层的UDP协议和TCP协议,以及在Java中如何通过Socket套接字实现网络编程(内附UDP和TCP版本的回显服务器代码) 一.网络通信 网络编程,就是写一个应用程序,让这个程序可以使用网络通信,这里就…...

通过IP地址可以做什么
通过IP地址可以做很多事情,因为它是互联网通信的基础之一。本文将探讨IP地址的定义、用途以及一些可能的应用。 IP地址的用途 1. 设备标识:IP地址用于标识互联网上的每个设备,这包括计算机、服务器、路由器、智能手机等。它类似于我们日常生…...
前端 CSS 经典:clip、clip-path
1. clip 1.1 clip: auto | inherit | rect auto:默认,不裁剪 inherit:继承父级 clip 属性 rect:规则四边形裁剪 1.2 clip: rect(top, right, bottom, left) 注意: 1.裁剪只对 fixed 和 absolute 的元素有效。 2.top&…...

android 如何判断已配对的蓝牙是否打开了互联网访问开关
最近遇到一个需求,要判断已配对的蓝牙是否打开了互联网访问的开关。 经查看源码,得出以下方法。 1. 首先要判断蓝牙是否打开 2. 已打开的蓝牙是否已配对 3. 验证是否真正打开 /*** 是否打开蓝牙互联网访问*/SuppressLint("MissingPermission&quo…...

在Linux上实现ECAT主站
在Linux上实现ECAT主站 引言介绍EtherCATSOEM 使用下载ECAT主站编译 引言 EtherCAT由一个主站设备和多个从站设备组成。主站设备使用标准的以太网控制器,具有良好的兼容性,任何具有网络接口卡的计算机和具有以太网控制的嵌入式设备都可以作为EtherCAT的…...

Spring Cloud之服务熔断与降级(Hystrix)
目录 Hystrix 概念 作用 服务降级 简介 使用场景 接口降级 服务端服务降级 1.添加依赖 2.定义接口 3.实现接口 4.Controller类使用 5.启动类添加注释 6.浏览器访问 客户端服务降级 1.添加依赖 2.application.yml 中添加配置 3.定义接口 4.Controller类使用 …...
HashMap 哈希碰撞、负载因子、插入方式、扩容倍数
HashMap 怎么解决的哈希碰撞问题? 主要采用了链地址法。具体来说: 每个哈希桶不仅存储一个键-值对,而是存储一个链表或树结构。这样,具有相同哈希值的键-值对可以被存储在同一个哈希桶中,并通过链表或树结构来解决碰…...

【Unity3D】Unity与Android交互
1 Unity 发布 apk 1.1 安装 Android Build Support 在 Unity Hub 中打开添加模块窗口,操作如下。 选择 Android Build Support 安装,如下(笔者这里已安装过)。 创建一个 Unity 项目,依次点击【File→Build Settings→…...

信号去噪算法
引言 在实际世界中,我们所获得的信号通常都包含了各种干扰和噪音。这些噪音可能来自电子设备、环境条件或传感器本身,它们会损害信号的质量,降低信息提取的准确性。因此,信号去噪和降噪技术在科学、工程和医学领域中扮演着至关重…...
GPT带我学-设计模式-10观察者模式
1 请你介绍一下观察者模式 观察者模式(Observer Pattern)是一种设计模式,它定义了对象之间的一对多依赖关系,当一个对象(被观察者)的状态发生改变时,所有依赖于它的对象(观察者&…...
JDK - 常用的设计模式
单例模式 : Runtime 类:Java 运行时环境是单例的,可以通过 Runtime.getRuntime() 方法获得实例。Calendar 类:Calendar.getInstance() 方法返回的是一个单例的 Calendar 实例。数据源连接池:连接池的管理通常采用单例模…...
华为OD机考算法题:寻找最大价值的矿堆
题目部分 题目寻找最大价值的矿堆难度难题目说明给你一个由 0(空地)、1(银矿)、2(金矿)组成的的地图,矿堆只能由上下左右相邻的金矿或银矿连接形成。超出地图范围可以认为是空地。 假设银矿价值…...

wf-docker集群搭建(未完结)
系列文章目录 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 系列文章目录前言一、redis集群二、mysql集群三、nacos集群1. 环境要求2. 拉取镜像2.1. 拉取镜像方式配置集群2.2. 自定义nacos镜像配置集群 3 自定义…...
uni-app 在 APP 端的版本强制更新与热更新
整包更新与热更新的区别 ① 整包更新是指下载完整 apk 文件进行覆盖安装 ② 热更新是指把 app 有改动的地方打包进 wgt 文件,只更新 wgt 文件中的内容,不进行整包安装,在用户视角也叫做省流量更新 版本号规则约束 建议严格遵循 Semantic …...

实在智能受邀参加第14届珠中江数字化应用大会,AI赋能智能制造,共话“湾区经验”
制造业是实体经济的主体,是技术创新的主战场,是供给侧结构性改革的重要领域。抢占新一轮产业竞争制高点,制造业的数字化转型已成为行业升级的必由之路。 10月21日,第14届“珠中江”(珠海、中山、江门)数字…...
Qt 窗口的尺寸
默认尺寸 对于一个Qt的窗口(继承于QWidget),获取其窗体尺寸的方法size(); 以一个Qt创建Qt Widgets Application项目的默认生成代码为基础,做如下测试 MainWindow::MainWindow(QWidget *parent): QMainWindow(parent…...

游戏数据分析对于运营游戏平台的重要性
游戏数据分析对于运营游戏平台具有至关重要的意义,它可以提供深入的见解,帮助了解玩家行为、偏好和互动,从而优化游戏体验,提高玩家参与度和留存率。 首先,通过游戏数据分析,运营者可以了解玩家在游戏中的表…...

微信群发消息的正确打开方式,让你的社交更高效!
在当今的社交媒体时代,微信已经成为了我们生活中必不可少的一部分。而微信的群发消息功能,让我们可以方便地将信息一次性发送给多个联系人。然而,微信的群发消息功能有一个限制,即每次只能群发200个联系人。这对于需要发送消息给大…...

HTML5语义化标签 header 的详解
🌟🌟🌟 专栏详解 🎉 🎉 🎉 欢迎来到前端开发之旅专栏! 不管你是完全小白,还是有一点经验的开发者,在这里你会了解到最简单易懂的语言,与你分享有关前端技术和…...

SpringCloud复习:(2)@LoadBalanced注解的工作原理
LoadBalanced注解标记了一个RestTemplate或WebClient bean使用LoadBalancerClient来进行负载均衡。 LoadBalancerAutoConfiguration类给带注解的RestTemplate添加了拦截器:LoadBalancerInterceptor. 具体流程如下: 首先定义一个LoadBalancerInterceptor…...

测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...

python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...

循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...

USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...