none
Aplicacion cliente - servidor

    Pregunta

  • Hola estoy empezando con el tema de aplicaciones cliente servidor y para eso estoy probando el codigo de un libro que tengo, el codigo del servidor y del cliente si lo ejecuto en el local host funciona bien, pero lo que estoy tratando de hacer es ejecutar la parte del servidor en windows 7 y la parte del cliente con el windows xp mode que trae el win 7.

    Aca va el codigo del servidor:

     

    using System;
    using System.Windows.Forms;
    using System.Threading; 
    using System.Net;  
    using System.Net.Sockets;
    using System.IO;   
    
    
    
    public partial class ChatServerForm : Form
    
    {
    
     public ChatServerForm()
    
     {
    
      InitializeComponent();
    
     } // end constructor
    
    
    
     private Socket connection; // Socket for accepting a connection  
    
     private Thread readThread; // Thread for processing incoming messages
    
     private NetworkStream socketStream; // network data stream   
    
     private BinaryWriter writer; // facilitates writing to the stream 
    
     private BinaryReader reader; // facilitates reading from the stream 
    
    
    
     // initialize thread for reading
    
     private void ChatServerForm_Load( object sender, EventArgs e )
    
     {
    
      readThread = new Thread( new ThreadStart( RunServer ) );
    
      readThread.Start();          
    
     } // end method CharServerForm_Load
    
    
    
     // close all threads associated with this application
    
     private void ChatServerForm_FormClosing( object sender, 
    
      FormClosingEventArgs e )
    
     {   
    
      System.Environment.Exit( System.Environment.ExitCode );
    
     } // end method CharServerForm_FormClosing
    
    
    
     // delegate that allows method DisplayMessage to be called
    
     // in the thread that creates and maintains the GUI  
    
     private delegate void DisplayDelegate( string message ); 
    
    
    
     // method DisplayMessage sets displayTextBox's Text property
    
     // in a thread-safe manner
    
     private void DisplayMessage( string message )
    
     {
    
      // if modifying displayTextBox is not thread safe
    
      if ( displayTextBox.InvokeRequired )
    
      {
    
       // use inherited method Invoke to execute DisplayMessage
    
       // via a delegate          
    
       Invoke( new DisplayDelegate( DisplayMessage ),   
    
       new object[] { message } );       
    
      } // end if
    
      else // OK to modify displayTextBox in current thread
    
       displayTextBox.Text += message;
    
     } // end method DisplayMessage
    
    
    
     // delegate that allows method DisableInput to be called 
    
     // in the thread that creates and maintains the GUI
    
     private delegate void DisableInputDelegate( bool value );
    
    
    
     // method DisableInput sets inputTextBox's ReadOnly property
    
     // in a thread-safe manner
    
     private void DisableInput( bool value )
    
     {
    
      // if modifying inputTextBox is not thread safe
    
      if ( inputTextBox.InvokeRequired )
    
      {
    
       // use inherited method Invoke to execute DisableInput
    
       // via a delegate          
    
       Invoke( new DisableInputDelegate( DisableInput ),  
    
       new object[] { value } );       
    
      } // end if
    
      else // OK to modify inputTextBox in current thread
    
       inputTextBox.ReadOnly = value;
    
     } // end method DisableInput
    
    
    
     // send the text typed at the server to the client
    
     private void inputTextBox_KeyDown( object sender, KeyEventArgs e )
    
     {
    
      // send the text to the client
    
      try
    
      {   
    
       if ( e.KeyCode == Keys.Enter && inputTextBox.ReadOnly == false )
    
       {
    
       writer.Write( "SERVER>>> " + inputTextBox.Text );
    
       displayTextBox.Text += "\r\nSERVER>>> " + inputTextBox.Text;
    
    
    
       // if the user at the server signaled termination
    
       // sever the connection to the client
    
       if ( inputTextBox.Text == "TERMINATE" )
    
        connection.Close();
    
    
    
       inputTextBox.Clear(); // clear the user’s input
    
       } // end if
    
      } // end try
    
      catch ( SocketException )
    
      {
    
       displayTextBox.Text += "\nError writing object";
    
      } // end catch
    
     } // end method inputTextBox_KeyDown
    
    
    
     // allows a client to connect; displays text the client sends
    
     public void RunServer()
    
     {
    
      TcpListener listener;
    
      int counter = 1;
    
    
    
      // wait for a client connection and display the text
    
      // that the client sends
    
      try
    
      {
    
       // Step 1: create TcpListener     
    
       IPAddress local = IPAddress.Parse("127.0.0.1");
    
       listener = new TcpListener( local, 50000 );  
    
    
    
       // Step 2: TcpListener waits for connection request
    
       listener.Start();         
    
    
    
       // Step 3: establish connection upon client request
    
       while ( true )
    
       {
    
       DisplayMessage( "Waiting for connection\r\n" );
    
    
    
       // accept an incoming connection  
    
       connection = listener.AcceptSocket();
    
    
    
       // create NetworkStream object associated with socket
    
       socketStream = new NetworkStream( connection );  
    
    
    
       // create objects for transferring data across stream
    
       writer = new BinaryWriter( socketStream );   
    
       reader = new BinaryReader( socketStream );   
    
    
    
       DisplayMessage( "Connection " + counter + " received.\r\n" );
    
    
    
       // inform client that connection was successfull 
    
       writer.Write( "SERVER>>> Connection successful" );
    
    
    
       DisableInput( false ); // enable inputTextBox
    
    
    
       string theReply = "";
    
    
    
       // Step 4: read string data sent from client
    
       do
    
       {
    
        try
    
        { 
    
         // read the string sent to the server
    
         theReply = reader.ReadString();
    
    
    
         // display the message
    
         DisplayMessage( "\r\n" + theReply );
    
        } // end try
    
        catch ( Exception )
    
        {
    
         // handle exception if error reading data
    
         break;
    
        } // end catch
    
       } while ( theReply != "CLIENT>>> TERMINATE" &&
    
        connection.Connected );
    
    
    
       DisplayMessage( "\r\nUser terminated connection\r\n" );
    
    
    
       // Step 5: close connection 
    
       writer.Close();    
    
       reader.Close();    
    
       socketStream.Close();  
    
       connection.Close();   
    
    
    
       DisableInput( true ); // disable InputTextBox
    
       counter++;
    
       } // end while
    
      } // end try
    
      catch ( Exception error )
    
      {
    
       MessageBox.Show( error.ToString() );
    
      } // end catch
    
     }
    
    
    
     private void inputTextBox_TextChanged(object sender, EventArgs e)
    
     {
    
    
    
     } // end method RunServer
    
    } // end class ChatServerForm
    
    

     

    /////////////////////////////////////////////////////////////////////////////////////////////////////

    y ahora el codigo del cliente:

     

    using System;
    using System.Windows.Forms;
    using System.Threading; 
    using System.Net.Sockets;
    using System.IO;   
    
    
    
    public partial class ChatClientForm : Form
    
    {
    
     public ChatClientForm()
    
     {
    
      InitializeComponent();
    
     } // end constructor
    
    
    
     private NetworkStream output; // stream for receiving data   
    
     private BinaryWriter writer; // facilitates writing to the stream 
    
     private BinaryReader reader; // facilitates reading from the stream 
    
     private Thread readThread; // Thread for processing incoming messages
    
     private string message = "";
    
    
    
     // initialize thread for reading
    
     private void ChatClientForm_Load( object sender, EventArgs e )
    
     {
    
      readThread = new Thread( new ThreadStart( RunClient ) );
    
      readThread.Start();          
    
     } // end method ChatClientForm_Load
    
    
    
     // close all threads associated with this application
    
     private void ChatClientForm_FormClosing( object sender,
    
      FormClosingEventArgs e )
    
     {
    
      System.Environment.Exit( System.Environment.ExitCode );
    
     } // end method ChatClientForm_FormClosing
    
    
    
     // delegate that allows method DisplayMessage to be called
    
     // in the thread that creates and maintains the GUI  
    
     private delegate void DisplayDelegate( string message ); 
    
    
    
     // method DisplayMessage sets displayTextBox's Text property
    
     // in a thread-safe manner
    
     private void DisplayMessage( string message )
    
     {
    
      // if modifying displayTextBox is not thread safe
    
      if ( displayTextBox.InvokeRequired )
    
      {
    
       // use inherited method Invoke to execute DisplayMessage
    
       // via a delegate          
    
       Invoke( new DisplayDelegate( DisplayMessage ),   
    
       new object[] { message } );       
    
      } // end if
    
      else // OK to modify displayTextBox in current thread
    
       displayTextBox.Text += message;
    
     } // end method DisplayMessage
    
    
    
     // delegate that allows method DisableInput to be called 
    
     // in the thread that creates and maintains the GUI
    
     private delegate void DisableInputDelegate( bool value );
    
    
    
     // method DisableInput sets inputTextBox's ReadOnly property
    
     // in a thread-safe manner
    
     private void DisableInput( bool value )
    
     {
    
      // if modifying inputTextBox is not thread safe
    
      if ( inputTextBox.InvokeRequired )
    
      {
    
       // use inherited method Invoke to execute DisableInput
    
       // via a delegate          
    
       Invoke( new DisableInputDelegate( DisableInput ),  
    
       new object[] { value } );       
    
      } // end if
    
      else // OK to modify inputTextBox in current thread
    
       inputTextBox.ReadOnly = value;
    
     } // end method DisableInput
    
    
    
     // sends text the user typed to server
    
     private void inputTextBox_KeyDown( object sender, KeyEventArgs e )
    
     {
    
      try
    
      {   
    
       if ( e.KeyCode == Keys.Enter && inputTextBox.ReadOnly == false )
    
       {
    
       writer.Write( "CLIENT>>> " + inputTextBox.Text );
    
       displayTextBox.Text += "\r\nCLIENT>>> " + inputTextBox.Text;
    
       inputTextBox.Clear();   
    
       } // end if
    
      } // end try
    
      catch ( SocketException )
    
      {
    
       displayTextBox.Text += "\nError writing object";
    
      } // end catch
    
     } // end method inputTextBox_KeyDown
    
    
    
     // connect to server and display server-generated text
    
     public void RunClient()
    
     {
    
      TcpClient client;
    
    
    
      // instantiate TcpClient for sending data to server
    
      try
    
      { 
    
       DisplayMessage( "Attempting connection\r\n" );
    
    
    
       // Step 1: create TcpClient and connect to server
    
       client = new TcpClient();
    
       client.Connect("127.0.0.1", 50000);    
    
    
    
       // Step 2: get NetworkStream associated with TcpClient
    
       output = client.GetStream();       
    
    
    
       // create objects for writing and reading across stream
    
       writer = new BinaryWriter( output );     
    
       reader = new BinaryReader( output );     
    
    
    
       DisplayMessage( "\r\nGot I/O streams\r\n" );
    
       DisableInput( false ); // enable inputTextBox
    
      
    
       // loop until server signals termination
    
       do
    
       {
    
       // Step 3: processing phase
    
       try
    
       {
    
        // read message from server  
    
        message = reader.ReadString();  
    
        DisplayMessage( "\r\n" + message );
    
       } // end try
    
       catch ( Exception )
    
       {
    
        // handle exception if error in reading server data
    
        System.Environment.Exit( System.Environment.ExitCode );
    
       } // end catch
    
       } while ( message != "SERVER>>> TERMINATE" );
    
      
    
       // Step 4: close connection
    
       writer.Close();   
    
       reader.Close();   
    
       output.Close();   
    
       client.Close();   
    
    
    
       Application.Exit();
    
      } // end try
    
      catch ( Exception error )
    
      {
    
       // handle exception if error in establishing connection
    
       MessageBox.Show( error.ToString(), "Connection Error",
    
       MessageBoxButtons.OK, MessageBoxIcon.Error );
    
       System.Environment.Exit( System.Environment.ExitCode );
    
      } // end catch
    
     } // end method RunClient
    
    } // end class ChatClientForm
    
    
    
    

     

    algo que se me ocurrio seria dejar la ip del server como esta: IPAddress local = IPAddress.Parse("127.0.0.1"); y en la parte del cliente que estaria en el windows xp mode cambiarla y en vez de "127.0.0.1" poner la ip publica.

    Tambien tendira que configurar en el windows 7 para poder recibir conexiones remotas ??

    desde ya gracias por las respuestas


    www.tootonga.net
    viernes, 23 de abril de 2010 0:18

