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

网站建设代码介绍企业网站备案查询

网站建设代码介绍,企业网站备案查询,网站制作报价图片欣赏,动画设计是做什么的作者简介#xff1a;☕️大家好#xff0c;我是Aomsir#xff0c;一个爱折腾的开发者#xff01; 个人主页#xff1a;Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客 当前专栏#xff1a;Netty应用专栏_Aomsir的博客-CSDN博客 文章目录 参考文献前言基础扫… 作者简介☕️大家好我是Aomsir一个爱折腾的开发者 个人主页Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客 当前专栏Netty应用专栏_Aomsir的博客-CSDN博客 文章目录 参考文献前言基础扫盲问题所在 调整非阻塞技巧总结 参考文献 孙哥suns说NettyNetty官方文档 前言 在前面的文章中我们详细学习并使用了NIO中的Channel和Buffer。然而我们的示例中Channel的两端都是文件我们一直使用的是FileChannel没有与网络通信结合起来。从今天开始我们将进入网络编程领域使用NIO中的SocketChannel和ServerSocketChannel为后续的Netty学习打下坚实的基础。 基础扫盲 由于我们现在的开发都是使用的SpringBoot底层的网络通信都被Tomcat、Jetty等所处理我们很少能够接触Socket套接字编程这一个段落就来个基础性知识的扫盲。我们的客户端与服务端之间是使用Socket进行通信的Socket是计算机网络中的传输层的内容和TCP与UDP挂钩。在服务端有一个东西叫做ServerSocket它是用来接收客户端请求然后和客户端建立Socket连接的。下面的演示案例中我写了一个服务端和客户端的案例。 服务端就是创建ServerSocketChannel绑定端口启动监听请求获取对应的SocketChannel 客户端就是去连接服务端所在机器的对应端口发送数据相应数据即可 注意: 服务端有两次阻塞第一次阻塞是接收请求的时候第二次阻塞是建立后连接等待接收数据的时候。说明NIO是有阻塞的后面会写案例解决阻塞的端口是应用进程启动后在传输层给其分配的客户端是一个进程服务端是一个进程。有了端口号两个进程就可以跨进程互相访问当服务端启动就是一个主线程接收请求和数据处理都是由主线程挨个处理只要SocketChannel一经建立服务端或者客户端不主动销毁就会一直在但其中会不会有数据是两码子事 public class MyServer {public static void main(String[] args) throws Exception{// 1、创建ServerSocketChannelServerSocketChannel serverSocketChannel ServerSocketChannel.open();// 2、设置服务端的监听端口serverSocketChannel.bind(new InetSocketAddress(8000));ListSocketChannel channelList new ArrayList();ByteBuffer buffer ByteBuffer.allocate(20);// 3、接受客户端的连接,让它一直转(我们不知道啥时候会接收到请求)while (true) {// 4、SocketChannel代表服务端与Client链接的一个通道System.out.println(等待连接服务器...);// 发生阻塞,服务端在等待客户端的请求接收到才会放行SocketChannel socketChannel serverSocketChannel.accept();System.out.println(服务器已连接... socketChannel);// 4-1、接受一个客户端就存一个channelList.add(socketChannel);// 5、client与服务端 通信 NIOfor (SocketChannel channel : channelList) {System.out.println(开始实际的数据通信...);// 此处阻塞,对于的IO通信的阻塞,将channel中的数据读取到buffer中channel.read(buffer);// 开启读模式buffer.flip();CharBuffer result StandardCharsets.UTF_8.decode(buffer);System.out.println(result result);// 读完后开启写模式buffer.clear();System.out.println(实际的通信已经结束...);}}} }public class MyClient {public static void main(String[] args) throws Exception{// 1、创建客户端channel,并连接8000端口服务端SocketChannel socketChannel SocketChannel.open();socketChannel.connect(new InetSocketAddress(8000));// 2、向服务端发送数据socketChannel.write(Charset.defaultCharset().encode(你好我是Aomsir\n));System.out.println(-------------------------------------);} }问题所在 在上面的案例中服务端程序会面临两次阻塞。首先在接收连接请求时服务端程序需要等待新的连接请求。其次一旦建立连接后服务端可能需要等待客户端发送数据。这可能会导致一些问题 单客户端多次请求问题 如果今天只有一个客户端请求按照上面的案例代码我们知道服务端在处理完这个客户端的请求后双方都没有选择断开Channel那客户端第一次给服务端发送完数据后就会回到循环的开始一直阻塞新的连接请求到来而不会去执行下面的IO处理导致第一个客户端的后续请求得不到处理。这是当前单线程服务端模型的局限性只有在接受新连接后才能处理请求。 这是由于ServerSocketChannel等待客户端请求时的阻塞客户端保持连接问题 第一个客户端发送完数据后没有断开与服务端的连接服务端channelList中第一个Channel永远是第一个客户端的服务端会一直等待来自该客户端的数据但是第一个客户端已经没有数据发送了这会导致服务端阻塞无法处理其他连接因为它会一直在等待当前连接上的数据。这是由于SocketChannel处理IO数据时的阻塞。这需要特别处理的情况通常可以通过设置超时或实现多线程来解决。 调整非阻塞 在上面的代码中我们使用了标准的NIO编程方法但同时又称它为非阻塞编程。然而在代码中的两次阻塞操作似乎没有展现出非阻塞的特性这是因为我们还未进行必要的设置。通过对ServerSocketChannel和SocketChannel的配置我们可以将它们转换为非阻塞模式。只需执行以下两行代码serverSocketChannel.configureBlocking(false); 和 socketChannel.configureBlocking(false);。 一旦这些设置生效之前阻塞的客户端请求接收和IO处理不再会阻塞整个程序。当没有客户端请求或没有进行IO请求时从ServerSocketChannel获取的SocketChannel将为null从SocketChannel中读取的字节数将为0。为了进一步说明这一点以下是示例代码 public class MyServer1 {public static void main(String[] args) throws Exception{ServerSocketChannel serverSocketChannel ServerSocketChannel.open();// 设置serverSocketChannel为非阻塞,解决连接阻塞serverSocketChannel.configureBlocking(false);serverSocketChannel.bind(new InetSocketAddress(8000));ListSocketChannel channelList new ArrayList();ByteBuffer buffer ByteBuffer.allocate(20);while (true) {// 此处等待请求不会阻塞如果此时没有客户端连接进来会返回nullSocketChannel socketChannel serverSocketChannel.accept();// 4、如果接收到的socketChannel不为null,则将其添加到channelList中if (socketChannel ! null) {// 设置socketChannel为非阻塞,解决数据读取阻塞socketChannel.configureBlocking(false);channelList.add(socketChannel);}// 5、客户端与服务端 通信 NIOfor (SocketChannel channel : channelList) {// 此处从channel中读取数据到buffer中会阻塞int read channel.read(buffer);if (read 0) {System.out.println(开始实际的数据通信...);buffer.flip(); // 开启读模式CharBuffer result StandardCharsets.UTF_8.decode(buffer);System.out.println(result result);buffer.clear(); // 开启写模式System.out.println(实际的通信已经结束...);}}}} }技巧 对于一个Java类比如我们的客户端我们可能需要在IDEA中运行多个。但是默认情况下我们在IDEA里面将客户端启动以后它处于一直运行的状态如果我这个时候再去点击运行那就会将这个客户端重新运行而不是启动一个新的进程我们可以按照下面的方式进行设置。 打开IntelliJ IDEA并确保你的项目已经打开。在IDEA的顶部菜单栏中点击 “Run”运行。选择 “Edit Configurations”编辑配置。在左侧窗格中点击加号以创建一个新的运行配置。选择 “Application”应用程序作为配置类型。在 “Name”名称字段中为你的运行配置命名例如 “Client1”。在 “Main class”主类字段中指定你想要运行的Java客户端的主类。在 “Program arguments”程序参数字段中如果有需要的话添加客户端程序的参数。在 “Working directory”工作目录字段中指定客户端应运行的工作目录。点击 “OK” 以保存该运行配置。重复上述步骤创建其他客户端的运行配置每个配置使用不同的名称主类和参数。现在你可以通过选择不同的运行配置来启动不同的客户端。在顶部工具栏 中选择你想要运行的配置然后点击运行按钮绿色的播放按钮。 总结 在今天的文章中我们将深入探讨SocketChannel和ServerSocketChannel这两个在网络通信中起着关键作用的组件。我们将揭开网络通信中服务端的两次阻塞现象的神秘面纱并详细介绍NIO如何有效地处理非阻塞。让我们一起扫除对这些概念的盲点深入理解网络通信的内在机制。
http://www.hkea.cn/news/14447704/

