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

育贤网站建设河南网站优化

育贤网站建设,河南网站优化,上海仿站定制模板建站,wordpress设置页面缓存1. 网络编程 通过网络#xff0c;让两个主机之间能够进行通信-就这样的通信来完成一定的功能#xff0c;进行网络编程的时候#xff0c;需要操作系统给咱们提供一组API#xff0c;通过这些API来完成编程#xff1b;API可以认为是应用层和传输层之间交互的路径#xf… 1. 网络编程 通过网络让两个主机之间能够进行通信-就这样的通信来完成一定的功能进行网络编程的时候需要操作系统给咱们提供一组API通过这些API来完成编程API可以认为是应用层和传输层之间交互的路径其中Socket Api可以认为是插座通过这个一套Socket Api可以完成不同主机之间不同系统之间的网络通信    传输层提供的网络协议主要有两个tcp、udp这两个协议的特性工作原理差异很大就会导致使用这两种协议进行网络编程也会存在一定的差异 1.1 TCP和UDP的区别 1、TCP是有连接的UDP是无连接的         这里的连接是抽象的概念计算机中这种抽象的连接是很常见的此处的连接本质上就是建立连接的双方各自保存对方的信息即两台计算机建立连接就是双方彼此保存了对方的关键信息         TCP想要通信就需要先建立连接即计算机保存对方的信息做完之后才能后续通信如果A和B想要建立连接但是B拒绝了通信就无法完成建立         UDP想要通信就直接发送数据报即可不需要征得对方的同意UDP自身也不会保存对方的信息虽然UDP不知道但是写程序的人得知道UDP自己不保存对方的信息但是调用UDP的socket api的时候就要把对方的位置信息等都传输过去         2、TCP是可靠传输的UDP是不可靠传输的         网络上进行的通信A-B发送一个信息首先送到B的信息不可能做到100%送达 所谓的可靠传输就是退而求其次当A-B发送一个消息但是消息是不是达到B这一方A这边自己是能感知到的所以A在消息发送失败的时候就可以采取一定的措施尝试重传之类的措施         TCP就内置了可靠的传输机制但是UDP就没有内置可靠传输         可靠传输的不足1、可靠传输所使用的机制更加复杂2、可靠传输会导致消息的传输效率更加低         综上所述         TCP协议发送方知道传输的数据是否成功的传输给接收方         UDP协议消息发出去就不管了不再考虑消息是否成功发送给接收方         3、TCP是面向字节流的UDP是面向数据报的         TCP也是和文件操作一样以字节为单位来进行传输UDP则是按照数据报UDP有着自己严格的数据报格式为单位来进行传输的         4、TCP和UDP都是全双工的         一个信道允许双向通信就是全双工一个信道只能单向通信就是半双工 代码中使用一个socket对象就可以发送数据也可以接收数据 2. 关于UDP 2.1 UDP的socket api Socket其实是操作系统中的一个概念本质上是一种特殊的文件Socket就属于是把“网卡”这个设备给抽象成了文件了往Socket文件里面写数据就相当于通过网卡发送数据从Socket文件里面读数据就相当于通过网卡接收数据如此把网络通信和文件操作给统一了 DatagramSocket Java中就是用DatagramSocket这个类来表示系统内部的socket文件 DatagramPacket 使用这个类来表示一个UDP数据报UDP是面向数据报的每一次传输都是以UDP数据报为基本单位的 2.2 基于UDP实现通信 写一个简单的UDP的客户端/服务器通信的程序         要求我们写的程序没有具体的业务逻辑只是调用单纯的socket api让客户端给服务器发送一个请求且该请求是一个从控制台输入的字符串服务器收到字符串之后就会把这个字符串原封不动的返回给客户端客户端在显示出来即该服务器是回显服务器echo server 1、读取请求并解析         服务器和客户端都需要创建socket对象但是服务器的socket一般要显示的指定一个端口号而客户端的socket一般不能显式指定不显式指定此时系统就会自动分配一个随机的端口客户端的端口号是不需要确定的交给系统进行随机分配即可如果我们手动指定确定的端口就可以和别人的程序的端口号冲突 Q:服务器这边手动指定端口号难道就不会出现端口号冲突吗为啥客户端在意这个冲突而服务器不在意这个冲突 A:首先服务器是在程序员手里面的一个服务器上有哪些程序这些程序都使用哪些端口程序员都是可控的且程序员在写代码的时候就可以指定一个空闲的端口给当前的服务器使用即可其次客户端的情况就不一样了因为客户端是在用户的电脑上的一方面用户有成千上万每一个用户电脑上所装的程序都不一样占用的短端口也不一样林外一方面用户这边如果出现了端口号冲突用户这方面自己本身不知道是什么原因         所以客户端的端口号还是交给系统来进行分配因为系统能保证肯定分配一个空闲的端口号         服务器一旦启动就会立即执行到这里的receive这里的方法此时客户端的请求可能还没有过来此时遇到这种情况receive就会直接阻塞一直阻塞到客户端把请求发送过来为止 2、根据请求计算响应一般的服务器都会经历的过程         这个步骤是一个服务器程序最核心的步骤我们当先的echo server不涉及到这些流程只要求当请求过来就把请求当作响应因为UDP是无连接的所以udp自身不会保存数据要发送的对象信息就需要每一次发送的时候重新指定数据要发送到哪儿去 3、把响应显示到客户端 4、打印一个日志将我们进行的数据交互都打印出来 Q:为啥上述所写的代码中没有写close因为socket也是文件不关闭的话就会出现之前我们所讲的文件资源泄露问题嘛 A:        首先socket是文件描述符表中的一个表项每一次打开一个文件就会占用一个位置文件描述符是在pcb上的跟随的是进程 其次这个socket在整个程序的运行中都是需要使用的不能提前关闭当socket不需要使用的时候意味着程序就要结束了进程结束此时随之的文件描述符表就会销毁了pcb也会销毁被销毁后资源就会被系统进行自动回收 最后所谓出现泄露是指代码中频繁打开文件但是不会关闭在一个进程的运行过程中不断的打开文件并逐渐消耗掉文件描述符表里面的内容最终该资源就会被消耗殆尽了但是如果进程的生命周期很短打开一下没多久就关闭了谈不上所谓的资源泄露 综上所述文件资源泄露这样的问题在服务器这边是比较严重的在客户端这边其实影响不大 2.3 代码实现 2.3.1 服务器代码 package network;import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException;public class UdpEchoServer {// 创建一个 DatagramSocket 对象. 后续操作网卡的基础.private DatagramSocket socket null;public UdpEchoServer(int port) throws SocketException {// 这么写就是手动指定端口socket new DatagramSocket(port);// 这么写就是让系统自动分配端口// socket new DatagramSocket();}public void start() throws IOException {// 通过这个方法来启动服务器.System.out.println(服务器启动!);// 一个服务器程序中, 经常能看到 while true 这样的代码.while (true) {// 1. 读取请求并解析.DatagramPacket requestPacket new DatagramPacket(new byte[4096], 4096);socket.receive(requestPacket);// 当前完成 receive 之后, 数据是以 二进制 的形式存储到 DatagramPacket 中了.// 要想能够把这里的数据给显示出来, 还需要把这个二进制数据给转成字符串.String request new String(requestPacket.getData(), 0, requestPacket.getLength());// 2. 根据请求计算响应(一般的服务器都会经历的过程)// 由于此处是回显服务器, 请求是啥样, 响应就是啥样.String response process(request);// 3. 把响应写回到客户端.// 搞一个响应对象, DatagramPacket// 往 DatagramPacket 里构造刚才的数据, 再通过 send 返回.DatagramPacket responsePacket new DatagramPacket(response.getBytes(), response.getBytes().length,requestPacket.getSocketAddress());socket.send(responsePacket);// 4. 打印一个日志, 把这次数据交互的详情打印出来.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();} }2.3.2 客户端代码 package network;import java.io.IOException; import java.net.*; import java.util.Scanner;public class UdpEchoClient {private DatagramSocket socket null;private String serverIp ;private int serverPort 0;public UdpEchoClient(String ip, int port) throws SocketException {// 创建这个对象, 不能手动指定端口.socket new DatagramSocket();// 由于 UDP 自身不会持有对端的信息. 就需要在应用程序里, 把对端的情况给记录下来.// 这里咱们主要记录对端的 ip 和 端口 .serverIp ip;serverPort port;}public void start() throws IOException {System.out.println(客户端启动!);Scanner scanner new Scanner(System.in);while (true) {// 1. 从控制台读取数据, 作为请求System.out.print(- );String request scanner.next();// 2. 把请求内容构造成 DatagramPacket 对象, 发给服务器.DatagramPacket requestPacket new DatagramPacket(request.getBytes(), request.getBytes().length,InetAddress.getByName(serverIp), serverPort);socket.send(requestPacket);// 3. 尝试读取服务器返回的响应了.DatagramPacket responsePacket new DatagramPacket(new byte[4096], 4096);socket.receive(responsePacket);// 4. 把响应, 转换成字符串, 并显示出来.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);UdpEchoClient client new UdpEchoClient(42.192.83.143, 9090);client.start();} }2.3.3 客户端和服务器交互逻辑 分析如下 1、服务期先启动启动之后就开始进行循环执行到receive这里并阻塞此时还没有客户端过来 2、客户端开始启动也会先进入while循环执行scanner.next并且在这里进行阻塞当用户在控制台输入字符串后next就会返回并且构造请求数据病发出来 3、客户端发出数据之后         服务器就会从rfeceive中返回进一步的执行解析请求为字符串执行process操作执行send操作         客户端继续往下执行执行到receive服务器的响应 4、客户端收到从服务器返回的数据之后就会从receive中返回执行这里的打印操作也就把响应给显示出来了 5、服务器这边完成过一次循环之后又执行到receive这里客户端这边完成一次循环之后又执行到scanner.next这里双双进入阻塞 ps本篇内容主要讲解关于UDP时间简单通信的过程如果大家感兴趣的话就请一键三连哦
http://www.zqtcl.cn/news/568539/