Respuestas

  • hola

    ehh no creo que hay un error de concepto, cuando pones a escuchar el servicio lo sigues haciendo a la ip local de tu pc

    solo que en el router configuras el mapeo del puerto para decir que puerto de wan mapeara con que ip y puuerto de lan, esto en el router

    ahora bien el que si cambia es el cliente, que debe usar la IP Publica, de WAN, alli es donde debes usarla, en el cliente, no en el servidor

    entonces lo pasos seria

    - servidor usa la IP 127.0.0.1 puerto 50000

    - en el router mapeas el puerto 50000 de wan con el 50000 e ip 192.168.1.100  (ip de la pc donde corre el servicio)

    -en el cliente se conecta el puerto 50000 y la ip de wan que puedes obtener con: http://www.whatismyip.com/

    saludos

     


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta micron_82 sábado, 24 de abril de 2010 19:51
    sábado, 24 de abril de 2010 1:44

Todas las respuestas

  • hola

    pero estas en la misma pc o sea es todo local, cual seria la ip publica ?

    o sea no hay ip publica aqui, o te refiera a la ip de tu LAN, si es esta debo decirte que el concepto de ip pulica apunta mas bien a una ip de tu WAN, la que asignaria tu ISP (Internet Service Provider) cuando te conectas a interner, por eso la duda

     

    si es la ip de LAN a la que te refieres, en realidad es indistinto, ya que el 127.0.0.1 representa esa ip, o sea una conexion local

    pero si quieres usar la ip de lan seria igual, es mas para sacarte las dudas, prueba suarla, y ver que apsa, si ves algun error en la conexion, prueba desabilitando el firewall de windows por als dudas este resolviendo un acceso remoto, pero igual lo dudo

    saludos
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    viernes, 23 de abril de 2010 4:59
  • Hola Leandro gracias por responder, todo es desde la misma PC o sea local, y con respecto a lo de la IP publica, me referia como vos decis a la ip que me asigna mi ISP cuando me conecto a internet.

    Hacer que la aplicacion funcione en una LAN no es el problema porque poniendo tanto 127.0.0.1 como 192.168... conecta igual, lo que yo quiero es probar la aplicacion en una WAN, por eso en el windows 7 instale el virtual PC con el windows xp para simular un Servidor (el win 7) y el cliente ( win xp ); lo que probe recien es poner la ip publica en la parte de servidor para ver si conecta y me tira error al conectar,

                   IPAddress local = IPAddress.Parse("IP Publica");
                    oyente = new TcpListener(local, 50000);
                   
                    oyente.Start();  // Aca me tira error

    el firewall de windows esta desactivado; no sera que tengo que abrir el puerto 5000 en el router primero ?


    www.tootonga.net
    viernes, 23 de abril de 2010 17:33
  • Abri el puerto 50000 en el router y cree una regla en el firewall de windows para que este abierto pero igualmente no me conecta, solo funciona de estas dos formas:

    IPAddress local = IPAddress.Parse("127.0.0.1");
    oyente = new TcpListener(local, 50000);

    o

    IPAddress local = IPAddress.Parse("192.168.1.100");
    oyente = new TcpListener(local, 50000);

    la verdad que estaria bueno que pueda usar el programa desde Pcs que no esten solamente una Lan, si alguien sabe algo espero la respuesta.

    Gracias


    www.tootonga.net
    viernes, 23 de abril de 2010 20:34
  • hola

    ehh no creo que hay un error de concepto, cuando pones a escuchar el servicio lo sigues haciendo a la ip local de tu pc

    solo que en el router configuras el mapeo del puerto para decir que puerto de wan mapeara con que ip y puuerto de lan, esto en el router

    ahora bien el que si cambia es el cliente, que debe usar la IP Publica, de WAN, alli es donde debes usarla, en el cliente, no en el servidor

    entonces lo pasos seria

    - servidor usa la IP 127.0.0.1 puerto 50000

    - en el router mapeas el puerto 50000 de wan con el 50000 e ip 192.168.1.100  (ip de la pc donde corre el servicio)

    -en el cliente se conecta el puerto 50000 y la ip de wan que puedes obtener con: http://www.whatismyip.com/

    saludos

     


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta micron_82 sábado, 24 de abril de 2010 19:51
    sábado, 24 de abril de 2010 1:44