Foros del Web » Programación para mayores de 30 ;) » .NET »

Sockets Hashtable

Estas en el tema de Sockets Hashtable en el foro de .NET en Foros del Web. Buenas estoy haciendo una aplicacion cliente servidor la cual quiero que en el servidor lea una ruta pasada por el cliente, lo cual buscara una ...
  #1 (permalink)  
Antiguo 10/06/2008, 10:47
 
Fecha de Ingreso: julio-2006
Mensajes: 150
Antigüedad: 17 años, 9 meses
Puntos: 0
Sockets Hashtable

Buenas estoy haciendo una aplicacion cliente servidor la cual quiero que en el servidor lea una ruta pasada por el cliente, lo cual buscara una tabla de hash almacenada en un archivo y luego el servidor se la envie de vuelta al cliente los metodos que estoy usando son los siguientes, pero aun no implemento que sea con las hashtable como podria modificar esto para que en vez de pase string pase Hashtables?

/*****Cliente

static void Main(string[] args)
{
byte[] data = new byte[1024]; //Cramos un byte[> para recibir el mensaje
//de bienvenida del servidor
int sent; //una variable que nos dice cuanto hemos enviado
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1" ), 9050);
//Creamos un IPEndPoint con el ip del servidor y puerto del servidor
//al que deseamos conectarnos, en este caso lo uso local

//Creamos el socket igual al del servidor
Socket server = new Socket(AddressFamily.InterNetwork,SocketType.Strea m,ProtocolType.Tcp);

try
{
server.Connect(ipep);//Intentamos conectar el socket
Console.WriteLine("Conectado con el servidor {0}", ipep.Address);
}
catch (SocketException)
{
//Si hay excepcion imprimimos error y salimos del programa con return
Console.WriteLine("No se pudo conectar con el servidor {0}", ipep.Address);
return;
}

FuncionesConexion conex = new FuncionesConexion();
try
{
data = conex.ReceiveData(server); //Recibimos la bienvenida del servidor
string stringData = Encoding.ASCII.GetString(data);
Console.WriteLine(stringData);
}
catch (SocketException)
{
//Si hay error imprimios y nos salimos por que no hay conexion
Console.WriteLine("No se ha encontrado conexion con el servidor {0}", ipep.Address);
return;
}

while (true)
{
string message = Console.ReadLine(); //Leemos el input que queremos enviar
try
{//Enviamos el mensaje.
sent = conex.SendData(server, Encoding.ASCII.GetBytes(message));
}
catch (SocketException)
{//Si hay excepcion nos salimos pq no hay conexion
Console.WriteLine("No se ha encontrado conexion con el servidor {0}", ipep.Address);
return;
}//Si se ejeucta el comando exit nos salimos
try
{
data = conex.ReceiveData(server); //Recibimos la bienvenida del servidor //string
Hashtable stringData = Encoding.ASCII.GetString(data);
Console.WriteLine(stringData);
}
catch (SocketException)
{
//Si hay error imprimios y nos salimos por que no hay conexion
Console.WriteLine("No se ha encontrado conexion con el servidor {0}", ipep.Address);
return;
}

if (message == "exit" )
break;
}
//Indicamos que nos desocnectamos y cerramos el socket
Console.WriteLine("Desconectando del servidor {0}", ipep.Address);
server.Shutdown(SocketShutdown.Both);
server.Close();
}

/*****Servidor

static void Main(string[] args)
{
byte[] data = new byte[1024]; //creamos un byte[] para enviar la bienvenida
IPEndPoint ipep = new IPEndPoint(IPAddress.Any,9050);
//Con el IpAdress.Any esuchamos en cualquier interfaz de red.. y el 9050
//es el puerto en el que escuharemos

//creamos un socket de tipo internwtwork, stream y tcp
Socket newsock = new Socket(AddressFamily.InterNetwork,SocketType.Strea m,ProtocolType.Tcp);
try
{
newsock.Bind(ipep); //lo bindeamos para que se ancle al puerto especificaco
}
catch (SocketException)
{
//si aqui hay error es que ese puerto esta en uso y entonces es probable
//que otra instancia de este programa ya este corriendo
Console.WriteLine("Al parecer otra instancia del servidor ya esta corriendo" );
return; //si es asi damos un return para salirnos de la funcion y terminar
//el programa
}

newsock.Listen(1); //escuchamos con el socket en el puerto especifaco
Console.WriteLine("Waiting for a client..." );

Socket client = newsock.Accept(); //Esto acepta la conexion cuando recibe
//una peticion... esto se queda esperando hasta que ocurra
IPEndPoint newclient = (IPEndPoint)client.RemoteEndPoint; //creamos un IPEndPoint
//con la informacion del cliente
Console.WriteLine("Connected with {0} on port {1}", newclient.Address, newclient.Port);
//imprimimos en la pantalla que se conecto un cliente

string welcome = "Welcome to my test server 1.0";
data = Encoding.ASCII.GetBytes(welcome); //Codificamos a byte [> el mensaje
//de bienvenida
FuncionesConexion conex = new FuncionesConexion();
int sent = conex.SendData(client, data); //lo enviamos con nuestra funcion, pasandole
//el socket del cliente y el byte[> con el mensaje

for (int m = 0; m < 2; m++)
{//Este for nos sirve para leer infinitamente los mensajes que nos llegan
try
{
data = conex.ReceiveData(client); //Llama a recibir mensajes del socket cliente
//esto se queda esperando hasta recibir un mensaje
string message = Encoding.ASCII.GetString(data); //si recibimos un
//mensaje entonces lo decoficamos a un string
//Lectura Archivo Binario
FileStream fs = new FileStream("D:\\Ernesto\\Tesis\\Columnas\\"+messag e, FileMode.Open, FileAccess.Read);
try
{

Hashtable a = new Hashtable();
BinaryFormatter bf = new BinaryFormatter();
a = (Hashtable)bf.Deserialize(fs);
}
finally
{
fs.Close();
}

if (message == "exit" ) //si recibimos exit nos salimos..
break;
Console.WriteLine(message); //si no entonces lo imprimimos

data = Encoding.ASCII.GetBytes("Recibido");
sent = conex.SendData(client, data); //lo enviamos con nuestra funcion, pasandole

m--; //restamos al for para que sea infinito...
}
catch (SocketException)
{
Console.WriteLine("No se encontro conexion con el cliente {0}", newclient.Address);
return;
//si enocntramos un error es que se perido la conexion y con el return nos
//salimos de la funcion
}
}
//Damos el mensaje de que se desconecto el cliente XX con puerto XX
Console.WriteLine("Disconnected from {0} on port {1}",newclient.Address,newclient.Port);
//cerramos el socket del cliente
client.Shutdown(SocketShutdown.Both);
client.Close();
//Ceramos el socket con el que escuchamos
newsock.Shutdown(SocketShutdown.Both);
newsock.Close();
}
}

Ahora les adjunto los metodos Send y Receive

Gracias!!
  #2 (permalink)  
Antiguo 10/06/2008, 10:47
 
Fecha de Ingreso: julio-2006
Mensajes: 150
Antigüedad: 17 años, 9 meses
Puntos: 0
Respuesta: Sockets Hashtable

/*****Metodos Send y Receive

public int SendData(Socket sock, byte[] data)
{
int total = 0; //Este es la cantidad enviada del mensaje
int size = data.Length; // Este es el tamaño del mensaje
int dataLeft = size; //Este es la parte del mensaje que no se ha enviado
int sent; //Esto es lo que se envio en esta sesion

//este sera el tamaño del mensaje que epxlique arriba
byte[] dataSize = new byte[4];
dataSize = BitConverter.GetBytes(size); //obtenemos los bytes de 'size'
sent = sock.Send(dataSize);//enviamos el tamañom primero, un byte[] de 4

//ahora enviaremos el mensaje....
while (total < size)
{
//La funcuion Send nos devuelve un entero de cuanta cantidad logro enviar
//Entonces mientras no se haya enviado todo el mensaje este ciclo se
//ejecuta
sent = sock.Send(data, total, dataLeft, SocketFlags.None);
total += sent;
dataLeft -= sent;
}
return total; //regresamos el total que enviamos
}

//Necesitamos un socket para recibir
public byte[] ReceiveData(Socket sock)
{
int totalRecv = 0; //la cantidad total recibida
int recv; //la cantidad recibida individualmente
byte[] dataSize = new byte[4]; //este sera el tamaño del mensaje en byte[]
int size; //Este sera el tamaño en entero
int dataLeft = 0; //Esto nos indica cuanta informacion nos falta recibir

recv = sock.Receive(dataSize, 0, 4, SocketFlags.None);//recibimos el tamaño
size = BitConverter.ToInt32(dataSize, 0);//lo pasamos a un entero
dataLeft = size; //asigamos lo que nos falta recibir
byte[] data = new byte[size]; //creamos un array de byte[] del tamaño del mensaje

while (totalRecv < size)
{
//empezamos a recibir
recv = sock.Receive(data, totalRecv, dataLeft, SocketFlags.None);
if (recv == 0)
{
//cuando se reciba 0 es que el cliente se desconecto ...
//entonces rompemos el ciclo.
data = Encoding.ASCII.GetBytes("exit");
break;
}
totalRecv += recv;
dataLeft -= recv;
}
return data; //regresamos el byte[] que recibimos
}
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:27.