Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Temas - bdoX

#1
Buenos días, tardes, noches:

Quiero hablar sobre la etiqueta code, lo que ocurre es que cuando publico un post que contenga un código fuente, para hacer mas fácil la visibilidad agrego dicha etiqueta. El problema es que a veces los códigos son demasiados extensos, por ende, el post se ve menos limpio. No se si el administrador o quién sea, ¿Podría agregarle un Scrollbar horizontal y vertical a dicha etiqueta? Se que se puede porque en muchos foros utilizan eso.

Saludos

#2
Estimados:

Tengo un problema con un envío de ficheros, el problema es que el socket o hilo, en realidad no se, se bloquea. esta es la clase que usa el cliente y el servidor para el envio y recepción de ficheros. Dejo en claro que esto solo envía ficheros de textos. La verdad es que no tengo problemas al enviar o recibir un fichero de texto por localhost, el problema viene cuando uso internet. Solo logro enviar y recibir textos como por ejemplo el nombre del usuario, dirección, cosas así. Alguien tendría la amabilidad de ayudarme por favor.

Pd: Es un servidor que gestiona multiples clientes. Estas funciones son usadas el metodo run().

El servidor recibe 2 archivos, y responde con un archivo.

Código (java) [Seleccionar]

package Mensaje;

import java.io.*;
import java.net.*;
import java.util.*;
import java.util.StringTokenizer;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
* Mensaje para pedir un fichero.
*/
public class DameFichero
{
   public Socket socket;
   
   public DameFichero(Socket socket)
   {
       this.socket = socket;
   }
   
   public String leerArchivoNotas(String nombreFileNotas)
   {
       File archivo;
       String linea;
       FileReader fr = null;
       BufferedReader br = null;
       FileWriter archivoResultado;
       PrintWriter pw = null;
       
       try
       {
           // Apertura del fichero y creacion de BufferedReader para poder
           // hacer una lectura comoda (disponer del metodo readLine()).
           archivo = new File (nombreFileNotas);
           
           fr = new FileReader (archivo);
           br = new BufferedReader(fr);
           archivoResultado = new FileWriter("resul_"+nombreFileNotas);
           pw = new PrintWriter(archivoResultado);
           
           // Lectura del fichero
           
           int contador = 0;
           
           //leemos las lineas que no nos sirven para calcular las notas
           linea=br.readLine();
           linea=br.readLine();
           linea=br.readLine();//en esta linea los nombres de las columnas
           
           pw.println(linea+"\tPromedio_final");// le agregamos una ultima colum
           
           while((linea=br.readLine())!=null)
           {
               try
               {
                   //filtramos por tokens
                   StringTokenizer st = new StringTokenizer(linea,"\t");
                   float C1, C2, C3, NE;
                   //quitamos los tokens que no nos sirven
                   for (int i = 0; i < 3; i++)
                       st.nextToken();
                   
                   C1 = Float.parseFloat(st.nextToken());
                   C2 = Float.parseFloat(st.nextToken());
                   C3 = Float.parseFloat(st.nextToken());
                   NE = Float.parseFloat(st.nextToken());
                   //escribimos la nota al final de cada columna
                   pw.println(linea+"\t"+Redondear(getNotaFinal(C1,C2,C3,NE)));
               }
               catch (Exception e)
               {
                   System.out.println("problemas con el numero flotante");
                   e.printStackTrace();
               }
           }
       }
       catch(Exception e){
           e.printStackTrace();
       }
       finally
       {
           // En el finally cerramos el fichero, para asegurarnos
           // que se cierra tanto si todo va bien como si salta
           // una excepcion.
           try
           {
               fr.close();
               br.close();
               pw.close();
           }
           catch (Exception e2){
               e2.printStackTrace();
           }
       }
       
       return "resul_"+nombreFileNotas;
   }
   
   
   