相关文章:

  • 网站后台管理员密码wordpress 脚注
  • 哪个网站买域名便宜微信小程序云开发收费标准
  • 制作网页的三大技术是哪些网站优化一年多少钱
  • 建设网站公司中如何做阿里巴巴的网站首页
  • 做网站需要招什么职位做分销网站系统下载
  • 零基础可以做网站吗建立网站的准备工作
  • wordpress企业网站下载公众号
  • php与网站开发2021年uc秒懂网址推荐
  • 建设文明网 联盟网站的在线教育网站开发时长
  • 网站设计版权wordpress网站翻译插件
  • 三金网手机网站湛江模板建站软件
  • 大学社团做网站网络营销的推广方法
  • 如何成立一个网站中国最近军事新闻视频
  • 网站做的简单是什么意思一个网站多个域名备案
  • 女人网上量体做衣网站想做一个网站怎么做
  • 自己怎么手机做网站烟台建设科技网站
  • 做电子商务系统网站肥乡专业做网站
  • 专业上海网站建设网站核检单
  • 岳池发展建设集团有限公司门户网站学校做网站需要什么
  • 网络设计图纸是什么搜索引擎优化规则
  • 出口手工艺品网站建设方案大门户wordpress主题
  • 淡水网站建设哪家便宜wordpress免费slider
  • 学习资料黄页网站免费网站需求分
  • 甘肃省建设厅网站asp网站相册
  • 上海工商网站官网微信里的小程序怎么开店
  • 网站制作有限公司铜川市新区建设局网站
  • 微信小程序网站建设推广创建一个自己的公司
  • 网站都要icp备案吗php怎么建立网站
  • 两个域名指向同一个网站网站建设包含什么
  • 网站平台建设需求的意见wordpress产品增加视频