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

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

在这里插入图片描述

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

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

本文由 秩沅 原创

收录于专栏 java

⭐java网络编程技术⭐
-


@[TOC]


👨‍💻一,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;
      }
     }
  }
}

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


你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!

目录
相关文章
|
1月前
|
Java
Java开发实现图片URL地址检验,如何编码?
【10月更文挑战第14天】Java开发实现图片URL地址检验,如何编码?
65 4
|
22天前
|
Java 程序员
JAVA程序员的进阶之路:掌握URL与URLConnection,轻松玩转网络资源!
在Java编程中,网络资源的获取与处理至关重要。本文介绍了如何使用URL与URLConnection高效、准确地获取网络资源。首先,通过`java.net.URL`类定位网络资源;其次,利用`URLConnection`类实现资源的读取与写入。文章还提供了最佳实践,包括异常处理、连接池、超时设置和请求头与响应头的合理配置,帮助Java程序员提升技能,应对复杂网络编程场景。
47 9
|
22天前
|
人工智能 Java 物联网
JAVA网络编程的未来:URL与URLConnection的无限可能,你准备好了吗?
随着技术的发展和互联网的普及,JAVA网络编程迎来新的机遇。本文通过案例分析,探讨URL与URLConnection在智能API调用和实时数据流处理中的关键作用,展望其未来趋势和潜力。
41 7
|
22天前
|
Java 开发者
JAVA高手必备:URL与URLConnection,解锁网络资源的终极秘籍!
在Java网络编程中,URL和URLConnection是两大关键技术,能够帮助开发者轻松处理网络资源。本文通过两个案例,深入解析了如何使用URL和URLConnection从网站抓取数据和发送POST请求上传数据,助力你成为真正的JAVA高手。
41 11
|
22天前
|
JSON 安全 算法
JAVA网络编程中的URL与URLConnection:那些你不知道的秘密!
在Java网络编程中,URL与URLConnection是连接网络资源的两大基石。本文通过问题解答形式,揭示了它们的深层秘密,包括特殊字符处理、请求头设置、响应体读取、支持的HTTP方法及性能优化技巧,帮助你掌握高效、安全的网络编程技能。
44 9
|
26天前
|
Web App开发 缓存 网络协议
不为人知的网络编程(十八):UDP比TCP高效?还真不一定!
熟悉网络编程的(尤其搞实时音视频聊天技术的)同学们都有个约定俗成的主观论调,一提起UDP和TCP,马上想到的是UDP没有TCP可靠,但UDP肯定比TCP高效。说到UDP比TCP高效,理由是什么呢?事实真是这样吗?跟着本文咱们一探究竟!
51 10
|
22天前
|
JSON Java API
JAVA网络编程新纪元:URL与URLConnection的神级运用,你真的会了吗?
本文深入探讨了Java网络编程中URL和URLConnection的高级应用,通过示例代码展示了如何解析URL、发送GET请求并读取响应内容。文章挑战了传统认知,帮助读者更好地理解和运用这两个基础组件,提升网络编程能力。
40 5
|
1月前
|
存储 网络协议 前端开发
在 Java 中如何完全验证 URL
在 Java 中如何完全验证 URL
83 8
|
1月前
|
运维 Java Linux
【运维基础知识】Linux服务器下手写启停Java程序脚本start.sh stop.sh及详细说明
### 启动Java程序脚本 `start.sh` 此脚本用于启动一个Java程序,设置JVM字符集为GBK,最大堆内存为3000M,并将程序的日志输出到`output.log`文件中,同时在后台运行。 ### 停止Java程序脚本 `stop.sh` 此脚本用于停止指定名称的服务(如`QuoteServer`),通过查找并终止该服务的Java进程,输出操作结果以确认是否成功。
37 1
|
1月前
|
分布式计算 资源调度 Hadoop
大数据-01-基础环境搭建 超详细 Hadoop Java 环境变量 3节点云服务器 2C4G XML 集群配置 HDFS Yarn MapRedece
大数据-01-基础环境搭建 超详细 Hadoop Java 环境变量 3节点云服务器 2C4G XML 集群配置 HDFS Yarn MapRedece
77 4