Nicolas Cueto wrote:
Hello List,

I've made a quiz-type game where 2-6 students on client stacks buzz in
their answers to a server stack, all on a local network. The server
stack, as well as sending out the questions, informs live to all the
students/client-stacks about who buzzed in what.

I thought I had it working until we found a problem. If two out of six
students happen to buzz in an answer almost simultaneously (by
clicking a button on a game controller pad), as expected five of the
students will receive the server's message about who buzzed in first,
but one of those two students who buzzed at the same time won't.
Except for this simultaneity, all other server-to-client
communications work.

After trying to track this down for weeks, I'm posting here in hopes
of some list magic.

My guess, as the subject line reads, is that a client stack might be
writing to a socket at the same time that the server is trying to
write to that same socket. But, not understanding well how sockets
work, the problem may lie elsewhere. I think I've eliminated the
obvious types of mistakes, but...

So, I am including below the essence of what my server and script
stacks do. It is quite long, so apologies beforehand.


I'm afraid I can't see anything that looks like it could cause your problem. What I'd do if it were me is :

1. add a logging capability to the 'chatreceived' handler

on chatReceived s,data
if gLoggingFile then put the millisecs && s && data &CR after URL gLoggingFile
  end if
  ## Student/client has sent a message.
  ## Perhaps it's a choice/answer ...

2. add a similar log/debug to broadcastToAllClients

3. see what you find out :-)

Also, a couple of comments - some probably just artefacts of summarizing the 
script to send to us.

1. In chatreceived (and clientConnected), you do
   read from socket s with message chatReceived
which would only read one character (according to the docs). I guess you really do a "read until someChar ??

2. In clientConnected, you do
   wait 50 milliseconds with messages
   ## Bug? Without this line, read from socket takes a long time
   ## and returns empty.
   read from socket s for 1 line
I would recommend that you NEVER do a blocking read in a server. I'd make that something like
   read from socket s until CR with message gotClientIdentification
and put the remaining code into gotClientIdentification (or siply add it to the logic in chatreceived).

And I'm pretty sure you can then remove the "wait 50 msec with messages"

3. In the array gAllClientIPsArray, it seems that the 3rd item of each entry will always match the key of the array, because of
   put tChatMessage & comma & s into gAllClientIPsArray[s]
That just seems like duplicate effort (and a possible source of error / confusion). Why not leave that out, and just use the key ?

4. If you do #3, then you can simplify
on broadcastToAllClients message
   ## Tell all the students/clients who made what choice.
   put keys(gAllClientIPsArray) into tChatterList
   repeat for each line tArrayKey in tChatterList
      put gAllClientIPsArray[tArrayKey] into tArrayDataLine
      -- the client ID, the student ID, the client IP
      -- eg, Blitz-1,10000,127.0.0.1:1448
      put item 3 of tArrayDataLine into tSocket
      write message to socket tSocket
   end repeat
to

on broadcastToAllClients message
  ## Tell all the students/clients who made what choice.
  repeat for each key tSocket in gAllClientIPsArray
     write message to socket tSocket
  end repeat
end broadcastToAllClients


(Again, this may be due to summarizing, and there may be more to do here - but even then it would likely be
  repeat for each element tArrayDataLine in gAllClientsIPsArray
     -- do something to send to  this client
)


Hope that helps a little bit. Try the logging / debug code and see what happens (and let us know if it shows anything and we can help with analyzing it :-)

-- Alex.
_______________________________________________
use-revolution mailing list
[email protected]
Please visit this url to subscribe, unsubscribe and manage your subscription 
preferences:
http://lists.runrev.com/mailman/listinfo/use-revolution

Reply via email to