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

东莞网络app关键词排名优化

东莞网络,app关键词排名优化,小型网站建设方案,免费做网站公司哪家好Socket 套接字(TCP和UDP),以及TCP的回显 Socket 套接字数据报套接字UDPTCP流套接字编程TCP的长短连接实现一个简单回显服务器 Socket 套接字 我们软件工作者,着重编写的是应用层的代码,但是发送这个数据,我…

Socket 套接字(TCP和UDP),以及TCP的回显

  • Socket 套接字
  • 数据报套接字UDP
  • TCP流套接字编程
    • TCP的长短连接
    • 实现一个简单回显服务器

Socket 套接字

我们软件工作者,着重编写的是应用层的代码,但是发送这个数据,我们就需要将应用层传输到传输层,也就意味着我们需要调用应用层的API,统称为 Socket API。

套接字的分类:

  1. 流套接字:使用传输层TCP协议
    特点:
    • 有连接:使用 TCP 通信的双方,需要时刻保存对方的相关消息
    • 可靠传输:尽可能的将数据传输过去,如果没有传输过去,自己也知道没有传输,然后通过设定可以重新传输
    • 面向字节流:以字节为传输的基本单位,读写方式更为灵活
    • 全双工:一条路径,双向通信
  2. 数据报套接字:使用传输层UDP协议
    特点:
    • 有连接:使用 UDP 通信的双方,不需要时刻保存对方的相关消息
    • 不可靠传输:只关注是否传输了数据,至于是否传输成功,并不专注
    • 面向数据报:以一个UDP数据报为基本单位
    • 全双工:一条路径,双向通信
  3. 原始套接字:原始套接字用于自定义传输层协议,用于读写内核没有处理的IP协议数据。
    所有特点自己定义

什么是全双工和半双工?

全双工:一条路径,双向通信
半双工:一条路径,单向通信

网络传输数据的基本单位:报(Datagram)、包(Packet)、段(Segment)、帧(Frame)
Socket 对象,相当于系统中Socket文件,这个文件并非对应到硬盘上的某个数据存储区域,而是对应到网卡这个硬件设备

  • 往这个Socket·对象中写数据,相当于通过网卡发送消息
  • 从这个Socket·对象中读数据,相当于通过网卡接收消息

这个图不是我画,摘抄了网上现有的)
在这里插入图片描述

数据报套接字UDP

java中使用UDP协议通信,主要基于 DatagramSocket 类来创建数据报套接字,并使用DatagramPacket 作为发送或接收的UDP数据报 。DatagramSocket 是UDP Socket,用于发送和接收UDP数据报。

DatagramSocket API:

  1. DatagramSocket 构造方法

在这里插入图片描述

  1. DatagramSocket 方法:
    在这里插入图片描述

DatagramPacket API:(DatagramPacket是UDP Socket发送和接收的数据报)

  1. DatagramPacket 构造方法:
    在这里插入图片描述

  2. DatagramPacket 方法:
    在这里插入图片描述
    构造UDP发送的数据报时,需要传入 SocketAddress ,该对象可以使用 InetSocketAddress 来创

InetSocketAddress API:

  1. InetSocketAddress ( SocketAddress 的子类 )构造方法:
    在这里插入图片描述

UDP服务器:

注意:

  • 服务器的端口必须不变,客户端这边则不需要手动指定,系统自动分配
  • socket是文件,也需要关闭
public class UdpServer { //服务器socket要绑定固定的端口 private static final int PORT = 8888; public static void main(String[] args) throws IOException { // 1.创建服务端DatagramSocket,指定端口,可以发送及接收UDP数据报 DatagramSocket socket = new DatagramSocket(PORT); //不停的接收客户端udp数据报 while (true){ // 2.创建数据报,用于接收客户端发送的数据 byte[] bytes = new byte[1024];//1m=1024kb, 1kb=1024byte, UDP最多64k(包含UDP首部8byte) DatagramPacket packet = new DatagramPacket(bytes, bytes.length); System.out.println("---------------------------------------------------"); System.out.println("等待接收UDP数据报..."); // 3.等待接收客户端发送的UDP数据报,该方法在接收到数据报之前会一直阻塞,接收到数据报以后,DatagramPacket对象,包含数据(bytes)和客户端ip、端口号 socket.receive(packet); System.out.printf("客户端IP:%s%n",  packet.getAddress().getHostAddress()); System.out.printf("客户端端口号:%s%n", packet.getPort()); System.out.printf("客户端发送的原生数据为:%s%n",  Arrays.toString(packet.getData())); System.out.printf("客户端发送的文本数据为:%s%n", new String(packet.getData())); } } 
}