   public void EnviarArchivo(String nombreArchivo)
   {
       PrintWriter pw1 = null;
       BufferedReader br1 = null;
       
       try
       {
           // Creamos el archivo que vamos a enviar
           File archivo = new File(nombreArchivo);
           
           if(!archivo.exists())
           {
               System.out.println("El archivo a "+nombreArchivo+" no existe");
               return ;
           }
           // Obtenemos el tamaño del archivo
           int tamañoArchivo = (int)archivo.length();
           File filenombreArchivo = new File(nombreArchivo);
           
           // Creamos flujo de entrada para realizar la lectura del archivo en bytes
           FileReader fr = new FileReader(filenombreArchivo);
           String buffer;
           int i = 1;
           
           pw1 = new PrintWriter(this.socket.getOutputStream(), true);
           br1 = new BufferedReader(fr);
           
           System.out.println("El tamaño del archivo a enviar: "+tamañoArchivo);
           /*
           synchronized (pw1)
           {
           */
           while((buffer=br1.readLine())!=null)
           {
               pw1.println(buffer);
               System.out.println(i+") "+buffer.length());

               try {
                   Thread.sleep(100);//le puse este sleep para depurar
               } catch (InterruptedException ex) {
                   System.out.println("Excepcion del sleep()");
                   //Logger.getLogger(DameFichero.class.getName()).log(Level.SEVERE, null, ex);
               }
               i++;
           }
           //    pw1.notify();
           //}
           fr.close();
       }
       catch(IOException e)
       {
           System.err.println(e.toString());
       }
       finally
       {
           try
           {
               br1.close();
               //pw1.close();
           }
           catch (IOException ex) {
               Logger.getLogger(DameFichero.class.getName()).log(Level.SEVERE, null, ex);
           }
       }
   }
   
   public void RecibirArchivo(String nombreArchivo, int tam)
   {
       PrintWriter pw2 = null;
       BufferedReader br2 = null;
       
       try
       {
           String buffer;
           int i = 1;
           File filenombreArchivo = new File(nombreArchivo);
           FileWriter fw = new FileWriter(filenombreArchivo);
           pw2 = new PrintWriter(fw);
           br2 = new BufferedReader(new InputStreamReader(
                                       this.socket.getInputStream()));
           
           //synchronized (br2)
           {
           /*    try {
                   br2.wait();
               } catch (InterruptedException ex) {
                   Logger.getLogger(DameFichero.class.getName()).log(Level.SEVERE, null, ex);
               }*/
               //br2.notify();
               //socket.setSoTimeout(4* 1000);
               
               while ((buffer = br2.readLine())!=null)
               {
                   pw2.println(buffer);
                   System.out.println(i+") "+buffer.length());
                   try {
                       Thread.sleep(100);//le puse este sleep solo para depurar
                   } catch (InterruptedException ex) {
                       System.out.println("Excepcion del sleep()");
                       //Logger.getLogger(DameFichero.class.getName()).log(Level.SEVERE, null, ex);
                   }
                   i++;
               }
           }
           
           fw.close();
       }
       catch (IOException e)
       {
           System.out.println("timout liberado");
           //e.printStackTrace();
       }
       finally
       {
           pw2.close();
           //br2.close();
       }
   }
}
#3
Hola a todos:

Les cuento, ya tengo implementado un chat bidireccional hecha en winsok, para ello tuve que hacerlo con hilos de ejecucion, hasta el momento el programa no acepta mas de un cliente. Funciona bien, el problema es que se ve asi:



ocurre que se ve feo que ingrese los datos, y que este ahí mismo el historial de converzación, por eso tengo ganas de el mismo hilo me genere una ventana aparte donde pueda ingresar los datos y una ventana donde pueda ver los datos del historial de converzación, algo asi:



Lo mismo para el cliente.

Se que la existe una funcion llamada CreateProcess() que al pasarle un flag a la funcion, me genera otra ventana, pero lo que yo no quiero es ejecutar desde otro *.exe a otro *.exe. La idea es tener un solo ejecutable nomas. Ojalá alguien pueda ayudarme please!

saludOS!


