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
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
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.
(http://img687.imageshack.us/img687/9921/socketsu.jpg)
yo cambiaria esto
Console.Write(">>> "+strData+"\n");
por
COnsole.Writeline(">>> "+strData);
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.
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.
Llevas razón seba123neo, acabo de ver tu code y la solución la he encontrado en esta línea
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
Array.Resize(ref buffer, rec);
y así evito leer la entrada de la tecla intro al leer. Gracias por la ayuda compañeros. Saludos! ;)