(服务器客户端)网络通信是怎么实现的?7000字爆肝----原来java网络编程技术功不可没(多线程,URL,InetAddressm,TCP,UDP)集结

news2024/10/5 23:28:27

在这里插入图片描述

👨‍💻个人主页:@元宇宙-秩沅

hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!

本文由 秩沅 原创

收录于专栏 java

⭐java网络编程技术⭐


文章目录

    • ⭐java网络编程技术⭐
  • 👨‍💻一,URL类
    • 👨‍💻概念
  • 👨‍💻二,InetAddress类
  • 👨‍💻三,套接字
    • 👨‍💻概念
    • 👨‍💻套接字连接示意图
    • 👨‍💻客户端套接字
    • 👨‍💻服务器端套接字
    • 👨‍💻客户端和服务器的连接关系
  • 👨‍💻三,多线程技术
  • 👨‍💻四,UDP数据报--基于UDP协议
    • 👨‍💻概述
    • 👨‍💻发送数据包
    • 👨‍💻接收数据包
  • 五,服务端和客户端的连接应用代码
    • 👨‍💻👍


👨‍💻一,URL类


👨‍💻概念


👍1. 是java.net包中一个重要的类

👍2. 一个URL对象通常包含:协议,地址,资源 三部分

👍3. HTTP协议

在这里插入图片描述


👨‍💻二,InetAddress类


InetAddress类包括下面两个表示地址的方式描述
域名如:www.csdn.com
IP地址如:127.0.0.1
在这里插入图片描述

👍1.获取Internet上主机的地址

在这里插入图片描述

👍2.获取本地

在这里插入图片描述

👍3,输入域名可以对应推出IP地址,但输入IP地址不能得出域名,DNS正向解析无反向解析


👨‍💻三,套接字



👨‍💻概念


👍1.当两个程序需要通信时,它们可以通过使用Socket类 建立套接字对象,并连接在一起

👍2.端口号的范围在: 0~65535之间

在这里插入图片描述


👨‍💻套接字连接示意图


在这里插入图片描述


👨‍💻客户端套接字


👍1,客户端的程序使用 Socket类 建立负责连接到服务器的套接字对象

👍2.构造方法–参数为 服务器 的IP地址

在这里插入图片描述

👍3.和mysocket的相关方法

在这里插入图片描述


👨‍💻服务器端套接字


👍1.建立ServerSocket对象

作用连接客户端套接字对象 和 服务器端 一个套接字对象
特点ServerSocket对象不能重复创建,除非更换端口号

👍2.建立ServerSocket对象语句

在这里插入图片描述

👍3.具体是使用该对象的方法accept():来达到连接客户的套接字 和 服务器端 的套接字

在这里插入图片描述

👍4.所谓“接收”客户的套接字连接:

  • 就是 accept( )方法会返回 Socket对象 - 该对象和客户端的Socket对象是连接关系

👨‍💻客户端和服务器的连接关系


👍客户端Socket对象, 获得的 输入流 和 服务端Socket对象, 获得的 输出流 相互连接 ,反之亦然

在这里插入图片描述


👨‍💻三,多线程技术


👍1.为了防止堵塞线程,服务器端收到一个客户得套接字后,就应该启动一个专门为该客户服务线程

👍2.客户用Socket类构建了mySocket套接字对象之后,该对象需调用,connect()方法;
目的是和套接字进行连接;

在这里插入图片描述

👍3.为了使用connect()方法,要使用SocketAddress类 的子类 InetSocketAddress 创建一个对象,
InetSocketAddress的构造方法是:

在这里插入图片描述

👍4.具有多线程的服务器程序图

在这里插入图片描述
注意:开套接字要在try里面


👨‍💻四,UDP数据报–基于UDP协议



👨‍💻概述


👍UDP传递信息 更快但是不保证可靠性

👍什么时候使用 : 急切地发送消息的情况使用

👍一般不可靠


👨‍💻发送数据包


