iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >使用nodejs怎么对tcp连接进行处理
  • 705
分享到

使用nodejs怎么对tcp连接进行处理

2023-06-06 14:06:12 705人浏览 八月长安
摘要

今天就跟大家聊聊有关使用nodejs怎么对tcp连接进行处理,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。int uv_tcp_listen(uv_tcp_t* 

今天就跟大家聊聊有关使用nodejs怎么对tcp连接进行处理,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

int uv_tcp_listen(uv_tcp_t* tcp, int backlog, uv_connection_cb cb) { // 设置处理的请求的策略,见下面的分析 if (single_accept == -1) {  const char* val = getenv("UV_TCP_SINGLE_ACCEPT");  single_accept = (val != NULL && atoi(val) != 0);  } if (single_accept)  tcp->flags |= UV_HANDLE_TCP_SINGLE_ACCEPT; // 执行bind或设置标记 err = maybe_new_Socket(tcp, AF_INET, flags); // 开始监听 if (listen(tcp->io_watcher.fd, backlog))  return UV__ERR(errno); // 设置回调 tcp->connection_cb = cb; tcp->flags |= UV_HANDLE_BOUND; // 设置io观察者的回调,由epoll监听到连接到来时执行 tcp->io_watcher.cb = uv__server_io; // 插入观察者队列,这时候还没有增加到epoll,poll io阶段再遍历观察者队列进行处理(epoll_ctl) uv__io_start(tcp->loop, &tcp->io_watcher, POLLIN); return 0;}

我们看到,当我们createServer的时候,到Libuv层就是传统的网络编程的逻辑。这时候我们的服务就启动了。在poll io阶段,我们的监听型的文件描述符和上下文(感兴趣的事件、回调等)就会注册到epoll中。正常来说就阻塞在epoll。那么这时候有一个tcp连接到来,会怎样呢?epoll首先遍历触发了事件的fd,然后执行fd上下文中的回调,即uvserver_io。我们看看uvserver_io。

void uv__server_io(uv_loop_t* loop, uv__io_t* w, unsigned int events) { // 循环处理,uv__stream_fd(stream)为服务器对应的fd while (uv__stream_fd(stream) != -1) {  // 通过accept拿到和客户端通信的fd,我们看到这个fd和服务器的fd是不一样的  err = uv__accept(uv__stream_fd(stream));  // uv__stream_fd(stream)对应的fd是非阻塞的,返回这个错说明没有连接可用accept了,直接返回  if (err < 0) {   if (err == UV_EAGaiN || err == UV__ERR(EWOULDBLOCK))    return;  }  // 记录下来  stream->accepted_fd = err;  // 执行回调  stream->connection_cb(stream, 0);    if (stream->accepted_fd != -1) {   uv__io_stop(loop, &stream->io_watcher, POLLIN);   return;  }   if (stream->type == UV_TCP &&    (stream->flags & UV_HANDLE_TCP_SINGLE_ACCEPT)) {   struct timespec timeout = { 0, 1 };   nanosleep(&timeout, NULL);  } }}

从uv__server_io,我们知道Libuv在一个循环中不断accept新的fd,然后执行回调,正常来说,回调会消费fd,如此循环,直到没有连接可处理了。接下来,我们重点看看回调里是如何消费fd的,大量的循环会不会消耗过多时间导致Libuv的事件循环被阻塞一会。tcp的回调是c++层的OnConnection。

// 有连接时触发的回调template <typename WrapType, typename UVType>void ConnectionWrap<WrapType, UVType>::OnConnection(uv_stream_t* handle,                          int status) { // 拿到Libuv结构体对应的c++层对象                           WrapType* wrap_data = static_cast<WrapType*>(handle->data); CHECK_EQ(&wrap_data->handle_, reinterpret_cast<UVType*>(handle)); Environment* env = wrap_data->env(); HandleScope handle_scope(env->isolate()); Context::Scope context_scope(env->context()); // 和客户端通信的对象 Local<Value> client_handle; if (status == 0) {  // Instantiate the client javascript object and handle.  // 新建一个js层使用对象  Local<Object> client_obj;  if (!WrapType::Instantiate(env, wrap_data, WrapType::SOCKET)       .ToLocal(&client_obj))   return;  // Unwrap the client javascript object.  WrapType* wrap;  // 把js层使用的对象client_obj所对应的c++层对象存到wrap中  ASSIGN_OR_RETURN_UNWRAP(&wrap, client_obj);  // 拿到对应的handle  uv_stream_t* client = reinterpret_cast<uv_stream_t*>(&wrap->handle_);  // 从handleaccpet到的fd中拿一个保存到client,client就可以和客户端通信了  if (uv_accept(handle, client))   return;  client_handle = client_obj; } else {  client_handle = Undefined(env->isolate()); } // 回调js,client_handle相当于在js层执行new TCP Local<Value> argv[] = { Integer::New(env->isolate(), status), client_handle }; wrap_data->MakeCallback(env->onconnection_string(), arraysize(argv), argv);}

代码看起来很复杂,我们只需要关注uv_accept。uv_accept的参数,第一个是服务器对应的handle,第二个是表示和客户端通信的对象。

int uv_accept(uv_stream_t* server, uv_stream_t* client) { int err; switch (client->type) {  case UV_NAMED_PIPE:  case UV_TCP:   // 把fd设置到client中   err = uv__stream_open(client,              server->accepted_fd,              UV_HANDLE_READABLE | UV_HANDLE_WRITABLE);   break; // ... } client->flags |= UV_HANDLE_BOUND; // 标记已经消费了fd server->accepted_fd = -1; return err;}

uv_accept主要就是两个逻辑,把和客户端通信的fd设置到client中,并标记已经消费,从而驱动刚才讲的while循环继续执行。对于上层来说,就是拿到了一个和客户端的对象,在Libuv层是结构体,在c++层是一个c++对象,在js层是一个js对象,他们三个是一层层封装且关联起来的,最核心的是Libuv的client结构体中的fd,这是和客户端通信的底层门票。最后回调js层,那就是执行net.js的onconnection。onconnection又封装了一个Socket对象用于表示和客户端通信,他持有c++层的对象,c++层对象又持有Libuv的结构体,Libuv结构体又持有fd。

const socket = new Socket({  handle: clientHandle,  allowHalfOpen: self.allowHalfOpen,  pauseOnCreate: self.pauseOnConnect,  readable: true,  writable: true });

看完上述内容,你们对使用nodejs怎么对tcp连接进行处理有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注编程网精选频道,感谢大家的支持。

--结束END--

本文标题: 使用nodejs怎么对tcp连接进行处理

本文链接: https://www.lsjlt.com/news/247297.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 使用nodejs怎么对tcp连接进行处理
    今天就跟大家聊聊有关使用nodejs怎么对tcp连接进行处理,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。int uv_tcp_listen(uv_tcp_t* ...
    99+
    2023-06-06
  • Nodejs中怎么对错误进行处理
    今天就跟大家聊聊有关Nodejs中怎么对错误进行处理,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。假设我们有以下代码const net&n...
    99+
    2024-04-02
  • 使用JDBC怎么对ORACLE进行连接
    本篇文章给大家分享的是有关使用JDBC怎么对ORACLE进行连接,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。格式一: Oracle JDBC...
    99+
    2024-04-02
  • NodeJs中怎么对数据库异常进行处理
    NodeJs中怎么对数据库异常进行处理,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。数据库链接错误使用nodejs处理异常最麻...
    99+
    2024-04-02
  • 使用Python怎么对Excel进行处理
    本篇文章为大家展示了使用Python怎么对Excel进行处理,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。python是什么意思Python是一种跨平台的、具有解释性、编译性、互动性和面向对象的脚本...
    99+
    2023-06-07
  • Nodejs怎么进行多线程处理
    这篇文章主要介绍Nodejs怎么进行多线程处理,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Threads à gogo 是nodejs 的原生模块,使用这个模块可以让nodejs 具备多线程处理功能。【推荐学习:《...
    99+
    2023-06-15
  • 使用Canvas怎么对图片进行处理
    这篇文章给大家介绍使用Canvas怎么对图片进行处理,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、主要API整个流程中所用到的主要Canvas API有:绘制图像: drawImage()获取图像数据: getIm...
    99+
    2023-06-09
  • 使用Ajax怎么对缓存进行处理
    使用Ajax怎么对缓存进行处理?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。什么是ajaxajax是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术,可以通过在后台与...
    99+
    2023-06-08
  • MySQL怎么使用Python进行连接
    一、表格与键概念主键:可唯一表示该资料(可以设置多个列表为主键)设置外键进行表与表的相连,且外键必须是其他表的主键(外键也可以设置自己表格的主键)二、创建资料库CREATE DATABASE `sql_tutorial`; --创建资...
    99+
    2023-05-14
    Python MySQL
  • 在Java中怎么利用代理对网络进行连接
    在Java中怎么利用代理对网络进行连接?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。需求是这样的:一、界面上要有这样几种代理类型可以选。HTTP代理 Socks...
    99+
    2023-05-31
    java ava
  • 使用MyBatis怎么对Spring进行无缝对接
    本篇文章给大家分享的是有关使用MyBatis怎么对Spring进行无缝对接,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1.为什么会出现MyBatis-SpringSpring...
    99+
    2023-05-31
    mybatis spring
  • 怎么java中使用Thumbnails对图片进行处理
    这篇文章给大家介绍怎么java中使用Thumbnails对图片进行处理,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Thumbnails支持:指定大小进行缩放按照比例进行缩放不按照比例,指定大小进行缩放旋转水印裁剪转化...
    99+
    2023-06-08
  • 使用python怎么对表格数据进行处理
    这篇文章给大家介绍使用python怎么对表格数据进行处理,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。python对Excel表格的处理首先我们看一个最简单的情况,我们先不考虑性能的问题,那么我们可以使用xlrd这个工...
    99+
    2023-06-14
  • 使用springmvc怎么对模型数据进行处理
    使用springmvc怎么对模型数据进行处理?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。springmvc提供了四种方式来输出模型数据ModelAndView...
    99+
    2023-06-06
  • 怎么使用PHP MySQL进行数据连接
    小编给大家分享一下怎么使用PHP MySQL进行数据连接,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!PHP MySQL 连接一起学习PHP MySQL 连接方式...
    99+
    2023-06-15
  • Android应用怎么利用wifi对手机进行连接
    Android应用怎么利用wifi对手机进行连接?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。首先电脑,手机连接同一个网络在Android studio中Terminal中...
    99+
    2023-05-31
    android wifi roi
  • 怎么在python中使用moviepy对视频进行处理
    本篇文章为大家展示了怎么在python中使用moviepy对视频进行处理,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研...
    99+
    2023-06-08
  • 怎么在python中使用except对异常进行处理
    本篇文章为大家展示了怎么在python中使用except对异常进行处理,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。python有哪些常用库python常用的库:1.requesuts;2.scra...
    99+
    2023-06-14
  • 使用Rest如何对API进行处理
    这篇文章给大家介绍使用Rest如何对API进行处理,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、项目目标动静分离的架构,即客户端和服务器端的分离,客户端可以是IOS、android或者静态的页面。需要服务器端提供w...
    99+
    2023-05-31
    rest api
  • 利用Hadoop怎么对多Job进行并行处理
    利用Hadoop怎么对多Job进行并行处理?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。首先做如下配置:修改mapred-site.xml添加调度器配置:<propert...
    99+
    2023-05-30
    hadoop job
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作