充分利用资源,非阻塞的Socket链接

服务器编程心得(四)—— 如何将socket设置为非阻塞模式 只要将accept4()最后一个参数flags设置成SOCK_NONBLOCK即可。3. 除了创建socket时,将socket设置成非阻塞模式,还可以通过以下API函数来设置:参考:),linux下如果调用fcntl()设置socket为非阻塞模式,不仅要设置O_NONBLOCK模式,还需要在接收和发送数据时,需要使用MSG_DONTWAIT标志,即在recv,recvfrom和send,sendto数据时,将flag设置为MSG_DONTWAIT。 阅读详情
我们建立普通的Socket时,我们必须等待连接建立成功,才能继续下一步工作,比如常见的代码如下
  1.       System.out.println("普通建立连接....");
  2.       Socket socket = new Socket("www.java2000.net", 80);
  3.       System.out.println(socket.isConnected());
我们的代码,必须等待第二行完成后,才能继续运行。如果对方服务器比较慢,则会有比较长的时间处于阻塞状态。

下面的代码使用SocketChannel实现了非阻塞的链接。
  1. package net.java2000.nio;
  2. import java.io.IOException;
  3. import java.net.InetSocketAddress;
  4. import java.net.Socket;
  5. import java.nio.channels.SocketChannel;
  6. /**
  7.  * 非阻塞的Socket链接。<br>
  8.  * 可以在链接建立期间做一些别的操作。
  9.  * 
  10.  * @author 赵学庆,Java世纪网(java2000.net)
  11.  * 
  12.  */
  13. public class SocketNonBlock {
  14.   /**
  15.    * 创建一个非阻塞的Socket通道。
  16.    * 
  17.    * @param hostName
  18.    *          主机
  19.    * @param port
  20.    *          端口
  21.    * @return Socket端口
  22.    * @throws IOException
  23.    */
  24.   public static SocketChannel createSocketChannel(String hostName, int port)
  25.       throws IOException {
  26.     SocketChannel sChannel = SocketChannel.open();
  27.     sChannel.configureBlocking(false);
  28.     sChannel.connect(new InetSocketAddress(hostName, port));
  29.     return sChannel;
  30.   }
  31.   public static void main(String[] args) {
  32.     try {
  33.       System.out.println("普通建立连接....");
  34.       Socket socket = new Socket("www.java2000.net", 80);
  35.       System.out.println(socket.isConnected());
  36.       // 创建链接
  37.       SocketChannel sChannel = createSocketChannel("www.java2000.net", 80);
  38.       // 可以通过判断是否连接,在链接成功建立前做一些其它的事情
  39.       while (!sChannel.finishConnect()) {
  40.         System.out.println("等待非阻塞连接建立....");
  41.         try {
  42.           Thread.sleep(10);
  43.         } catch (InterruptedException e) {
  44.           e.printStackTrace();
  45.         }
  46.       }
  47.       System.out.println(sChannel.isConnected());
  48.     } catch (IOException e) {
  49.       e.printStackTrace();
  50.     }
  51.   }
  52. }

运行结果
普通建立连接....
true
等待非阻塞连接建立....
等待非阻塞连接建立....
true


总结:
    非阻塞链接,可以让我们在等待链接建立期间做一些其它的工作,至少可以用来显示正在连接的一些动画啥的。

Socket 与 Android Socket AIO 库 Naga 的介绍 Socket介绍 Socket相关概念 应用场景 非阻塞IO复用 性能比较 Naga Socket 库 Nage 运行构架图 架构介绍 架构流程 Naga Socket Client 代码 小结最近项目要求Android客户端使用Socket,所以把Android平台能够使用的Socket调研了一下:Socket介绍Socket分为如下几种:BIO、NIO、AIO,在了解每种Socket之前,首先要 阅读详情

相关推荐

Socket程序从windows移植到linux下需要注意的

)头文件 windows下winsock.h或winsock2.hlinux下netinet/in.h(大部分都在这儿),unistd.h(close函数在这儿),sys/socket.h(在in.h里已经包含了,可以省了)2)初始化windows下需要用WSAStartup启动Ws2_32.lib,并且要用#pragma comment(lib,"Ws2_32")来告知编译器链接该lib。linux下不需要3)关闭socketwindows下closesocket(...)linux下close(...)

