当前位置: 首页 > news >正文

郑州专门做喷绘安装的网站郑州竞价托管公司哪家好

郑州专门做喷绘安装的网站,郑州竞价托管公司哪家好,营销型网站建设步骤,网站推广ww文章目录 一、概念1.1 什么是网络编程1.2 网络编程中的基本知识 二、Socket套接字2.1 概念及分类2.2 TCP VS UDP2.3 通信模型2.4 接口方法UDP数据报套接字编程TCP流套接字编程 三、代码示例3.1 注意点3.2 回显服务器基于UDP基于TCP 一、概念 首先介绍了什么是网络编程&#xff…

文章目录

  • 一、概念
    • 1.1 什么是网络编程
    • 1.2 网络编程中的基本知识
  • 二、Socket套接字
    • 2.1 概念及分类
    • 2.2 TCP VS UDP
    • 2.3 通信模型
    • 2.4 接口方法
      • UDP数据报套接字编程
      • TCP流套接字编程
  • 三、代码示例
    • 3.1 注意点
    • 3.2 回显服务器
      • 基于UDP
      • 基于TCP

一、概念

首先介绍了什么是网络编程,随后介绍了接收端发送端、请求响应等基本知识

1.1 什么是网络编程

网络编程
(1)网络上的主机,通过不同的进程,以编程的方式实现网络通信(或称为网络数据传输)。(2)在程序员层面上,即要写一个应用程序通过调用传输层提供的API实现网络通信

1.2 网络编程中的基本知识

  1. 发送端和接收端:字面意思,发送端是发送数据的,接收端是接收数据的,注意这个概念只是相对的,主要看数据是从哪发到哪。

  2. 请求和响应
    一般来说,获取一个网络资源,涉及到两次网络数据传输:

    • 第一次:请求数据的发送
    • 第二次:响应数据的发送
  3. 客户端和服务器
    服务端:在常见的网络数据传输场景下,给用户提供服务的一方进程
    客户端:获取服务的一方进程,是指给用户使用的程序

  4. 常见的客户端服务端模型

    • 客户端先发送请求到服务端
    • 服务端根据请求数据,执行相应的业务处理
    • 服务端返回响应:发送业务处理结果
    • 客户端根据响应数据,展示处理结果(展示获取的资源,或提示保存资源的处理结果)

二、Socket套接字

网络编程是基于Socket开发的,传输层上主要涉及TCP、UDP这两种协议,而他俩给出的API都不同,本段主要介绍概念,包括分类和区别。

2.1 概念及分类

(1)Socket套接字,是由系统提供用于网络通信的技术,是基于TCP/IP协议的网络通信的基本操作单元。基于Socket套接字的网络程序开发就是网络编程。

(2)Socket套接字主要针对传输层协议划分为如下三类:

  1. 流套接字:传输层TCP协议(传输控制协议)
  2. 数据报套接字:传输层UDP协议(用户数据报协议)
  3. 原始套接字:原始套接字用于自定义传输层协议,用于读写内核没有处理的IP协议数据

2.2 TCP VS UDP

TCP:有连接;可靠传输;面向字节流;有接收缓冲区和发送缓冲区;大小不限;全双工
UDP:无连接;不可靠传输;面向数据报;有接收缓冲区,无发送缓冲区;大小受限,一次最多传输64k

  1. 连接:客户端和服务器之间是否使用内存保存对端信息,互相承认,连接就建立了。
  2. 传输
    • 可靠传输:A尽可能把消息传过去,传输失败与否都能感知到,会降低传输效率。不可靠传输传输效率更高
    • 注意:这并不意味着,TCP比UDP更安全,因为“网络安全”指的是传输的数据是否容易被黑客截获,以及如果被截获后是否会泄漏一些重要信息
  3. 字节流VS数据报
    • 面向字节流:TCP流式操作
    • 面向数据报:读写的基本单位是一个UDP数据报,且一次只能传输一个
  4. 全双工VS半双工
    • 全双工:一个通道,可以双向通信。网线就是全双工的
    • 半双工:一个通道,只能单向通信

2.3 通信模型

数据报套接字模型

在这里插入图片描述
流套接字模型
在这里插入图片描述

2.4 接口方法

UDP数据报套接字编程

