Tag: tcp

使用tcp_nodelay发送大消息时出现奇怪的滞后

我正在写一个交stream程序,通过tcp连接发送一个bash shell的输出。 为了让我的程序更具响应性,我使用setsockopt()来启用TCP_NODELAY,它禁用了Nagle的缓冲algorithm。 这工作很好,除非很less有大消息滞后。 如在,如果消息超过大约500字节(可能是512)。 前500个字节会通过(快速地在小信息中),然后在1-2秒内延迟,其余的一次被接收。 这只发生一次,每10-15次收到一个大消息。 在服务器端,消息一次一个字节地写入套接字,并且所有的字节都可用,所以这种行为对我来说是意想不到的。 我最好的猜测是,有一个512字节的缓冲区在sockets的某个地方导致一个块? 我做了一些时间testing,看看滞后在哪里,我非常确定这是发生滞后的套接字本身。 服务器端的所有数据都是无阻塞地写入的,但客户端收到滞后后的消息结束。 但是我使用getsockopt()来查找套接字的接收和发送缓冲区,它们分别大于512字节 – 66000和130000。 在客户端,我使用express js来接收处理程序中的数据(app.on('data',function(){}))。 但是我读到这个expression函数不会缓冲数据? 有人会猜测为什么会发生这种情况吗? 谢谢!

简单的TCP聊天node.js

