Here is a (non-tested) sample:

Portz: copy []
Server-port: open/no-wait tcp://:9090
Insert portz server-port

Forever
[
  ;Use wait/all as all our ports are in one block
  current: wait/all portz
  
  ;If it's the server accept and add to the list
  either server-port = current
  [
    append portz current
  ]
  ;it's data from a client
  [
    ;get the data
    data: copy current
    ;if the data is none then the connection has closed
    either none? Data
    [
        ;port closed, remove it from our block
      remove find portz current
    ]
    [
      ;broadcast data, skip the server port
        foreach port at portz 2
      [
           insert port data
      ]
    ]
  ]
]


Note that the port is opend in no-wait, meaning something like "This is
a message" will be broadcasted as it is received, like "This i" "s a me"
"ssage" for example. You can add buffering and line termination to this
if you want to. Left as an exercise for the reader ;-)

--Maarten
  

> -----Original Message-----
> From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf
Of
> Seth
> Sent: zondag 9 november 2003 8:39
> To: [EMAIL PROTECTED]
> Subject: [REBOL] REBOL MUD server -- a few easy questions
> 
> 
> I've never been content with the documentation I've found relating to
> the usage of tcp based ports. The official REBOL documentation lightly
> touches on them but it's never been detailed enough, at least in my
> opinion. So here I am, with a few questions for the list :]
> 
> The ultimate end goal for this project is a simple MUD (if you don't
> know what a MUD is, you can generally think of it as a game like
> EverQuest without the graphics) or chat server, that clients connect
to
> via. telnet. The finer details I can work out myself (I've been
playing
> with Rebol for a long time now) but it seems to be the fundamentals
I'm
> having problems with, those being:
> 
> Accepting new incoming connections
> Keeping track of who is already connected
> Sending text from one client to all connected clients
> 
> I have some clunky code I've patched together by looking at several
> other people's scripts and reading the docs. Here it is:
> 
> ---
> 
> REBOL []
> 
> print ["The MUD server has started on" now/date ", at" now/time]
> 
> server-port: open/lines tcp://:23  ; listen for connections on port 23
> (standard telnet port)
> connections: copy [] ; connections[] holds the list of port! objects
> 
> forever [
>    connection-port: first server-port ; connection-port is the
currently
> active connection -- should this be connection-port: WAIT first
> server-port?
>    until [
>        wait connection-port ; wait until there is activity on the port
>        append connections connection-port ; add the newest port into
the
> connections[] block
>        foreach connection connections [ ; in this loop i was going to
> have it check to see if any of the clients listed in 'connections[]
are
> still active -- what is an easy way to do this?
>            x: reform ["There are now " length? connections " clients
> connected."]
>            insert connection x
>        ]
>    ]
> ]
> 
> ---
> 
> I am 200% open to suggestions on how to improve this code (and also
> -why- method X would be better/faster/etc. than method Y)... :] I want
> to make this code as good as possible because I have a lot of other
> things to focus on and they all depend on a reliable method for
> connecting and managing the connections!
> 
> 1) How can I send text from one client to all the clients? Will I have
> to do anything special because I'm telneting to the server? (Using
PuTTy)
> 2) What would be the best way to keep track of what clients are still
> connected and which ones have timed out or totally disconnected?
> 3) I have looked at Rugby and the examples on RebolForces for a
'server
> engine'. My project (as of right now) is basically sending text to and
> from telneted clients. Nothing very demanding, per say. When I start
> adding features to the MUD (i.e. actually making it into a game), it
> might get more resource hungry. Any suggestions of my current 'engine'
> versus a more complex one?
> 
> 
> --
> To unsubscribe from this list, just send an email to
> [EMAIL PROTECTED] with unsubscribe as the subject.


-- 
To unsubscribe from this list, just send an email to
[EMAIL PROTECTED] with unsubscribe as the subject.

Reply via email to