Hey Ryan,
On Sunday, January 29, 2017 at 8:04:42 PM UTC+1, Ryan Phillips wrote:
>
> Hey Jörg,
>
> In your doConnect function you will want to instantiate a new socket
> there. You can't reuse the same socket instance.
>
I changed my client implementation and it seems to work now:
local fs = require('fs')
local spawn = require('childprocess').spawn
local net = require('net')
local args = {
"-M",
"-D", "record_left",
"-t", "raw",
"-c", "1",
"-r", "48000",
"-f", "S16_LE",
}
local function doConnect()
local arecord
local sock
local ip = "192.168.0.101"
local port = 1234
if not ip or not port then return end
print(string.format("Connecting to %s:%s", ip, port))
sock = net.createConnection(port, string.format("%s", ip))
sock:on("connect", function (err)
if err then print("Connection error:", err) end
print("Connected")
arecord = spawn("arecord", args)
arecord:on("error", function(err)
print("Spawn error:", err)
end)
arecord:on("exit", function(exit_status)
print("Exit with " .. exit_status)
sock:setTimeout(1000, doConnect)
end)
arecord.stdout:on('data', function(data)
sock:write(data)
end)
arecord.stderr:pipe(process.stderr)
end)
sock:on("error", function(err)
if err then
print("Socket error:", err)
if arecord then
arecord:kill('sigkill')
else
sock:setTimeout(1000, doConnect)
end
end
end)
end
doConnect()
However, I am not sure if it is done correct. Maybe this implementation
still has some flaws?
> On Wed, Jan 18, 2017 at 10:52 AM, Jörg Krause <[email protected]
> <javascript:>> wrote:
>
>> Hi,
>>
>> I am trying to implement a client which tries to reconnect to server if,
>> for whatever reason, is not available sometimes. My application is about
>> piping the stdout of arecord to a TCP socket on a server. The application
>> works fine, but is not bullet-proof if the server is not ready or is
>> restarted. I want the client to reconnect to the server, without the need
>> of a process monitor on the client side.
>>
>> I found a similar nodejs example:
>> https://gist.github.com/sio2boss/6334089
>>
>> local spawn = require('childprocess').spawn
>> local net = require('net')
>>
>> local args = {
>> "-M",
>> "-D", "hw:0,1",
>> "-t", "raw",
>> "-c", "2",
>> "-r", "48000",
>> "-f", "S16_LE",
>> }
>>
>> local sock
>> sock = net.Socket:new()
>>
>> local function doConnect()
>> print("Connecting...")
>>
>> sock:connect(1234, '192.168.1.157')
>> end
>>
>> local function onConnect()
>> print("Connected")
>> local arecord
>>
>> arecord = spawn("arecord", args)
>>
>> arecord:on("error", function(err)
>> print("Spawn error:", err)
>> end)
>> arecord:on("exit", function(exit_status)
>> print("Exit with " .. exit_status)
>> end)
>>
>> arecord.stdout:pipe(sock)
>> arecord.stderr:pipe(sock)
>> end
>>
>> local function onError(err)
>> print("Socket error:", err)
>> if err == 'ECONNREFUSED' then
>> sock:setTimeout(1000, doConnect)
>> elseif err == 'EPIPE' then
>> sock:setTimeout(1000, doConnect)
>> end
>> end
>>
>> sock:on("connect", onConnect)
>> sock:on("error", onError)
>>
>> doConnect()
>>
>>
>> The client tries one time to reconnect, but not more:
>>
>> # luvit client.lua
>> Connecting...
>> Socket error: ECONNREFUSED
>> Connecting...
>> #
>>
>> Any idea what is wrong with my code?
>>
>> Best regards,
>> Jörg Krause
>>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "luvit" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to [email protected] <javascript:>.
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>
--
You received this message because you are subscribed to the Google Groups
"luvit" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.