👍1.用DatagramPacket类将数据打包

既用该类创建一个对象,称为数据包

以下两个构造方法创建待发送的数据包。

DatagramPacket(byte datal ],int length, InetAddress address,int port)

使用第一个构造方法创建的数据包对象具有下列两个性质:

  • 含有data数组指定的数据。
  • ·该数据包将发送到地址是address、端口号是 port的主机上。称address是这个数据包的目标地址,port是它的目标端口。

DatagramPack(byte data[ ], int offset, int length, InetAddress address, int port)

  • 使用第二个构造方法创建的数据包对象含有数组 data 中从 offset开始的length个字该数据包将发送到地址是address、端口号是port的主机上。

例如:
byte data[]="生日快乐".getByte();
InetAddress address=InetAddress, getName(“www. china.com. cn”) ;
DatagramPacketdat_pachnewDatagramPacket(data, data. length, address,
2009);
注:对于用上述方法创建的用于发送的数据包,data pack 调用方法 public int getPo


👨‍💻接收数据包


👍1.用DatagramSocket的另一个构造方法DatagramSocket(int port)创建一个对象

  • 其中的参数必须和待接收的数据包的端口号相同。

例如,如果发送方发送的数据包的端口是5666,那么如下创建DatagramSocket对象:
DatagramSocket mail_in=new DatagramSocket(5666);

  • 然后对象mail_in使用方法receive(DatagramPacket pack)接受数据包。

用DatagramPack类的另外一个构造方法:
DatagramPack(byte data|l,int length)

  • 创建一个数据包,用于接收数据包,

例如:
byte data[]=new byte[100];
int length=90:
DatagramPacket pack=new DatagramPacket(data,length);
mail_in.receive(pack);
-该数据包pack将接收长度是length字节的数据放入data。


五,服务端和客户端的连接应用代码


👨‍💻👍

1.客户端类

