IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 算法设计与应用1-3 客户端-服务器(Client-Server)框架 -> 正文阅读

[网络协议]算法设计与应用1-3 客户端-服务器(Client-Server)框架

专栏:算法设计与应用

1.3 客户端-服务器(Client-Server)框架

网络通信

网络中的每台机器都有一个唯一的IP地址,例如156.62.1.12
也有一个更方便的字符串主机名,如cache.aut.ac.nz
特殊地址127.0.0.1或localhost为本地环回地址
网络通信分层
每一层协议都使用它下面的一种协议
大多数软件应用程序只直接利用传输层或应用层的协议

TCP对UDP

传输控制协议(TCP)

  • 当需要可靠的通信时,所有的数据都被传输(否则报告错误)
  • 数据接收顺序与发送顺序相同
  • 以无限字节流发送的数据
  • 用于HTTP、FTP等可靠的应用层协议

用户数据报协议(UDP)
?用于需要低开销(低延迟)通信
?不保证可靠性或交货顺序
?以有限大小的独立数据包发送和接收的数据
?用于VOIP、RTP等低延迟应用层协议

TCP、UDP端口

两个重要的传输层协议

  • 传输控制协议(TCP)
    • 用户数据报协议(UDP)
    • TCP和UDP都使用端口的概念
  • 端口用于区分机器上哪个运行的应用程序应该接收TCP或UDP通信
    • 允许一台机器上的多个应用程序同时进行联网
    • 使用TCP或UDP的应用程序与另一台机器指定接收机器的IP地址(或主机名)和端口号
  • 端口只是整数0,…,65535
    • 它们不是任何物理的东西
    • 一些端口号是保留给常见的应用程序,如7为ECHO, 13为白天,20-21为FTP, 80或8080为HTTP, 81或8181为HTTPS

Java API

  • Java在java.net包中使用套接字的网络概念提供了方便的网络API
  • SocketServerSocket用于TCP通信,以获取InputStream
  • OutputStream用于通过TCP接收和发送数据
  • DatagramSocket用于UDP通信发送和接收DatagramPacket
  • URL可以用于HTTP/HTTPS通信

Client-Server框架

  • Client-Server Framework是一种描述客户端如何与服务器通信的模式
    • 架构模式描述了如何在应用程序中组织模块/类
    • 客户端Client总是通过请求发起通信,服务器响应请求
  • 服务器最初准备一个服务器套接字侦听端口号
    • 服务器套接字只监听传入的连接请求,而不是通信本身
  • 客户端使用已知的服务器IP地址和端口号连接到服务器,服务器套接字接受连接
  • 每个端(客户端和服务器端)创建一个’套接字’来处理连接上的发送和接收通信
  • 多个客户端可以连接到相同的服务器套接字,每个客户端-服务器连接都有自己的套接字对Socket
    • 通常,服务器还会创建一个单独的线程来侦听每个连接上的传入通信(因为多个客户端可能同时通信)
  • 客户端最终可以“关闭”自己的连接
    • 注意这不会关闭服务器套接字

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZOfn8p66-1632818903393)(1%203%20Client-Server%20Framework%20ebe2dedd7c3a4942805d54982145f88f/Untitled%201.png)]

Java中的TCP客户端步骤

  • 启动连接
    • 客户端请求连接,指定服务器的IP地址和端口
socket = new socket (HOST_NAME, HOST_PORT); 
  • 获得Stream
    • 获得的输入和/或输出流(通常使用过滤流分层)
out = new PrintWriter(socket.getOutputStream()true); 

in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
  • 沟通
    • 客户端使用协议请求并等待服务器的回复
out.println(request);

String serverResponse = in.readLine();
  • 紧密联系
    • 当完成时,客户端关闭流,然后关闭套接字
`out.close ();
in.close ();
socket.close();

例子:猜数字游戏

  • GuessClientGuessServer(和内部类GuessGame)演示了使用客户端-服务器框架的简单网络应用程序
  • 每个客户端尝试猜测一个随机数,这是由服务器为该客户端确定的
  • GuessClient只知道GuessServer的IP地址和端口号(彼此之间没有对象引用)
  • 本例中的通信协议:
    • 一旦连接被接受,服务器开始发送一条消息“猜测m和n之间的数字(包括m和n)”
    • 客户端请求一个数字猜测
    • 服务器回复一个合适的消息
    • 继续请求/回复,直到服务器回复“正确的猜测!”,服务器和客户端都会
    • 闭该连接
  • 注意线程的使用
    • 服务器主线程在while循环中反复监听传入的连接请求
    • 当每个客户端连接时,服务器创建一个新的线程,处理来自该客户端的读取请求并发送响应

更多的线程

  • 如果服务器之间的通信不是严格的请求-应答,那么服务器可能需要每个客户端连接两个线程(以及用于服务器套接字的线程)
    • 一个线程监听来自客户端的传入通信
    • 向客户端发送传出通信的线程
  • 同样,每个客户端可能使用两个线程
    • 一个线程监听来自服务器的传入通信
    • 一个线程用于向服务器发送传出通信

Further information

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-09-29 10:41:46  更:2021-09-29 10:42:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年9日历 -2024/9/21 6:51:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码