UDP提供的API主要通过两个类来实现,一个是DatagramSocket,一个是DatagramPacket。

DatagramSocket 方法:代表一个Socket对象,即一个网卡的文件
DatagramPacket 方法:代表一个UDP数据报

TCP流套接字编程

因为TCP是字节流式传输,所以不需要一个专门的类来表示TCP数据报

ServerSocket 方法:
(1)给服务器使用的
(2)负责拉客,在外场广撒网。

Socket 方法:
(1)服务端和客户端都能用
(2)像是一个耳麦,可以直接与对方进行通信,负责在内场细致服务。

三、代码示例

3.1 注意点

  1. 服务器使用的端口需要手动指定,客户端的则需要系统自动分配
    • 因为服务器需要能被客户端百分百找到,万一服务器随便改变端口,那客户端按照以往的连接是无法连接到服务器的。
    • 客户端则没有这个需求,且客户端一旦指定端口号很可能回合其他程序冲突,系统自动分配的端口号一定是空闲的。
  2. flush() ------ 手动刷新
    • IO操作是比较有开销的,相比于访问内存,进行IO次数越多,程序的速度就越慢。为了解决这个问题,我们会使用一块内存作为缓冲区,写数据的时候,先写到缓冲区里。攒了一波数据之后,统一进行IO。
    • printWriter 内置了缓冲区
    • flush()可以实现手动刷新,可以确保这里的数据是真的通过网卡发出去了,而不是残留在内存缓冲区中的
    • 加上flush()可以让代码更稳妥,但是不加不一定会出错,因为缓冲区内置了一定的刷新策略
  3. 关于 close()
    close() 主要是删除文件描述符表中的记录。当然也并不是每个流对象都有文件描述符表,只有那种调用了操作系统提供的open()方法,涉及到了用户态和用户态。

3.2 回显服务器

基于UDP

(1)InetAddress 表示的是IP地址
(2)客户端要设置要传给的服务器的IP地址和端口号是多少,即示例中的 serverIp 和 serverPort 。服务器则是要手动指定一个端口号。
(3)难点在于 DatagramPacket 的构造,涉及了String 和 DatagramPacket 之间的转换。
(4)数据包的接收和发送,依靠 DatagramSocket 的 send 和 receive 方法。

//客户端
public class UdpEchoClient {private DatagramSocket socket = null;private String serverIp;private int serverPort;public UdpEchoClient(String ip, int port) throws SocketException {serverIp = ip;serverPort = port;socket = new DatagramSocket();}public void start() throws IOException {//获取用户输入的内容Scanner scanner = new Scanner(System.in);System.out.println("客户端启动!");//给服务器发送响应while (true){System.out.print("-> ");String request = scanner.next();//不能用request.length(),因为这是指字符长度,我们需要的是字节长度//除非是纯英文且由utf-8编码,那么两者会相同。Socket是按照字节来处理的。DatagramPacket requestPacket = new DatagramPacket(request.getBytes(), request.getBytes().length,InetAddress.getByName(serverIp), serverPort);socket.send(requestPacket);//接收响应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 {UdpEchoClient client = new UdpEchoClient("127.0.0.1", 9090);client.start();}
}
//服务器
public class UdpEchoServer {private DatagramSocket socket = null;public UdpEchoServer(int port) throws SocketException {socket = new DatagramSocket(port);}public void start() throws IOException {System.out.println("服务器启动");while(true){DatagramPacket requestPacket = new DatagramPacket(new byte[4096], 4096);socket.receive(requestPacket);String request = new String(requestPacket.getData(), 0, requestPacket.getLength());String response = process(request);DatagramPacket responsePacket = new DatagramPacket(response.getBytes(), response.getBytes().length,requestPacket.getSocketAddress());socket.send(responsePacket);System.out.printf("[%s:%d req:%s, resp:%s\n]", requestPacket.getAddress().toString(),requestPacket.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();}
}

基于TCP

