Ummm espero que esto de ayude para comenzar yo usaria un TcpListener en lugar de socket, yo usaria 2 clases una que es la que escucha en determinado puerto(Servidor.cs), y otra que procesa(Procesar.cs).
El funcionamiento seria :
1-. Servidor inicia un TcpListener en un determinado puerto y esta a la escucha de las peticiones del cliente usando el metodo "AcceptTcpClient()".
2-. Recibe la peticon del cliente y crea una instancia de la clase Procesar(new Procesar(datoscliente)) que tiene como parametro un odjecto TcpClient(el que es creado usando AcceptTcpClient()).
3-.Teniendo mi objeto "Procesar" creo un nuevo Thread(proceso) en el cual invoco a un metodo al que llamaria "process"
4.-Otra ves llamo a AcceptTcpClient().
Lo que lo hace multiusuario es que cada peticon se procesa en un Thread diferente eso es todo aqui un ejemplo:
Servidor.cs(Escrito directamente aqui en la ventana de posteo no se si compile pero te dara una idea)
public class Servidor
{
private int puerto = 8069; //El puerto en el que corre
TcpListener listener;
public void listen()
{
listener
= new TcpListener
(IPAndress
.Any,puerto
); listener.Start();
//Comiensa el ciclo repetitivo para aceptar peticiones
while(true)
{
TcpClient s = listener.AcceptTcpClient();//En este punto el programa esta detenido esperando al cliente
Procesar p
= new Procesar
(s
);//Aqui ya recibi una peticion Thread t
= new Thread
(new ThreadStart
(p
.process)); // aqui la proceso en un nuevo Thread t.Start();//Listo es todo nuevamente regresa a s = listener.AcceptTcpClient(); y se repite el proceso
}
}
}
Aqui el codigo de la clase Procesar.cs
public class Procesar()
{
TcpClient c;
Stream input;//para leer los datos del cliente
StreamWriter output;//para escribir la respuesta
public Procesar(TcpClient socket)
{
this.c= socket;
}
public void process()
{
input
= new BufferedStream
(c
.GetStream()); output
= new StreamWriter
(new BufferedStream
(c
.GetStream())); //Aqui el codigo para procesar input
//la respuesta la enviamos escribiendo en output usando Write o WriteLine
output.Flush();//invocamos al metodo Flush del output
c.close();//cerramos el TcpClient
}
}
Bueno esa es la extructura basica con la que yo trabajaria aunque e visto otras formas pero que no me convecieron mucho.
Por ultimo usamos nuestra clase servidor en nuestro metodo principal con
Servidor myServer=new Servidor()
myServer.Start();