#4
Hola a todos:

Voy hacer mi primer aporte en el foro. Se trata de unas funciones que sirven para validar datos de entradas, y unas cuantas macros. Tambien incluye la implementación del getch() que tanto conocemos, en windows y linux.


#include <stdio.h>
#include <stdlib.h>

#ifdef WIN32
   #include <windows.h>
   #define NEWLINE      13
   #define BACKSPACE    8
#else
   #include <termios.h>
   #define NEWLINE      10
   #define BACKSPACE    127
#endif

#define TAM              20
#define SPACE            32
#define MIN_NUM          48
#define MAX_NUM          57
#define MIN_LETRA_MAY    65
#define MAX_LETRA_MAY    95
#define MIN_LETRA_MIN    97
#define MAX_LETRA_MIN    122

char getch ( );
void validar_letras (char *);
void validar_numeros (int *);

int main (void)
{

   char buffer[TAM];
   int numero;
   
   printf ( "ingrese una cadena: " );
   validar_letras (buffer);
   
   printf ( "\nla cadena ingresada es: %s\n", buffer );
   
   setbuf (stdin, NULL);
   
   printf ( "Ingrese un numero: " );
   validar_numeros ( &numero );
       
   printf ( "\nEl numero ingresado es: %d\n", numero );
 
   return 0;

}

void validar_numeros (int *numero)
{
   int i;
   char p[TAM], tecla;

   /*importante inicializar los valores
   ya que la implementacion que sigue lo amerita*/
   i = 0;
   p[0] = '\0';

   do
   {
       tecla = getch ();//atrapa un caracter sin dejar un eco

       /*BACKSPACE es la tecla para eliminar un caracter
       y el i obligaotiamente tiene que ser mayor que cero
       ya que si entra al if y tiene valor cero, el valor de i
       decrementará y p tendría un subindice -1, "p[-1]"¿?*/
       if ( i > 0 && tecla == BACKSPACE )
       {
           printf ( "\b \b" );
           p[--i] = '\0';
       }
       else
       {
           /*rango de numeros y SPACE es el espacio*/
           if ( (tecla >= MIN_NUM && tecla <= MAX_NUM)  ||
                 tecla == SPACE || tecla == '-' )
           {
               /*obligamos a que no hayan mas de un guion, y que
               el guion este al principio*/
               if ( tecla == '-' && i == 0 )
               {
                   printf ( "%c", tecla );
                   p[i++] = tecla;
               }
               else
               {
                   if ( tecla != '-' )
                   {
                       printf ( "%c", tecla );
                       p[i++] = tecla;
                   }
               }
           }
       }
   } while ((tecla != NEWLINE || p[0] == '\0') && i < TAM);
   /* NEWLINE inidica el Enter, i tiene que ser menor
   que TAM pues de lo contrario, estaría accediendo
   a memoria no reservada*/
   p[i] = '\0'; /*colocamos el fin de cadena*/
   *numero = atoi (p);
   /*convierte una cadena en un numero
   10 quiere decir que está en base decimal*/

   return ;
}

void validar_letras (char *p)
{
   int i;
   char tecla;

   /*importante inicializar los valores
   ya que la implementacion que sigue lo amerita*/
   i = 0;
   p[0] = '\0';

   do
   {
       tecla = getch ();//atrapa un caracter sin dejar un eco

       /*BACKSPACE es la tecla para eliminar un caracter o de retroceso
       y el i obligaotiamente tiene que ser mayor que cero
       ya que si entra al if y tiene valor cero, el valor de i
       decrementará y p tendría un subindice -1, "p[-1]"¿?*/
       if ( i > 0 && tecla == BACKSPACE )
       {
           printf ( "\b \b" );
           p[--i] = '\0';
       }
       else
       {
           /*rango de letras mayusculas y minusculas y SPACE es el espacio*/
           if ( (tecla >= MIN_LETRA_MAY && tecla <= MAX_LETRA_MAY)  ||
                (tecla >= MIN_LETRA_MIN && tecla <= MAX_LETRA_MIN)  ||
                 tecla == SPACE )
           {
               printf ( "%c", tecla );
               p[i++] = tecla;
           }
       }
   } while ((tecla != NEWLINE || p[0] == '\0') && i < TAM);
   /* NEWLINE inidica el Enter, i tiene que ser menor
   que TAM pues de lo contrario, estaría accediendo
   a memoria no reservada*/

   p[i] = '\0'; /*colocamos el fin de cadena*/

   return ;
}