  1. 服务器对客户是多对多的关系,一个服务器内核会存许多客户端的连接(建立连接的过程,系统内核会自己完成)。连接就像是一个个代办事项,等待应用程序一个个完成。
  2. serverSocket.accept():将在内核中已经建立好的连接取出来给应用程序
  3. 原理是一个【生产者消费者模型】
    在这里插入图片描述
  4. TCP中的长短连接
    • 短连接:每次接收到数据并返回响应后,都关闭连接,即只能一次收发数据
    • 长连接:不关闭连接,一直保持连接状态,双方不停的收发数据
public class TcpServer {private ServerSocket socket = null;private ExecutorService service = Executors.newCachedThreadPool();public TcpServer(int port) throws IOException {socket = new ServerSocket(9090);}public void start() throws IOException {System.out.println("服务端启动!");while (true){Socket clientSocket = socket.accept();//为了能够接收多个客户端,这里使用了线程池//当客户端进一步增加,线程数目也会增加,系统的负担也就越来越重,响应速度也就越来越慢//为了解决这个问题,就需要开源(引入更多的硬件资源)节流(减少每种硬件资源占用的资源)service.submit(new Runnable() {@Overridepublic void run() {try {processConnection(clientSocket);} catch (IOException e) {throw new RuntimeException(e);}}});}}public void processConnection(Socket clientSocket) throws IOException {try(InputStream inputStream = clientSocket.getInputStream();OutputStream outputStream = clientSocket.getOutputStream()){while(true){Scanner scannerClient = new Scanner(inputStream);String request = scannerClient.next();String response = process(request);PrintWriter writer = new PrintWriter(outputStream);writer.println(response);writer.flush();System.out.printf("[%s:%d] req:%s, resp:%s\n", clientSocket.getInetAddress().toString(),clientSocket.getPort(), request, response);}} catch (IOException e) {throw new RuntimeException(e);}finally {clientSocket.close();}}public String process(String request){return request;}public static void main(String[] args) throws IOException {TcpServer server = new TcpServer(9090);server.start();}
}
public class TcpClient {private Socket socket = null;public TcpClient(String serverIp, int serverPort) throws IOException {socket = new Socket(serverIp, serverPort);}public void start(){System.out.println("客户端启动");Scanner scanner = new Scanner(System.in);try(InputStream inputStream = socket.getInputStream();OutputStream outputStream = socket.getOutputStream()){while (true){System.out.print("---->");String request = scanner.next();PrintWriter writer = new PrintWriter(outputStream);writer.println(request);writer.flush();Scanner scammerConsole = new Scanner(inputStream);String response = scammerConsole.next();System.out.println(response);}} catch (IOException e) {throw new RuntimeException(e);}}public static void main(String[] args) throws IOException {TcpClient client = new TcpClient("127.0.0.1", 9090);client.start();}
}
http://www.dt0577.cn/news/45153.html

相关文章:

  • 网站开发技术案例软文范例大全500字
  • 包头网站建设易通百度搜索引擎服务项目
  • 我想卖自己做的鞋子 上哪个网站好旅游网站的网页设计
  • 网页在线设计成都seo网站qq
  • 用c 怎么做网站系统搜索词热度查询
  • 湛江手机建站模板百度快照推广有效果吗
  • 政府网站建设企业友链通
  • 个人网站谢谢培训课程
  • 网站建设与推广培训学校百度推广开户流程
  • 南昌网站推广公司优化提升
  • 做专业网站设计多少钱写软文
  • 做视频的教学直播网站深圳seo外包
  • 注册网站验证码建站推广
  • 搜款网站一起做网店凡科网建站系统源码
  • 做AE视频素材在哪些网站上可以找google关键词指数
  • 网站上传 文件夹结构互联网推广的好处
  • 宝塔面板 wordpress首页排名seo
  • 公司包装推广湖南靠谱关键词优化
  • 共和县公司网站建设2022年列入传销组织最新骗法
  • 网站banner自适应互联网推广是什么
  • 太原网站怎么做seo南宁网站seo
  • 怎么做自己的销售网站整合网络营销公司
  • 厦门网站推广费用百度关键词搜索趋势
  • 网站怎么做直播站长工具app下载
  • 高平网站优化公司广告免费发布信息平台
  • 小学课程建设网站目标百度免费下载
  • 新网站建设方案ppt谷歌官网
  • 苏州好的做网站的公司哪家好一份完整的营销策划书
  • 工信部网站备案平台全球搜索引擎排名2022
  • vi设计的目的和意义企业seo推广的绝密诀窍曝光