5.3 Accepting Multiple Connections

A frequently occuring situation is to have a single server with a port number known to several clients and that all these clients want to connect to that server. For this purpose sockets have the possibility to accept more than a single connection.

The first step is to create the server socket S with a port number P:

S={New Open.socket init}
P={S bind(port:$)}
{S listen}

The clients can connect later to this socket with the port number P.


class Accepted from Open.socket 
   meth report(H P)
      {Browse read(host:H port:P read:{self read(list:$)})}
      {self report(H P)}
   end 
end 
 
proc {Accept}
   H P A
in 
   {S accept(acceptClass:Accepted
             host:?H port:?P accepted:?A)}
   thread  
      {A report(H P)}  
   end 
   {Accept}
end

Program 5.1: Accepting multiple connections.


How to set up the server is shown in Program 5.1. The procedure Accept waits until the server socket S accepts a connection. When a connection is accepted, the variable A is bound to a newly created object. The object A is created from the class Accepted, this is specified by the feature acceptClass. The newly created object is already connected: Applying the object to the message report(H P) waits that on the accepted connection data arrives.

The loop to accept connections is started by applying the procedure Accept:

{Accept}

Let us assume that we have two clients C1 and C2 that need to connect to the socket with port number P:

C1={New Open.socket client(port:P)}  
C2={New Open.socket client(port:P)}

After the clients are connected, sending data from the clients is as usual:

{C1 write(vs:'hello from C1')}

As soon as the socket object created by the procedure Accept receives the data sent from a client, the data appears in the Browser.


Christian Schulte
Version 1.4.0 (20080702)