[SOLUCIONADO][C#] Evitar la lectura de la tecla intro en sockets tcp/ip

Iniciado por Dryken, 28 Diciembre 2012, 15:19 PM

0 Miembros y 1 Visitante están viendo este tema.

Dryken

He creado por modo consola 2 app que se comunican entre ellas, cliente y servidor. Lo típico, en el cliente escribes algo y el servidor lo recibe.

Funciona correctamente, pero el único "problema" si es que puede llamarse así es que en el servidor se muestra lo enviado desde el cliente pero con un salto de línea. Creo que el problema es que al pulsar la tecla intro para enviar, dicha tecla también se envía.

Llevo bastante tiempo intentando averiguar como solucionarlo pero ya tengo la mente quemada, ojalá algunos tenga la mente más fresca.

Servidor

Código (csharp) [Seleccionar]
using System.IO;
using System.Diagnostics;
using System.Text;
using System.Threading;
using System.Runtime.InteropServices;
using Microsoft.Win32;
using System;
using System.Net.Sockets;
using System.Net;

namespace socket_servidor{
class Program{

public static void Main(string[] args){

Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
           IPEndPoint ep = new IPEndPoint (IPAddress.Any, 1238);
           
          try {
              s.Bind (ep);
              s.Listen (25);
  Socket accepted = s.Accept();
 
                  Console.WriteLine("Conexion recibida\n");  
                 
                  while(true){
  byte[] buffer = new Byte[255];
                  int rec = accepted.Receive(buffer,0,buffer.Length,0);
                  string strData = Encoding.ASCII.GetString(buffer);
Console.Write(">>> "+strData+"\n");
                  }

            }catch {
                  Console.WriteLine ("Error iniciando conexion");
                  Console.ReadKey();
               }
}
}
}



Cliente

Código (csharp) [Seleccionar]
using System.IO;
using System.Diagnostics;
using System.Text;
using System.Threading;
using System.Runtime.InteropServices;
using Microsoft.Win32;
using System;
using System.Net.Sockets;
using System.Net;

namespace sockets{
class Program{

public static void Main(string[] args){

Console.WriteLine ("Conectandose al servidor...");
           Socket _S = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // Socket de tipo TCP.
           IPEndPoint ep = new IPEndPoint (IPAddress.Parse ("127.0.0.1"), 1238); // Ip - Puerto

          try {
               _S.Connect (ep);
                   Console.WriteLine ("Conectado correctamente.\n");
                   
                   while(true){
                    Console.Write(">>> ");
            string text = Console.ReadLine();
            byte[] data = Encoding.ASCII.GetBytes(text);
            _S.Send(data);                  
                   }
           
          }catch(Exception ex) {
                Console.WriteLine (ex.Message);
                Console.ReadKey();
               }

}
}
}



Vamos, solucionar el salto de línea que produce la lectura de la tecla intro.


Lo intentas y fracasas, lo intentas y fracasas pero fracasas realmente cuando dejas de intentarlo.

Calc Don v0.7 - C
http://foro.elhacker.net/programacion_cc/source_calculadora_calc_don_10-t366489.0.html

Hundir la flota v0.3 - C#
http://foro.elhacker.net/net/source_c_juego_hundir_la_flota_v01-t377794.0.html

spiritdead

yo cambiaria esto

Console.Write(">>> "+strData+"\n");
por
COnsole.Writeline(">>> "+strData);
Facilitador De Tareas - Task Simplifier (FDT)

seba123neo

no, al parecer es un problema del buffer y el string, el problema esta en el server.

en el server despues de la linea que dice "Listen", debe quedar asi el codigo para que funcione (pasalo a C#) te vas a dar cuenta de las diferencias.

Código (vbnet) [Seleccionar]
            While True
                Console.WriteLine("Esperando Conexion..." & vbLf)
                Dim accepted As Socket = s.Accept()
                Dim strData As String = ""

                While True
                    Dim buffer As Byte() = New [Byte](254) {}
                    Dim rec As Integer = accepted.Receive(buffer)
                    strData += Encoding.ASCII.GetString(buffer, 0, rec)
                    Console.Write(">>> " + strData & vbLf)
                End While

            End While


con eso funciona.

saludos.
La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

Dryken

Llevas razón seba123neo, acabo de ver tu code y la solución la he encontrado en esta línea

Código (csharp) [Seleccionar]
strData += Encoding.ASCII.GetString(buffer, 0, rec)

lo que he echo ha sido simplemnete colocar esta línea en el server para evitar los carácteres nulos

Código (csharp) [Seleccionar]
Array.Resize(ref buffer, rec);

y así evito leer la entrada de la tecla intro al leer. Gracias por la ayuda compañeros. Saludos!  ;)

Lo intentas y fracasas, lo intentas y fracasas pero fracasas realmente cuando dejas de intentarlo.

Calc Don v0.7 - C
http://foro.elhacker.net/programacion_cc/source_calculadora_calc_don_10-t366489.0.html

Hundir la flota v0.3 - C#
http://foro.elhacker.net/net/source_c_juego_hundir_la_flota_v01-t377794.0.html