lhuoshan的专栏 4120

Laravel 即时应用的一种实现方式 Websocket

https://laravel-china.org/topics/2566/an-implementation-of-laravel-real-time-application

---------------- 1万+

C++多线程非阻塞Socket服务端:支持单发/广播通信与连接自动清理

一套开箱即用的C++网络通信示例,专为Code::Blocks环境优化,不依赖第三方库。服务器采用非阻塞Socket模型,主线程响应控制台指令,独立线程分别负责监听新连接、循环接收各客户端数据、按需向指定客户端发送消息或向所有在线客户端广播、定期回收已断开连接的资源。配套完整客户端(client.cpp)、服务端核心(server.cpp、main.cpp)、头文件(client.h/server.h/sclient.h)、工程配置(.cbp/.depend/.layout)、Shell脚本(compile

o4p5q6r7s的博客 259

php socket laravel,在 Laravel 中使用 Workerman 进行 socket 通讯 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社...

[在 Laravel 中使用 Workerman 进行 socket 通讯 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区]1.安装 Workerman由于要使用客户端点对点通讯,选择了 workerman/gateway-worker 的扩展包,它已经引入了 workerman/workerman 。$ composer require workerm...

weixin_29416459的博客 1456

【实战解析】RTL8306MB交换芯片驱动开发中的RMII接口调试陷阱

本文通过一个RTL8306MB交换芯片驱动开发的实战案例,深入剖析了RMII接口调试中的经典陷阱。文章详细描述了因TX_EN与CRS_DV信号线交叉连接错误导致的“静默”故障,并分享了使用逻辑分析仪和示波器进行硬件排查的完整流程与核心技巧,为嵌入式网络驱动开发提供了宝贵的避坑指南。

weixin_29267307的博客 421

STRING数据库的蛋白质相互作用(PPI)网络分析

在转录调控相关的文献中,我们经常能够看到这样的蛋白质相互作用网络(protein protein interaction network,PPI network)。具体而言,这些相关的文献中首先通过RNA-seq、表达谱芯片或者蛋白质组分析等,找到了在不同分组样本间一系列的差异表达基因或蛋白。

weixin_43029125的博客 9458

非阻塞socket的连接 connect

连接套接字,阻塞的套接字超时时间很长无法接受,而是用非阻塞套接字时使用的方案也有多种。后者是个比较好的方法 方案1:不断重试,直到连接上或者超时: int connect_socket_timeout(int sockfd,char *dest_host, int port, int timeout) {   struct sockaddr_in address;   struct

tycoon的专栏 5183

LWIP协议栈在STM32H7上的内存优化实战:如何用32KB RAM实现稳定千兆以太网通信

本文深入探讨了在STM32H7微控制器上,如何通过内存优化策略,在仅32KB的D2 SRAM中稳定运行LWIP协议栈以实现千兆以太网通信。文章详细分析了STM32H7的内存架构、LWIP的内存消耗瓶颈,并提供了从描述符表与PBUF池精确分配、链接脚本修改到MPU区域划分的一整套实战优化方案,旨在解决大数据量传输卡死等常见配置问题。

gg901的博客 605

在 Laravel6 中使用 基于Workerman 的Gateway-worker进行 socket 长连接通讯

1、安装gateway-worker gateway-worker 它已经引入了 workerman/workerman. composer require workerman/gateway-worker composer require workerman/gatewayclient 2. 创建 Workerman 启动文件 创建一个 artisan 命令行工具来启动Socket服务端,在 app/Console/Commands 目录下建立命令行文件。 php artisan mak..

fzxyxf1314的博客 3232

uniapp 使用摄像头 live-pusher (APP)

uniapp 中开发 app 时使用live-pusher踩过的坑

随身笔记 1万+

网易CodeWave智能生成应用实战:5分钟搞定库存管理系统(附详细配置截图)

本文详细介绍了如何利用网易CodeWave智能生成应用在5分钟内快速构建定制化库存管理系统。通过自然语言描述需求,无需编程即可生成包含产品管理、库存预警等核心功能的应用,并支持字段微调、业务流程注入等深度优化。文章附有详细配置截图,帮助用户高效实现数字化转型。

julia4scientist的博客 889

JAVA技巧(充分利用资源,非阻塞的Socket链接)

  我们建立普通的Socket时,我们必须等待连接建立成功,才能继续下一步工作,比如常见的代码如下   System.out.println("普通建立连接....");   Socket socket = new Socket("www.java2000.net", 80);   System.out.println(socket.isConnected());    我们的代码,必须等...

I'm Kree 175

把MinerU集成到Dify

本文介绍了如何将本地部署的MinerU与Dify平台进行集成。首先需要确保Dify和MinerU在Docker环境中正常运行,并通过配置虚拟网络实现互联。然后详细说明了在Dify平台安装MinerU插件的步骤,包括从插件市场搜索安装、配置连接参数等关键操作。特别强调了要等待MinerU容器完全启动(healthy状态)后再进行Dify配置,否则会出现连接错误。通过简单的URL指向和API密钥设置,用户即可实现Dify平台与本地MinerU算力网络的对接,为后续的AI应用开发提供基础支持。

lyxerlau的博客 315

linux 客户端 Socket 非阻塞connect getsockopt不可用

转载自:点击打开链接 开发测试环境:虚拟机CentOS,windows网络调试助手         非阻塞模式有3种用途         1.三次握手同时做其他的处理。connect要花一个往返时间完成,从几毫秒的局域网到几百毫秒或几秒的广域网。这段时间可能有一些其他的

兼容并蓄终宽阔,若谷虚怀鱼自游 8523

cesium 淹没分析

cesium淹没分析

God's asylum的博客 483

AutoSAR_BSW高阶 7. Signal Group 信号组

Autosar BSW的高级配置是实现复杂汽车电子系统的关键步骤之一。通过合理配置信号组和使用适当的参数,您可以提高系统性能,确保数据的可靠传输。在本博客中,我们深入探讨了信号组的概念和高级配置参数,并提供了示例代码,希望这些信息能够帮助您更好地理解和应用Autosar BSW的高级配置。如果您在配置过程中遇到任何问题,不妨寻求专业支持,以确保您的汽车电子系统能够顺利运行。Autosar COM 模块是一个广泛应用于汽车行业的关键技术,它使不同的电子控制单元能够有效地通信和协作。

一直在水些技术小文 663

单线程-非阻塞-长链接

1. 基础框架 def main(): pass if __name__ == '__main__': main() 复制代码2. 创建服务器socket tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) tcp_server_socket.setsockopt(socket.SOL_SOC...

weixin_33851177的博客 298

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Kqueue 实现非阻塞 Socket 通信

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34403693的博客 369

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

网络编程(9): 是否要将侦听socket设置为非阻塞

是否要将侦听socket设置为非阻塞

yubaoaihh 248

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

非阻塞 socket + epoll 边缘触发模式下的 TCP server 端单线程简单模型

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <sys/epoll.h> #include <arpa/inet.h> #include ...

frodocheng的博客 150

同步异步,阻塞非阻塞,进程间通信

文章目录同步(synchronous),异步(asynchronous)阻塞(blocking),非阻塞(non-blocking)(这里指系统的io操作)进程,线程,一二进程间通信的方式管道匿名管道(pipe)命名管道(FIFO)消息队列共享内存信号信号量socket软链接和硬链接inode块软链接接和硬链接 同步(synchronous),异步(asynchronous) 同步:发起一个请求后...

zhendeshifeng的博客 2615

MFC、Socket

SETSOCKOPT IOCTLSOCKET 设置非阻塞SOCKET函数 http://www.cnblogs.com/endeavour/archive/2011/11/18/2253529.html WSAAsyncSelect function https://msdn.microsoft.com/en-us/library/ms741540(VS.85).aspx

liuhuashui123的专栏 446
上一篇: 一代名导谢晋叶落归根
下一篇: 从SocketChannel读取数据
老紫竹
博客等级 码龄19年 1万+粉丝 1252原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值