相关文章:

  • 汕头中英文网站推广wordpress取回密码收不到邮件
  • 外贸在线网站建站wordpress开放注册
  • 桂林餐饮兼职网站建设如何在百度上建网站
  • 怎样做免费网站的推广便宜点的网站空间
  • 中国建设部网站失信名单自己做公司网站难吗
  • 济南做网站需要多少钱园区网站到底怎么建设
  • 武清做网站的公司wordpress商城
  • 网站建设的实训技术总结sql 新建网站
  • 开发网站多少钱网站文件目录结构
  • 网站规划和建设的步骤做网站用的各种图标大全
  • 网站公司查询js代码网站大全
  • 湘潭网站建设价格最新新闻热点事件100字
  • 音乐网站程序源码wordpress模板中文版
  • 网站建设计划表wordpress主题 大
  • 在手机制作网站书店网站建设技术风险
  • 爱站网域名查询wordpress自定义标题关键词描述
  • 西安学校网站建设报价建盏
  • 网页 网站 区别东莞手机app开发
  • 空压机网站开发公司广州海珠区有什么好玩的景点
  • 什么网站可以做期货企业解决方案服务协议
  • 西安汽车网站制作手机软件制作网站平台
  • 微信的微网站介绍自己的家乡遵义网站建设
  • 爱站seo东莞网站建设要注意什么
  • 惠州网站建设 英语6wordpress 表格提交
  • 做网站15年多少钱一度电
  • 北京网站域名快速备案外贸网站优化价格
  • 做网站 工资高吗免费建站的站点网站
  • 个人做营利性质网站会怎么样qq邮箱官方网站
  • 网站怎么做等级保护产品展示小程序
  • 奉贤网站建设专家高端自适应网站设计