Client.java
import java.io.*;
import java.net.*;
import java.util. *;
public class Client {
public static void main(String args[]){

Scanner scanner = new Scanner(System. in);
Socket mysocket= null;    //声明套接字对象
DataInputStream in=null;   // 输入流数据
DataOutputStream out=null; //  输出流数据
Thread readData;          //   线程
Read read=null;
try{ mysochcket = new Socket();
read = new Read();
readDatata = newad(read);
//负责读取信息的线程
System.out.print("输入服务器的IP:");
String IPg IP = scannextLine(); 
System.out.print("输入端口号:");
int port=anner.nextInt();
ort = scanne
if(mysocket.isConnected()){}
else{
InetAddress address=InetAddress.getByName(IP);
InetSocketAddress socketAddress = new InetSocketAddress
(address,port);
mysocket.connect(socketAddress);
in = new DataInputStream(mysocket. getInputStream());
out = new DataOutputStream(mysocket.getOutputStream());
read.setDataInputStream(in);
readData.start();
//启动负责读取信息的线程 ,随即run方法也会随着其一同运行
}
catch(Exception e){
System.out.println("服务器已断开""+e);
}
System.out.print("输入圆的半径(放弃请输入N):");
while(scanner.hasNext()){
ius=0;double radius=
try{
radius=s = scanner.nextD
}
catch(InputMismatchException exp){
System.exit(0);
}
try{
out.writeDouble(radius);
//向服务器发送信息
}
catch(Exception e){}
}
}
}

2.中介消息Read类

Read.java
import java.io.*;
public class Read implements Runnable{
DataInputStream in;
public void setDataInputStream(DataInputStream in){
this.in= in;
}
public void run() {
double result = 0;
while(true){
try{ result = in.readDouble();
//读取服务器发送来的信息
System.out.println("圆的面积:"+result)
System.out.print("输入圆的半径(放弃请输入N):");
}
catch(IOException e){
System.out.println("与服务器已断开"+e);
break;
}

3.服务器类

import java.io.*;
import java.net. *;
import java. util.*;
public class Server {
public static void main(String args[ ]) {
ServerSocket server = null;
ServerThread thread;
Socket you=null;
while(true){
try{ server = new ServerSocket(2010);
}
catch(I0Exception e1){
//ServerSocket 对象不能重复创建,除非更换端口号
System.out.println("正在监听");
}
tryl System,out.println(“等待客户呼叫");
you = server,accept();
System.out.println(*客户的地址:"*you.getInetAddress());
}
catch(I0Exception e){
System.out.println("正在等待客户");
{
if(you!=null){
new ServerThread(you).start();
//为每个客户启动一个专门的线程
    }
  }
 }class ServerThread extends Thread{
Socket socket;
DataOutputStream out = null;
DataInputStreamin=null;
String s=null;
ServerThread(Socket t) {
socket=t;
try { out = new DataOutputStream(socket.getOutputStream());
in = new DataInputStream( socket. getInputStream());
}
catch(IOException e){}
}
public void run() {
while(true){
try{double r= in.readDouble();
//堵塞状态,除非读取到信息
double area = Math. PI * r*r;
out.writeDouble(area);
}
catch(IOException e) {
System.out.println("客户离开");
return;
      }
     }
  }
}


👨‍💻博主专属私人入口莫点🤭


你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!
在这里插入图片描述

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

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

相关文章

[附源码]Python计算机毕业设计Django的4s店车辆管理系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

虎牙、斗鱼同道同命:共同御寒

配图来自Canva可画 回顾游戏直播行业过去十年,先是直播行业野蛮发展玩家快速跑马圈地,而后历经千播大战形成斗鱼、虎牙分天下的市场格局,现在头部平台进入精细化、多元化运作阶段,市场竞争愈加激烈。 也就是说,游戏直…

4G DTU能装4G物联网卡吗?

科技的发展日新月异,我们国家的发展战略也是支持高新科技公司的发展,所以越来越多的高新科技公司出现,但凡是高新科技公司,在设备的联网中,都会用到物联卡,所以物联卡的市场也愈发火爆,那么今天…

食物链【并查集+不知道1是A,B,C哪一类的?用x,x+n,x+n+n分别表示A,B,C中有个1】【并查集中用距离表示关系】【压缩路径】

欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录) 文章字体风格: 红色文字表示:重难点 蓝色文字表示:思…

jenkins项目构建类型 -----Pipeline流水线项目构建

壹,概念 pipeline 是一套运行在jenkins上得工作流框架,将原本运行于单个或者多个节点得任务连接起来,用来实现单个任务难以完成得复杂流程编排和可视化得工作。 贰 优点 代码持久可停止多功能可扩展 叁 如何创建Jenkins Pipeline pipeli…

计算机物联网控制|5.5常规控制方案 5.6先进控制方案

11.16日课堂作业 1.已知模拟PID算式为 试推导差分增量算式。 2.PID参数Kc、Ti、Td对系统动态特性和稳态特性有何影响? 目录 11.16日…

[附源码]计算机毕业设计springboot高校实验室仪器设备管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

Telemetry原理

Telemetry是一种网络设备监控技术,提供周期采样网络设备内的统计数据和状态数据的能力。 一、Telemetry概述 1.1、技术背景: 网络设备的统一监控和性能管理是运维平台的重要功能,设备的监控数据包括数据、控制和管理平面数据。 获取设备监…

学习Python的8天

1、异常处理机制 Python 中,用try except语句块捕获并处理异常,其基本语法结构如下所示: try:可能产生异常的代码块 except [ (Error1, Error2, ... ) [as e] ]:#(e是别名,可以自己起)处理异常的代码块1 except [ (Error3, Error…

【强化学习论文合集 | 2020年合集】一. ICML-2020 强化学习论文

强化学习(Reinforcement Learning, RL),又称再励学习、评价学习或增强学习,是机器学习的范式和方法论之一,用于描述和解决智能体(agent)在与环境的交互过程中通过学习策略以达成回报最大化或实现特定目标的问题。 本专栏整理了近几年国际顶级会议中,涉及强化学习(Rein…

Workfine使用Oracle Express Edition数据库

Workfine 应用环境和工具 Win10 专业版操作系统Windows Terminaldocker desktop 4.10.1 安装设置Oracle Express Edition数据库 1、获取Oracle XE 18.4.0 docker 镜像,在 Windows Terminal 终端里执行如下命令 docker pull gvenzl/oracle-xe:18.4.0 2、下载成功…

小啊呜产品读书笔记001:《邱岳的产品手记-14》第26讲 写好产品文档的诀窍 第27讲 产品案例分析: QuartzHooked的对话式交互

小啊呜产品读书笔记001:《邱岳的产品手记-14》第26讲 写好产品文档的诀窍 & 第27讲 产品案例分析: Quartz&Hooked的对话式交互一、今日阅读计划二、泛读&知识摘录1、第26讲 写好产品文档的诀窍2、第27讲 产品案例分析: Quartz&am…

web前端-javascript-function函数(函数说明,创建和调用函数,其他方法函数声明创建函数、函数表达式创建函数)

函数 //var fun new Function("console.log(Hello 这是我的第一个函数);"); //fun();function fun2() {console.log("这是我的第二个函数");alert("哈哈哈哈");document.write("~~~~(>_<)~~~~"); }//console.log(fun2); //调用…

[附源码]计算机毕业设计springboot惠农微信小程序论文

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Nginx加载Lua脚本lrucache缓存

1、简介 lrucache缓存是单进程的&#xff0c;就像redis一样&#xff0c;所以不需要锁。 2、nginx配置 #lua_code_cache off; # 把这个缓存打开&#xff0c;因为里面的在new对象的时候&#xff0c;只允许实例一个对象&#xff0c;如果不打开的话 # 每次次请求会创建一个对象&a…

RK3588平台开发系列讲解(DisplayPort篇)DP相关模式说明

平台内核版本安卓版本RK3588Linux 5.10Android12🚀返回专栏总目录 文章目录 一、DP Alt Mode二、DP Legacy Mode2.1、Controller2.2、PHY三、Split Mode沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍DP的相关模式。

KNN最近邻算法分析及实现(Python实现)

KNN最近邻算法分析及实现&#xff08;代码附录后文&#xff09;1 KNN算法简介2 KNN基本原理3 简单实现KNN分析代码附录(Python)&#xff1a;呆&#xff0c;站住别跑&#xff0c;留个赞&#xff0c;给个关注嘛都看到这了Author&#xff1a; Nirvana Of Phoenixl Proverbs for yo…

Mysql视图和触发器

视图 视图是什么&#xff0c; 是否真实存在? 个人理解&#xff1a;视图视图&#xff0c;只是你可以看见的一层抽象层, 它并不真实存在, 而是在真实存在的一张或者多张表之上的一层封装, 对于select查询语句的提前封装. 不涉及数据的存储. 这样的一层封装好处是蛮多的. 对于…

Kamiya丨Kamiya艾美捷小鼠转铁蛋白ELISA说明书

Kamiya艾美捷小鼠转铁蛋白ELISA预期用途&#xff1a; 小鼠转铁蛋白ELISA是一种高灵敏度的双位点酶联免疫分析&#xff08;ELISA&#xff09;小鼠生物样品中转铁蛋白的测定。仅供研究使用。 引言 转铁蛋白是一种金属结合蛋白&#xff0c;可逆地与血浆中的酸溶性铁结合。它的功…

python中json的使用dump,dumps,loads,load简单了解

参考&#xff1a;https://www.runoob.com/python3/python3-json.html&#xff0c;https://zhuanlan.zhihu.com/p/264393909 json的作用 JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式 &#xff08;图片是参考链接中的图片&#xff09; json.dumps(): 对数据…