-
communication between 2 movies via server & PHP ?
Hi
I'm fairly experienced in Flash (well, I was up to Flash 8) and very strong in PHP but now I need to do something I've never had to do and I don't know quite how to go about setting it up.
I've made a small movie that lets you scribble on a canvas using lineStyle(), moveTo(), lineTo() etc in a new clip
my first question is : is there a more recent way of doing this or are those functions still a good way to draw at runtime ?
then, what I would really like to do is have 2 people using the same movie in their browser and when they draw in one it gets updated in the other one. The movie being drawn in would have to send the data to the other movie via the site server.
what is the best way of going about this ? is there already a system that would simplify this ?
if you know of any existing examples i could look at, or point me in the right direction I would be more than grateful
thanks
-
Hi,
if instantaneous update is important, you will need to run a socket server. This is potentially possible in php, but likely to not work on a standard shared webserver.
So you are in fact looking for someone hosting adobe server, red5, or whatever
If you think you can go with polling the server for updates every 10 seconds, you can use a standard php server
Musicman
-
thanks for your reply
I'll be putting the site on a pair of dedicated servers so socket server sounds interesting - I'll check that out
thanks
-
yea socket server is your best bet.
if i was to do something like this i would make it so the swf creates an array of positions onMouseMove when drawing is true, and sends them on a set interval of say 100ms and then clears the array once sent.
---
here is a nice PHP socket server example i use to use as a base template.
PHP Code:
#!/usr/local/bin/php -q
<?php
set_time_limit(0);
// defaults...
define('MAXLINE', 1024); // how much to read from a socket at a time
define('LISTENQ', 10); // listening queue
define('PORT', 10000); // the default port to run on
define('FD_SETSIZE', 5); // file descriptor set size (max number of
concurrent clients)...
// for kill the biatch...
function killDaemon()
{
global $listenfd, $client;
socket_close($listenfd);
$msg = "Daemon going down!\n";
for ($i = 0; $i < FD_SETSIZE; $i++)
{
if ($client[$i] != null)
{
socket_write($client[$i], $msg, strlen($msg));
socket_close($client[$i]);
}
}
print "Shutting down the daemon\n";
exit;
}
// whenever a client disconnects...
function closeClient($i)
{
global $client, $remote_host, $remote_port;
print "closing client[$i] ({$remote_host[$i]}:{$remote_port[$i]})\n";
socket_close($client[$i]);
$client[$i] = null;
unset($remote_host[$i]);
unset($remote_port[$i]);
}
// set up the file descriptors and sockets...
// $listenfd only listens for a connection, it doesn't handle anything
// but initial connections, after which the $client array takes over...
$listenfd = socket_create(AF_INET, SOCK_STREAM, 0);
if ($listenfd)
print "Listening on port " . PORT . "\n";
else
die("AIEE -- socket died!\n");
socket_setopt($listenfd, SOL_SOCKET, SO_REUSEADDR, 1);
if (!socket_bind($listenfd, "0.0.0.0", PORT))
{
socket_close($listenfd);
die("AIEE -- Couldn't bind!\n");
}
socket_listen($listenfd, LISTENQ);
// set up our clients. After listenfd receives a connection,
// the connection is handed off to a $client[]. $maxi is the
// set to the highest client being used, which is somewhat
// unnecessary, but it saves us from checking each and every client
// if only, say, the first two are being used.
$maxi = -1;
for ($i = 0; $i < FD_SETSIZE; $i++)
$client[$i] = null;
// the main loop.
while(1)
{
$rfds[0] = $listenfd;
for ($i = 0; $i < FD_SETSIZE; $i++)
{
if ($client[$i] != null)
$rfds[$i + 1] = $client[$i];
}
// block indefinitely until we receive a connection...
$nready = socket_select($rfds, $null, $null, null);
// if we have a new connection, stick it in the $client array,
if (in_array($listenfd, $rfds))
{
print "listenfd heard something, setting up new client\n";
for ($i = 0; $i < FD_SETSIZE; $i++)
{
if ($client[$i] == null)
{
$client[$i] = socket_accept($listenfd);
socket_setopt($client[$i], SOL_SOCKET, SO_REUSEADDR, 1);
socket_getpeername($client[$i], $remote_host[$i],
$remote_port[$i]);
print "Accepted {$remote_host[$i]}:{$remote_port[$i]} as
client[$i]\n";
break;
}
if ($i == FD_SETSIZE - 1)
{
trigger_error("too many clients", E_USER_ERROR);
exit;
}
}
if ($i > $maxi)
$maxi = $i;
if (--$nready <= 0)
continue;
}
// check the clients for incoming data.
for ($i = 0; $i <= $maxi; $i++)
{
if ($client[$i] == null)
continue;
if (in_array($client[$i], $rfds))
{
$n = trim(socket_read($client[$i], MAXLINE));
if (!$n)
closeClient($i);
else
{
// if a client has sent some data, do one of these:
if ($n == "/killme")
killDaemon();
else if ($n == "/quit")
closeClient($i);
else
{
// print something on the server, then echo the incoming
// data to all of the clients in the $client array.
print "From {$remote_host[$i]}:{$remote_port[$i]},
client[$i]: $n\n";
for ($j = 0; $j <= $maxi; $j++)
{
if ($client[$j] != null)
socket_write($client[$j], "From client[$i]:
$n\r\n");
}
}
}
if (--$nready <= 0)
break;
}
}
}
?>
Freelance: AS2, AS3, PHP, MySQL, JavaScript
Skype: hunty93
-
I've written just such a socket server. See the link in my sig.
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|