Page 8 of 9
Re: sock.lua - A simple networking library for LÖVE
Posted: Tue Jul 11, 2017 10:36 pm
by Nixola
A thread is "killed" when it returns; that should be enough.
Re: sock.lua - A simple networking library for LÖVE
Posted: Tue Jul 11, 2017 10:40 pm
by Ikroth
4aiman wrote: ↑Tue Jul 11, 2017 10:17 pm
Sir_Silver wrote: ↑Tue Jul 11, 2017 8:01 pm
I believe that, once you've yielded the coroutine...
I'm using love.thread rather than coroutines.
Actually, there's no way to kill a server too - no server:stop() or any other equivalent.
Not sure nilling will do the job and underlying eNet will acknowledge the fact that the nilled server is no more.
So, now there're 2 things I need to be able to kill in reasonable time (of several minutes perhaps?)
You can destroy the server using this function:
https://camchenry.com/sock.lua/#Server:destroy
Re: sock.lua - A simple networking library for LÖVE
Posted: Wed Jul 12, 2017 8:52 am
by 4aiman
Nixola wrote: ↑Tue Jul 11, 2017 10:36 pm
A thread is "killed" when it returns; that should be enough.
Except when an error occurs in a thread. Then it (a thread) seems to not exit at all. I can do thread:getError() as many times as I want till the rest of the lifespan of the main app that has created that thread in the first place.
Wow! How could I possibly overlook that? Thanks a lot! At least now I can make thread stop via sock's server message.
It feels wrong to continue to discuss my threads-related problems here. I've made a different thread
here. Please, visit it if you want to help ^_^
Re: sock.lua - A simple networking library for LÖVE
Posted: Sat Jul 15, 2017 10:39 pm
by 4aiman
Is there a way to know the progress of data transmitting?
Say, I'm sending a file of 10Mb.
I need to give some feedback to a client.
Currently it's just a flashing message "Getting updates", but how about a progress bar?
I'm sending data like this:
Code: Select all
client:send("here's your data",binary_data)
I'm fine with sending messages from server like
Code: Select all
client:send("progress",percentage)
, but how is it possible to know the percentage?
Do I have to manually split that binary_data into pieces?
P.S. Sorry for double post, but this post has a different question
Re: sock.lua - A simple networking library for LÖVE
Posted: Mon Jul 17, 2017 3:13 am
by Nuthen224
I have some suggestions. Maybe a simpler way would be to just make a guess of how long it will take. You could perhaps calculate a guess based on ping and file size.
If you are sending percentage updates from the server, ensure that is sent over a different channel than the file data or the progress updates wouldn't get sent until after the file is done sending.
Perhaps you could even have the server store the average download time for that file and use that.
Or instead of sending that from the server, instead tell the client the file size in advance and it can calculate the guess.
I don't think there's any need for an exact measurement. Even if you split up the file into pieces and calculated the percent that way, it would fill up the progress bar inconsistently, since the internet is inconsistent. With the way I mentioned, it would increase the percent linearly at least, but it might have finished the file download before it is at 100% if it was an overestimate. Or it would hang at 100% momentarily if it was an underestimate.
Re: sock.lua - A simple networking library for LÖVE
Posted: Mon Jul 17, 2017 2:05 pm
by 4aiman
Uhmm...
I've studied undelying enet lib's articles on the wiki.
It seems threre's no way to send percentage updates, since I can't control how enet splits a huge 20Mb file into tiny packets. Sock counts packets, true, but it calls any message a packet - be it a number or a serialized bunary data of 20+Mb.
On the other hand, sending every file separately increases bandwith (needs measurment) and complexity of a client-server communication. I don't want the latter
But I like the idea of estimating.
There's setBandwidth method for a server, I think I can use that to calculate sending time server-side and give that to a client.
Is it worth determining max bandwidth of a hardware connection (presumably using some online service upon server startup) to make my estimates closer to real times, or I can get away with you-run-a-server-so-those-are-your-problems thinking?
Now's the only problem (since threads' behaviour got explained by a number of community members) is the time that server needs to launch yet another thread. Could use some profiling lib, probably.
Thanks, Nuthen224!
Re: sock.lua - A simple networking library for LÖVE
Posted: Sun Jun 17, 2018 3:49 am
by Sir_Silver
I'm trying to create a multiplayer game where a person can enter an ip and port to try to connect to a server, but if the ip is something that sock, or rather enet, doesn't like, for instance "192.", then it will crash with an error like "Unable to parse host name", or something like that. Is there a way to make it so that sock.lua won't throw this kind of an error if a bad ip is passed, or is the only solution here to try to make it so only viable ip can be passed?
Re: sock.lua - A simple networking library for LÖVE
Posted: Sun Jun 17, 2018 10:23 am
by bartbes
Can't you just use pcall?
Re: sock.lua - A simple networking library for LÖVE
Posted: Sun Jun 17, 2018 11:10 am
by Sir_Silver
Yes I can. Thanks for the reminder that that is a thing!
Re: sock.lua - A simple networking library for LÖVE
Posted: Wed Jul 25, 2018 10:10 pm
by Shadowblitz16
what am i doing wrong? I keep getting error during service and can;'t serialize message: serialize was not sent
Code: Select all
net = require "lib.sock"
local id = ""
local joined = false;
local server = net.newServer("localhost", 50301)
local client = net.newClient("localhost", 50302)
local messages = {}
local message = ""
function clientConnect(id)
clientSendMessage(id, "has connected")
joined = true
end
function clientSendMessage(id, message)
client:send("message", {id, message})
end
function serverGetMessage(id, message)
server:sendToAll("message", {id, message})
end
function clientGetMessage(id, message)
message = ""
table.insert(messages, message)
end
function love.load(dt)
server:on("message", serverGetMessage(id, message))
client:on("message", clientGetMessage(id, message))
client:connect()
end
function love.keypressed(key, scancode, isrepeat)
if joined == false then
if key == "return" then clientConnect(id)
elseif key == "space" then id = id .. " "
else id = id .. key
end
else
if key == "return" then clientSendMessage(id, message)
elseif key == "space" then message = message .. " "
else message = message .. key
end
end
end
function love.update()
server:update()
client:update()
end
function love.draw()
love.graphics.clear(0,0,0,1)
love.graphics.setColor(0.1,0.1,0.1,1)
love.graphics.rectangle("fill",0,480-16,640,480)
love.graphics.setColor(1,1,1,1)
if joined == false then love.graphics.print(id, 16,480-16,0,1,1,0,0)
elseif joined == true then love.graphics.print(message,16,480-16,0,1,1,0,0) end
for i,v in ipairs(messages) do love.graphics.print(v, 16,480-(i*16),0,1,1,0,0)
end
end
simplified it and it still doesn't work..
Code: Select all
net = require "lib.sock"
local str = ""
local server = net.newServer("localhost", 50301)
local client = net.newClient("localhost", 50302)
server:on("connect", function(message) server:sendToAll("connect", message) end)
client:on("connect", function(message) str = message end)
client:connect()
client:send("connect", "hello")
function love.update()
client:update()
server:update()
end
function love.draw()
love.graphics.print(str,320,240,0,1,1,0,0)
end