(服务器&客户端)网络通信是怎么实现的?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;
      }
     }
  }
}

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


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

目录
相关文章
|
5月前
|
JSON 中间件 Go
Go 网络编程:HTTP服务与客户端开发
Go 语言的 `net/http` 包功能强大,可快速构建高并发 HTTP 服务。本文从创建简单 HTTP 服务入手,逐步讲解请求与响应对象、URL 参数处理、自定义路由、JSON 接口、静态文件服务、中间件编写及 HTTPS 配置等内容。通过示例代码展示如何使用 `http.HandleFunc`、`http.ServeMux`、`http.Client` 等工具实现常见功能,帮助开发者掌握构建高效 Web 应用的核心技能。
308 61
|
5月前
|
运维 网络协议 Go
Go网络编程:基于TCP的网络服务端与客户端
本文介绍了使用 Go 语言的 `net` 包开发 TCP 网络服务的基础与进阶内容。首先简述了 TCP 协议的基本概念和通信流程,接着详细讲解了服务端与客户端的开发步骤,并提供了简单回显服务的示例代码。同时,文章探讨了服务端并发处理连接的方法,以及粘包/拆包、异常检测、超时控制等进阶技巧。最后通过群聊服务端的实战案例巩固知识点,并总结了 TCP 在高可靠性场景中的优势及 Go 并发模型带来的便利性。
|
Ubuntu 网络协议 Unix
02理解网络IO:实现服务与客户端通信
网络IO指客户端与服务端通过网络进行数据收发的过程,常见于微信、QQ等应用。本文详解如何用C语言实现一个支持多客户端连接的TCP服务端,涉及socket编程、线程处理及通信流程,并分析“一消息一线程”模式的优缺点。
246 0
|
8月前
|
Java Linux 定位技术
Minecraft配置文件参数说明(JAVA服务器篇)
Minecraft JAVA版服务器启动后会生成server.properties配置文件,位于minecraft_server/根目录下。该文件包含多项关键设置,如游戏模式(gamemode)、最大玩家数(max-players)、难度(difficulty)等。此文档详细说明了各配置项的功能与默认值,帮助用户高效管理服务器环境。
1881 60
|
8月前
|
网络协议 物联网
VB6网络通信软件上位机开发,TCP网络通信,读写数据并处理,完整源码下载
本文介绍使用VB6开发网络通信上位机客户端程序,涵盖Winsock控件的引入与使用,包括连接服务端、发送数据(如通过`Winsock1.SendData`方法)及接收数据(利用`Winsock1_DataArrival`事件)。代码实现TCP网络通信,可读写并处理16进制数据,适用于自动化和工业控制领域。提供完整源码下载,适合学习VB6网络程序开发。 下载链接:[完整源码](http://xzios.cn:86/WJGL/DownLoadDetial?Id=20)
298 12
|
8月前
|
前端开发 Cloud Native Java
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
|
9月前
|
监控 Linux PHP
【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
267 20
|
9月前
|
网络协议 算法 安全
Go语言的网络编程与TCP_UDP
Go语言由Google开发,旨在简单、高效和可扩展。本文深入探讨Go语言的网络编程,涵盖TCP/UDP的基本概念、核心算法(如滑动窗口、流量控制等)、最佳实践及应用场景。通过代码示例展示了TCP和UDP的实现,并讨论了其在HTTP、DNS等协议中的应用。最后,总结了Go语言网络编程的未来发展趋势与挑战,推荐了相关工具和资源。
260 5
|
9月前
|
网络协议 测试技术 Linux
Golang 实现轻量、快速的基于 Reactor 模式的非阻塞 TCP 网络库
gev 是一个基于 epoll 和 kqueue 实现的高性能事件循环库,适用于 Linux 和 macOS(Windows 暂不支持)。它支持多核多线程、动态扩容的 Ring Buffer 读写缓冲区、异步读写和 SO_REUSEPORT 端口重用。gev 使用少量 goroutine,监听连接并处理读写事件。性能测试显示其在不同配置下表现优异。安装命令:`go get -u github.com/Allenxuxu/gev`。
187 0
|
9月前
|
监控 关系型数据库 MySQL
【01】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-硬件设备实时监控系统运营版发布-本产品基于企业级开源项目Zabbix深度二开-分步骤实现预计10篇合集-自营版
【01】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-硬件设备实时监控系统运营版发布-本产品基于企业级开源项目Zabbix深度二开-分步骤实现预计10篇合集-自营版
238 0

热门文章

最新文章