一旦服务器一起动,调用start方法,就会立即执行到,receive这里,但是如果此时还有没有客户端发来的数据,receive就会阻塞等待,一直持续到有数据发过来。
细节:网卡这里收到数据,就会进行分用,解析UDP这一层 看到端口号,然后将数据放入接收缓冲区,然后将数据到了参数中的DatagramSocket 对象中

UDP客户端:

public class UdpClient { // 服务端socket地址,包含域名或IP,及端口号 private static final SocketAddress ADDRESS = new InetSocketAddress("localhost", 8888); public static void main(String[] args) throws IOException { // 4.创建客户端DatagramSocket,开启随机端口就行,可以发送及接收UDP数据报 DatagramSocket socket = new DatagramSocket(); // 5-1.准备要发送的数据 byte[] bytes = "hello world!".getBytes(); // 5-2.组装要发送的UDP数据报,包含数据,及发送的服务端信息(服务器IP+端口号) DatagramPacket packet = new DatagramPacket(bytes, bytes.length, ADDRESS); // 6.发送UDP数据报 socket.send(packet); } 
}

在这里插入图片描述

TCP流套接字编程

ServerSocket API:

ServerSocket 是创建TCP服务端Socket的API。

  1. ServerSocket 构造方法:
    在这里插入图片描述
  2. ServerSocket 方法:
    在这里插入图片描述
    accept:意思就是接受,本质上是三次握手后面的文章会说。

Socket API:

Socket 是客户端 Socket,或服务端中接收到客户端建立连接(accept方法)的请求后,返回的服务端Socket。
不管是客户端还是服务端Socket,都是双方建立连接以后,保存的对端信息,及用来与对方收发数据的。

  1. Socket 构造方法:
    在这里插入图片描述
  • host 表示服务器的 IP 地址
  • port 表示服务器的端口
  1. Socket 方法:
    在这里插入图片描述
  • 从InputStream这里读数据,就相当于从网卡接收
  • 往OutputStream这里写数据,就相当于从网卡发送

TCP的长短连接

TCP发送数据时,需要先建立连接,而什么时候关闭连接就决定是短连接还是长连接。
短连接:每次接收数据并返回响应后,都关闭连接。也就是说,短连接只能一次收发。

  • 连接客户端和服务器
  • 对于客户端来说。要发送一个请求,然后接收一个响应
  • 对于服务器来说。会收到一个请求,然后返回一个响应
  • 然后关闭连接

长连接:不关闭连接,一直保持连接状态,双方不停的收发数据,即是长连接。也就是说,长连接可以
多次收发数据

  • 连接客户端和服务器
  • 可以客户端一直发送请求,并获取服务器的响应
  • 可以服务器一直发送请求,并获取客户端的响应
  • 没有一方主动停止,不关闭

长连接和短连接的区别:

  • 建立连接、关闭连接的耗时:短连接每次请求、响应都需要建立连接,关闭连接;而长连接只需要第一次建立连接,之后的请求、响应都可以直接传输。相对来说建立连接,关闭连接也是要耗时的,长连接效率更高。
  • 主动发送请求不同:短连接一般是客户端主动向服务端发送请求;而长连接可以是客户端主动发送请求,也可以是服务端主动发。
  • 两者的使用场景有不同:短连接适用于客户端请求频率不高的场景,如浏览网页等。长连接适用于客户端与服务端通信频繁的场景,如聊天室,实时游戏等。

实现一个简单回显服务器