#ifdef WIN32

char getch ( )
{
   char car;
   DWORD leidos, modo;

   GetConsoleMode ( GetStdHandle (STD_INPUT_HANDLE), &modo );
   SetConsoleMode ( GetStdHandle (STD_INPUT_HANDLE), modo &
                    !ENABLE_ECHO_INPUT & !ENABLE_PROCESSED_INPUT );
   ReadConsole ( GetStdHandle (STD_INPUT_HANDLE), &car, 1, &leidos, NULL );
   SetConsoleMode ( GetStdHandle (STD_INPUT_HANDLE), modo );
   return car;  
}

#else

char getch ( )
{

   struct termios _ter, fuente;
   char car;
 
   if ( tcgetattr (fileno(stdin), &_ter) )
   {
       perror ( "Error para obtener información\n" );
       return -1;
   }
 
   fuente = _ter;
 
   _ter.c_lflag &= ~ICANON;
   _ter.c_lflag &= ~ECHO;
   _ter.c_cc[VMIN] = 1;
   _ter.c_cc[VTIME] = 0;
 
   if ( tcsetattr (fileno(stdin), TCSANOW, &_ter) )
   {
       perror ( " Error para obtener información\n" );
       return -1;
   }
 
   car = getchar ( );

   if ( tcsetattr (fileno(stdin), TCSANOW, &fuente) )
   {
       perror ( "Error para obtener información" );
       return -1;
   }
 
   return car;
}
#endif



ojalá le sirva a alguien.

PD: este code lo publiqué en otro lado, por cualquier cosa.

saludos!



#5
Scripting / Expresion regular en Perl
9 Enero 2012, 23:39 PM
Hola a todos:

Les cuento mi duda, pasa que quiero validar una espresion regular  y quiero que solo me reconozca el string en el alfabeto= {a, b}.

acá dejo el code. No se en que estoy fallando.

Código (perl) [Seleccionar]

print "Ingrese nombre de usuario: ";
$nombre=<STDIN>;
chomp($nombre);

if ($nombre =~ m/[c-z]/ | $nombre !~ m/\w/ | $nombre =~ m/[0-9]/)
{
print "No pertenece al lenguaje\n";
}
else
{
print "Si pertenece\n";
}


Con esto solo me acepta el alfabeto [a,b] + caracteres especiales como por ejemplo +, - {. } !, --. Pero eso no es lo que quiero. Ayuda please!

Código (perl) [Seleccionar]

print "Ingrese nombre de usuario: ";
$nombre=<STDIN>;
chomp($nombre);

if ($nombre =~ m/[c-z]/ | $nombre =~ /m[0-9]/)
{
print "No pertenece al lenguaje\n";
}
else
{
print "Si pertenece\n";
}
#6
Programación C/C++ / winsock + winapi en C
10 Diciembre 2011, 01:08 AM
Hola a toda la Comunidad, me presento soy bdoX y soy nuevo en el foro, he mirado varios temas y me doy cuenta de que en este foro hay gente muy capacitada :-). Bueno les cuento, hice un programa de envio de archivos en winsock (Windows) para consola en C, cuando quise pasar esa versión a winapi, me arrojaba errores de ejecución. ¿Alguien sabe si para programar winsock+winapi necesito usar hilos de ejecución? por algun lado de internet, decia que tenia que usar un hilo para montar la interfaz de usuario y otro hilo para montar el socket. Ojalá y alguien me pueda ayudar.

Saludos!!