我刚接触node.js,来自js背景,我很难理解后台的东西,目前我正在尝试创build简单的控制台聊天。 服务器代码: var net=require("net"); var sockets=[]; net.createServer(function(socket){ sockets.push(socket); socket.on("data",function(data){ posliSpravu(socket,JSON.parse(data)); }); socket.on("close",function(){ console.log(socket + " has disconnected"); sockets.splice(sockets.indexOf(socket),1); }) }).listen(8888); function posliSpravu(from,message){ var msg=JSON.stringify("Niekto povedal : " + message)+'\n'; sockets.forEach(function(incoming_socket){ if(incoming_socket!=from){ incoming_socket.write(msg); } }) } 代码为客户端 var net=require("net"); var client=new net.Socket(); client.connect(8888,function(){ console.log("Connected"); }); process.stdin.resume(); process.stdin.on("data",function(data){ posli(data); }) client.on("data",function(data){ console.log("Recieved data === " + JSON.parse(data)); […]

TCP服务器只能在localhostscheme中使用

我可以在本地主机上的TCP客户端和TCP服务器之间build立一个TCP连接,但是我不能重复同一个networking范围内的不同计算机连接的示例(发件人Windows Server 2012 x64 R2和接收器Windows 10 x64 Pro) 。 TCP服务器是C#应用程序,TCP客户端在node.js中。 我已禁用防病毒和Windows防火墙。 //SERVER C# void Receive() { //tcp_Listener = new TcpListener(IPAddress.Parse("192.168.1.62"), 212); IPAddress localAddr = IPAddress.Parse("0.0.0.0"); tcp_Listener = new TcpListener(localAddr,212); TcpClient clientSocket = default(TcpClient); tcp_Listener.Start(); print("Server Start"); while (mRunning) { // check if new connections are pending, if not, be nice and sleep 100ms if (!tcp_Listener.Pending()){ […]

如何处理与nodejs中的群集的tcp连接

我想了解如何处理nodejs中与群集的TCP连接。 主人如何知道连接应该路由到哪个孩子。 我们需要处理这种情况还是节点本身处理?

在节点js中构build可伸缩的tcp服务器

所以我不确定我的头衔是否是最准确的,但我试图给我最好的补偿。 我最近在面试中被问到这个问题(或多或less,因为我不记得完整的问题,这是我的头顶): 你需要制作一个简单的tcp服务器,可以通过puTTy(或其他任何客户端)访问。 一旦你进入,你需要写: login<用户名>(无所谓用户名)。 一旦你login,你可以做3个操作: showDevices – 将返回设备列表(目前我们有灯和空调) – 我们可以写模拟对象。 我们假设他们有一个数字ID。 切换<deviceId> <on | off> – 打开或closures设备。 SetValue <deviceId> <double> – 设置设备的范围值(空调温度) 重要的事: 分离 – 分离逻辑和通信层。 我们现在使用telenat服务器,但是我们希望将来可以切换到http服务器。 这个过程应该很容易。 可扩展性 – 我们目前有4个操作(login,showDevices,Switch,SetValue) – 编写服务器,以便其他程序员可以很容易地添加另一个操作。 代码应该是不言自明的 任务可以用任何语言书写。 我试图用C#编写,直到我被卡住,无法继续。 最近我更多地进入Node js,并决定再给这个…所以我问你们这个解决scheme一些有用的直接。 如何在通信和逻辑层之间最好地分离? 有什么样的devise模式,我应该实现添加命令更容易? (我看了一下命令devise模式,我不能想象这是否意味着这种情况) 任何能够让我走上正轨的东西(没有告诉我究竟该做什么)将不胜感激。 谢谢!

pipe理多个TCP套接字nodejs

我有一个这样的数组: var exports = module.exports = {}; var net = require('net'); exports.config = [ { ip: "127.0.0.1", id: 1, socket: new net.Socket(), data: "", }, { ip: "192.168.5.242", id: 2, socket: new net.Socket(), data: "", } ]; 我试图用这个代码连接每个这个项目与TCP套接字: for(var key in tornelli.config) { tornelli.config[key].socket.connect(4000, tornelli.config[key].ip, function() { console.log('CONNECTED TO: '+tornelli.config[key].ip); }); tornelli.config[key].socket.on('data', function(data) { ……….. […]

使用SSL over TCP通过NodeJSbuild立两个服务器之间的安全连接

我试图从一个服务器发送一个包到另一个,但我需要确保发件人是“真正的”,包不能被拦截,我怎么能做到这一点使用SSL与NodeJS或其他方式。 这就是我所做的: 服务器代码: server = tls.createServer(function(c) { console.log('server connected', c.authorized ? 'authorized' : 'unauthorized'); }); 客户代码: var tls = require('tls'); var fs = require('fs'); var options = { key : fs.readFileSync('server.key'), cert : fs.readFileSync('server.crt') }; var client = tls.connect(9838, options, function () { console.log(client.authorized ? 'Authorized' : 'Not authorized'); }); 这个错误出来了: Error: 101057795:error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv handshake […]

如何使用Elastic Load Balancer和Node.js(HTTP和TCP)正确运行Amazon EC2?

我的目标 :运行2台服务器,用于我的Web应用程序的HTTP服务器和用于处理我的TCP客户端的TCP服务器,并使用SSL。 我希望ELB为HTTP处理SSL和我的应用程序来处理TCP服务器的SSL连接 (我只使用TCP服务器的自签名证书), 这是我迄今为止 我的HTTP服务器是一个带有Express的Node.js HTTP服务器。 我想encryption所有的连接,发现我可以通过亚马逊的证书pipe理器获得一个免费的SSL证书。 但是,我发现我需要Elastic Load Balancer。 所以我决定一个,比我预料的更痛苦。 我在为Web应用程序工作时遇到问题。 这个想法是,负载平衡器终止来自客户端的所有SSL连接,并将未encryption的数据发送到80以上的后端EC2机器.jar HTTP.jsp服务器正在侦听80。 这是我的HTTP服务器文件app.js var express = require('express'); var http = require('http'); var servestatic = require('serve-static'); var app = express(); var bodyParser = require('body-parser'); var flash = require('connect-flash'); var morgan = require('morgan'); var cookieParser = require('cookie-parser'); var session = require('express-session'); var cacheResponseDirective = […]

什么超时types是由net.connect.setTimeout – 连接或套接字?

我正在读一本书,那里有一段话: 默认情况下,套接字没有超时。 这可能是不好的,因为如果networking或远程主机发生故障,连接将无限期地闲置。 但是,您可以使用setTimeout()方法在套接字上定义一个超时值。 setTimeout()的这个版本以毫秒为单位超时作为第一个参数。 如果套接字空闲了这段时间,就会发出超时事件。 以下是我在网上阅读的内容: 连接超时仅在启动TCP连接时发生。 这通常发生在远程机器没有应答的情况下。 这意味着服务器已closures,您使用错误的IP / DNS名称或服务器的networking连接已closures。 套接字超时专用于监视连续传入的数据stream。 如果数据stream在指定的超时时间内中断,连接将被视为停止/中断。 等待单个数据包时是超时。 这是一个常见的误解,套接字超时是接收完整响应的超时。 所以,如果套接字超时为1秒,响应包含3个IP数据包,每个响应数据包需要0.9秒才能到达,总响应时间为2.7秒,则不会有超时。 所以我们正确地假设在Node.js net.connect.setTimeout使用的net.Socket实际上是一个套接字超时 ?

进程之间的通信:tcp vs unix套接字,ipc vs nats

我打破了一个大的应用程序到几个进程,我希望每个进程相互沟通。 现在它将在同一台服务器上,但后来在同一个本地networking上的几台服务器将有几个进程需要互相通信。 (指一台服务器上的服务,在同一个vpc上的服务在其他服务器上) 所以..我的原始选项是tcp或unix sockets 。 我知道,使用Unix套接字只有在同一台服务器上才有用。 但是我们正在考虑编写自己的实现,在相同的服务器进程上将在unix套接字上进行通信,并在使用tcp进行通信的服务器之间进行通信。 这值得么 ? 当然,TCP套接字是慢的,然后unix套接字..因为它不通过networking,并没有得到封装与TCP相关的数据。 问题是多less? 我无法findtcp和unix套接字之间的基准testing的在线certificate。 如果tcp增加了3%-5%的开销,那很酷,但可以更多吗? 我想多年来从别人的大项目经验中学习,但没有find任何相关的东西。 下一个… 我们的项目是一个NodejS项目。 有些人可能会说,我可以使用经纪人的消息,所以我尝试使用nats.io相比node-ipc( https://www.npmjs.com/package/node-ipc ),我发现了node-ipc速度提高了4倍,但是nats有很酷的发布 – 订阅function…但是性能很重要。 所以我有很多的select,没有具体的决定。 任何有关这个问题的信息将不胜感激。