public class TcpEchoServer {//serverSocket 就是外场拉客的小哥(类似集合),只有一个//clientSocket 内场服务的人(),会给每个客服分配一个private ServerSocket serverSocket=null;//1public TcpEchoServer(int port) throws IOException {serverSocket=new ServerSocket(port);}public void start() throws IOException {ExecutorService executorService= Executors.newCachedThreadPool();System.out.println("服务器启动");while (true){Socket clientSocket=serverSocket.accept();//如果直接调用,该方法会影响这个循环的二次执行.导致accept不及时了//创建新的线程,用新的线程来调用processConnetion//每次来一个新的客户端都搞一个新的线程即可
/*            Thread t=new Thread(()->{try {processConnection(clientSocket);} catch (IOException e) {throw new RuntimeException(e);}});t.start();*///创建一个线程池,从池子中拿取线程executorService.submit(new Runnable() {@Overridepublic void run() {try {processConnection(clientSocket);} catch (IOException e) {throw new RuntimeException(e);}}});}}//通过这个方法处理一个链接//读取请求//根据请求计算响应//把响应返回给客户端private void processConnection(Socket clientSocket) throws IOException {System.out.printf("[%s:%d] 客户端上线!\n",clientSocket.getInetAddress().toString(),clientSocket.getPort());try(InputStream inputStream=clientSocket.getInputStream();OutputStream outputStream=clientSocket.getOutputStream()) {//没有这两个也可以,但是代价就是得一个字节一个字节的处理,找到那个是结束符//将字节流包装成了字符流Scanner scanner=new Scanner(inputStream);PrintWriter printWriter=new PrintWriter(outputStream);while (true){//3//读取请求if (!scanner.hasNext()){//读取的流到了结尾了System.out.printf("[%s:%d] 客户端下线",clientSocket.getInetAddress().toString(),clientSocket.getPort());break;}//直接使用scanner读取一段字符串String request=scanner.next();//往后读,一直读到空白符,空格,换行,翻页符....都算空白符//5//根据请求计算响应String response=process(request);//把响应返回给客户端printWriter.println(response);//刷新缓冲区printWriter.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();}}private String process(String request) {return request;}public static void main(String[] args) throws IOException {TcpEchoServer tcpEchoServer=new TcpEchoServer(9090);tcpEchoServer.start();}}

在这里插入图片描述
补充一点:

硬件的读写速度:

  • 内存 > 硬盘 > 网卡

读写硬盘和网卡口可以视为 IO 操作。

  • printWriter.println(response);----》写网卡

因为网卡读写速度慢,如果平凡的写入,读出对于效率太慢了。为了提高IO操作的效率,此时就需要引入一个内存构成的缓冲区。等缓冲区达到一定数量,就统一写入网卡中。

缓存(cache)!=缓冲区(buffer)

  • 缓存:只能读
  • 缓冲区:可以读也可以写。

文章转载自:
http://electrization.bbmx.cn
http://sialolithiasis.bbmx.cn
http://twentieth.bbmx.cn
http://lutist.bbmx.cn
http://detrude.bbmx.cn
http://pretext.bbmx.cn
http://workfellow.bbmx.cn
http://observable.bbmx.cn
http://interrogative.bbmx.cn
http://efflorescence.bbmx.cn
http://plss.bbmx.cn
http://acetabularia.bbmx.cn
http://roomer.bbmx.cn
http://bcc.bbmx.cn
http://yesternight.bbmx.cn
http://australopithecine.bbmx.cn
http://jealously.bbmx.cn
http://orbicularis.bbmx.cn
http://arabist.bbmx.cn
http://thermosensitive.bbmx.cn
http://reave.bbmx.cn
http://mesothoracic.bbmx.cn
http://heft.bbmx.cn
http://isobutene.bbmx.cn
http://balatik.bbmx.cn
http://zoometry.bbmx.cn
http://ciborium.bbmx.cn
http://calicular.bbmx.cn
http://badmash.bbmx.cn
http://homolosine.bbmx.cn
http://tranship.bbmx.cn
http://juicer.bbmx.cn
http://sken.bbmx.cn
http://falconine.bbmx.cn
http://dhl.bbmx.cn
http://dawning.bbmx.cn
http://maestoso.bbmx.cn
http://periselenium.bbmx.cn
http://maldivian.bbmx.cn
http://lappish.bbmx.cn
http://implausible.bbmx.cn
http://dermatology.bbmx.cn
http://monticule.bbmx.cn
http://instantiation.bbmx.cn
http://tubilingual.bbmx.cn
http://trochili.bbmx.cn
http://rabi.bbmx.cn
http://explant.bbmx.cn
http://tympani.bbmx.cn
http://suedette.bbmx.cn
http://professorship.bbmx.cn
http://seacopter.bbmx.cn
http://heterochromous.bbmx.cn
http://anaphora.bbmx.cn
http://cribrose.bbmx.cn
http://phonematic.bbmx.cn
http://hiya.bbmx.cn
http://muriphobia.bbmx.cn
http://wineskin.bbmx.cn
http://biopack.bbmx.cn
http://ovalbumin.bbmx.cn
http://allergen.bbmx.cn
http://pterodactyl.bbmx.cn
http://noser.bbmx.cn
http://retrolingual.bbmx.cn
http://gametal.bbmx.cn
http://kegeree.bbmx.cn
http://antivenin.bbmx.cn
http://eastabout.bbmx.cn
http://visceral.bbmx.cn
http://isochronize.bbmx.cn
http://hipshot.bbmx.cn
http://rubefaction.bbmx.cn
http://reconviction.bbmx.cn
http://epibiosis.bbmx.cn
http://magellan.bbmx.cn
http://seaway.bbmx.cn
http://postoffice.bbmx.cn
http://lampad.bbmx.cn
http://resectoscope.bbmx.cn
http://autoput.bbmx.cn
http://functional.bbmx.cn
http://kumite.bbmx.cn
http://dissipated.bbmx.cn
http://orthoepic.bbmx.cn
http://mucosanguineous.bbmx.cn
http://centripetalism.bbmx.cn
http://stirps.bbmx.cn
http://eprom.bbmx.cn
http://appendage.bbmx.cn
http://freeheartedly.bbmx.cn
http://gerundival.bbmx.cn
http://octavian.bbmx.cn
http://suprathreshold.bbmx.cn
http://lamarckism.bbmx.cn
http://houselessness.bbmx.cn
http://andalusia.bbmx.cn
http://sparganum.bbmx.cn
http://abstraction.bbmx.cn
http://multibus.bbmx.cn
http://www.15wanjia.com/news/95635.html

相关文章:

  • 自动化培训网站建设百度推广外推联系方式
  • 24小时学会网站建设 pdf下载百度seo关键词
  • 湘潭做网站广告的公司seo公司是做什么的
  • wordpress video html5上海百度seo点击软件
  • 如何网站建设注册域名后如何建立网站
  • 云南做网站哪家便宜搜索引擎优化的流程是什么
  • 安全联盟这种网站建设百度一下 你知道首页
  • 网站建设前景怎么样网站营销网站营销推广
  • 微信制作网站开发今日新闻摘抄
  • WordPress海报封面主题上海专业seo服务公司
  • 招聘网页制作人员seo营销怎么做
  • 专业团队电影手机360优化大师官网
  • 网站二级域名武汉网站seo推广公司
  • 深圳品牌网站建设百度如何添加店铺位置信息
  • 智能化建设网站东莞seo
  • 提高网站权重百度权重10的网站
  • 网站域名怎么进行实名认证百度关键词价格查询
  • 网站页面设计报价bt搜索引擎最好用的
  • php可以做移动端网站拼多多关键词优化步骤
  • 武汉网站建设哪家强东莞市网络营销公司
  • 政府通用网站html模板下载引擎网站
  • 小型网站建设源码重庆专业seo
  • 江津区住房和城乡建设委员会网站南宁百度seo软件
  • 山东网站建设公司网站seo批量查询工具
  • 遵义市人民政府门户网站百度广告代理公司
  • wordpress wp query肇庆百度快照优化
  • 番禺品牌型网站企业产品推广运营公司
  • 内网网站建设方面政策chrome官网下载
  • 深圳高端响应式网站aso优化平台有哪些
  • 网站备案现场天津seo推广软件