Una red de computadoras (ordenadores) consiste en máquinas interconectadas mediante canales de comunicación. Estas máquinas son Hosts y Routers. Los Hosts son computadoras que ejecutan aplicaciones, por ejemplo un navegador. Los Routers son equipos cuyo trabajo es retransmitir información de un canal de comunicación a otro. Estos pueden ejecutar programas, pero normalmente no son aplicativos. Para este post un canal de comunicación es un medio de transmisión de secuencias de bytes de un host a otro, este puede ser broadcast, como Ethernet, un modem dial-up, o algo más sofisticado.
Otro término que tenemos que definir es Protocolo. Un protocolo es un acuerdo acerca de los paquetes intercambiados por comunicación de los programas y lo que significan, además describe como está estructurado, por ejemplo: donde está la información del destinatario en el paquete y de que tamaño es. Un ejemplo es Http (Hypertext Transfer Protocol) que resuelve el problema de transferir objectos hipertexto entre servidores y hacerlo entendible por personas.
Ahora vamos directo al grano: ¿Qué es un Socket?
Un socket es una abstracción que permite a la aplicación “enchufarse” a la red para poder recibir y enviar data. Los principales tipos de socket hoy en día son los Stream Socket y los Datagram Socket. Los Stream Sockets utilizan TCP e IP para proveer n servicio confiable. Los Datagram Sockets usan UDP.
Otro concepto importante son el Stream Reader y el Stream Writer.
Son clases que nos ayudan a escribir y leer del buffer del socket. Sino existieran habría que leer el buffer y escribir en él directamente, cosa que es un poco engorrosa e innecesaria para la mayoría de las aplicaciones.
Código de ejemplo:
public class NetworkServer
{
public static void Main()
{
//creamos un thread para que el server
//se ejecute en paralelo con el cliente
//esto es solo por motivos prácticos del demo
new Thread(new ThreadStart(
delegate {
new NetworkServer().Start(); }
)).Start();
//Iniciamos el Cliente
new Client().Connect();
Console.WriteLine("Listo");
Console.Read();
}
public void Start()
{
// Creamos un TcpListener y le indicamos que
//puerto va a poner en escucha.
TcpListener tcpListener = new TcpListener(9898);
//Iniciamos la esucha
tcpListener.Start();
//Este método queda bloqueado hasta que
//se conecte un cliente
Socket socketForClient = tcpListener.AcceptSocket();
if (socketForClient.Connected)
{
// Si se conecta
Console.WriteLine("Cliente conectado.");
//Creamos el networkSream, el Reader y el writer
NetworkStream networkStream =
new NetworkStream(socketForClient);
StreamWriter streamWriter =
new StreamWriter(networkStream);
StreamReader streamReader =
new StreamReader(networkStream);
//Esta es la data a enviar.
string theString = "Esta es la data de envio";
try
{
//Escribimos la data en el stream
streamWriter.WriteLine(theString);
//Ahora le decimos que la mande.
streamWriter.Flush();
//Esperamos data del cliente
//Y la escribimos por consola.
theString = streamReader.ReadLine();
Console.WriteLine(theString);
}
finally
{
//Cerramos las conexiones
streamReader.Close();
streamWriter.Close();
networkStream.Close();
socketForClient.Close();
}
}
}
}
public class Client
{
public void Connect()
{
TcpClient socketForServer;
string server = "localhost";
try
{
//Creamos un TcpCliente y le pasamos
//el server y el puerto.
socketForServer = new TcpClient(server, 9898);
}
catch
{
Console.WriteLine(
"No se pudo conectar a {0}:9898", server);
return;
}
//aqui es lo mismo que en el server. Usamos StreamWriter y Reader.
NetworkStream networkStream = socketForServer.GetStream();
StreamReader streamReader =
new System.IO.StreamReader(networkStream);
StreamWriter streamWriter =
new System.IO.StreamWriter(networkStream);
try
{
string outputString = streamReader.ReadLine();
Console.WriteLine(outputString);
streamWriter.WriteLine("Mensaje desde el Cliente");
streamWriter.Flush();
}
catch
{
Console.WriteLine("Exception reading from Server");
}
finally
{
networkStream.Close();
}
}
}
Esto es un demo muy básico, pero funciona correctamente. Se le pueden añadir funcionalidades como multithreading para poder aceptar a varios clientes al mismo tiempo.
Y como siempre gracias por leer!
esta mas o menos entendible tu codigo
ResponderEliminarGracias por las críticas, se que se puede mejorar, posiblemente trabaje en eso este mes.
ResponderEliminarUn saludo.
hola, soy nuevo en esto, como haces el delegado, para llamar los metodos
EliminarHola Robert, si te fijas es simplemente "delegate { }", ahora en las últimas versiones de .Net podrías pasar una expresión lambda. "()=> {}"
Eliminarhola amigo excelente aporte, solo una pregunta: la comunicacion es entre 2 computadoras o es en la misma computadora. Gracias
ResponderEliminarHola, puede ser desde uno o más dispositivos distintos. Es decir, a veces necesitas comunicarte localmente con otro proceso y TCP a veces es una opción. Pero lo más común es que se utilize para conectarte a otro programa en remoto, tanto dentro como fuera de una red local.
EliminarEs indiferente, lo único que tienes que tener en cuenta es que en el cliente es el que dice a donde conectarse, entonces, esta línea string server = "localhost"; es la que dice a cual server. En este caso localhost, pero puede ser un dominio de internet o cualquier dirección IP.
ResponderEliminarUn saludo carlos.
Tengo un problema,han bloqueado mi IP de un chat...como puedo hacer para desbloquear?
ResponderEliminarHola Juan!
ResponderEliminarEstoy tratando de entender un poco el tema de los sockets y hay UNA sola cosa que no me queda clara en tu código: COMO HAGO para mantener activa una conexion? O cada vez que necesito mandar un mje tengo que reconectar el cliente con el servidor? Asumo que no, y si estoy en lo correcto me gustaría saber como tengo que hacer para mantener tres o cuatro clientes conectados con el server y mandarles en determinados eventos un mensaje...
Muchas gracias de ante mano!
Germán.-
hola juan me pregunto si tu codigo podria mandar msj a un panel de leds via ethernet es decir tengo la ip del panel de leds y quiero enviarle msj desde mi computadora se podria?
ResponderEliminar@José, si, claro que sí. Si tienes la IP, el Puerto, y si conoces el protocolo de los mensajes que le tienes que enviar al panel no habrá ningún problema.
ResponderEliminar@Picho/Germán, lo siento, no había visto tu entrada en los comentarios. Mi código es un demo, y por eso cierro la conexión, pero tu simplemente no llamarías al Close() en ese momento sino cuando cierres la aplicación o en un botón, etc. .Espero no sea muy tarde.
Un saludo.
disculpa y como haria para ingreasr la dirccion del servido. y no este como "localhost"
ResponderEliminarcomo puedo crear un programa usando sockets para ver los programas que tiene abierto el cliente y poder finalisarlos.
ResponderEliminarHola, Puedes explicarte un poco más? x)
ResponderEliminarcomo puedo crear un programa usando sockets para ver los programas que tiene abierto el cliente y poder finalisarlos desde el usuario
ResponderEliminarperdon me equivoque la pregunta es como puedo crear un programa usando sockets para ver los programas que tiene abierto el cliente y poder finalisarlos desde el servidor
ResponderEliminarEse cliente, es tuyo? o es una aplicacion de terceros?
ResponderEliminarEstoy interesado en saber cual es la diferencia entre mantener la conexion y abrirla cuando este para enviar informacion.
ResponderEliminarErikson, Todo depende de lo que vayas a hacer. Si mantienes la conexión abierta tienes un límite de conexiones por servidor (este límite es grande pero es finito), y si cierras las conexiones y las abres solo cuando las necesitas entonces puedes conectar infinitos clientes, claro, a costa de más complejidad.
ResponderEliminarEjemplo de siempre conectado: Aplicaciones de mensajería, msn, skype, etc
Ejemplo de desconección: Protocolo Http, entre webservers y navegadores.
un saludo.
Disculpa, como le hago para simular tu codigo? que cprograma uso para poder correrlo y asi poder comunicar las 2 pc virtualmente?
ResponderEliminarC# , puedes descargarte Visual Studio Express que es totalmente gratuito y sin ninguna limitación:
ResponderEliminarhttp://www.microsoft.com/visualstudio/eng/products/visual-studio-express-products
Un saludo!
Muchas gracias lo probare por que lo necesito para mi proyecto.
ResponderEliminarAun tengo problemas para verlo, soy nuevo en esto y no tengo nada de experiencia en estos lenguajes pero te mande un correo con lo que necesito hacer aver si puedes ayudarme....
ResponderEliminarBuenas Juan Andreu en primer lugar darte las gracias por compartir tus conocimientos. Al leer el post se me plantean algunas dudas.
ResponderEliminar- Si quiero conectar dos máquinas distintas, como lo haría, ejecutaría la solución completa en ambas maquinas con los host configurados como las ips de la otra máquina? o con lanzarla en una máquina y configurar el puerto en la otra bastaría? Disculpa si es una pregunta tonta pero estoy pegado en el tema de conexiones y socket.
Un saludo y gracias de antemano
Hola,
ResponderEliminarBueno, la idea es tener dos aplicaciones, una cliente y la otra servidor. Aunque se puede programar el servidor para aceptar mas de una conexión al mismo tiempo.
Esas dos clases van en dos proyectos separados, siento no haberlo dejado más claro.
Gracias por comentar!
Hola amigo, cuando intento conectarme por IP publica, me dice que el tiempo esta agotado para la conexion, que puedo hacer en este caso?
ResponderEliminarHola, pueden ser muchas cosas. Desde que ese equipo tenga un firewall, a problemas con la red.
ResponderEliminar1) Verifica que ese equipo sea visible desde donde intentas conectarte.
2) Busca un scanner de puertos y verifica que ese puerto esté abierto.
Un saludo.
Excelente Aporte! Gracias
ResponderEliminarbuenas!
ResponderEliminarsi quisiera hacerlo para varios clientes, en el servidor lo que debería hacer, es cuando acepto la conexión genero una función que hará lo que tu haces para el envió y la recepción, pero esta la ejecutare en un subproceso. y asi con cada cliente que se conecte?
(algo asi...)
funcion (socket socketForClient){ //esta la iniciare con subproceso
if (socketForClient.Connected)
{
// Si se conecta
Console.WriteLine("Cliente conectado.");
//Creamos el networkSream, el Reader y el writer
NetworkStream networkStream =
new NetworkStream(socketForClient);
StreamWriter streamWriter =
new StreamWriter(networkStream);
StreamReader streamReader =
new StreamReader(networkStream);
//Esta es la data a enviar.
string theString = "Esta es la data de envio";
try
{
//Escribimos la data en el stream
streamWriter.WriteLine(theString);
//Ahora le decimos que la mande.
streamWriter.Flush();
//Esperamos data del cliente
//Y la escribimos por consola.
theString = streamReader.ReadLine();
Console.WriteLine(theString);
}
}
Exactamente Matías, cada cliente aceptado debería ejecutarse en un subproceso (Thread/Hilo) distinto.
ResponderEliminarPuedes hacer una clase que maneje los hilos, y a su vez otra clase que gestione el comportamiento de cada cliente. Así vas construyendo robustez y escalabilidad.
Tengo ganas de hacer un post al respecto, pero no he tenido tiempo!
Gracias por comentar!!
Muchas gracias por tu respuesta, tengo un problema el servidor solo puede escribir cuando el cliente ha enviado algo.
ResponderEliminary esto es una modificación que hice para que el cliente este intentado conectarse hasta que el server inicie!
________________________________________________
class MainClass
{
public static bool error (TcpClient socketForServer){
try{
socketForServer = new TcpClient("localhost",8100) ;
return true;
}
catch
{return false;}
}
public static void Main (string[] args)
{
TcpClient socketForServer = null ;
bool status = true ;
try
{ bool ayuda = false;
while(ayuda == false){
ayuda=error(socketForServer);
}
socketForServer = new TcpClient("localhost",8100) ;
Console.WriteLine("Connected to Server") ;
}
catch
{
Console.WriteLine("Failed to Connect to server{0}:999","localhost") ; //volver a intentar de conectar
return ;
}
Qué tal?
ResponderEliminar1) Bueno, puedes solucionarlo de varias formas. Y todo depende de tus requerimientos. Por ejemplo, si siempre necesitas que el cliente haga un request inicial, o si el servidor es el que lo hace. También puedes establecer un canal paralelo de forma inversa a como te conectas al servidor, en donde el servidor es quien manda una señal o datos al cliente (por un puerto aparte). Otra forma también factible es una mejora de la ultima y es simplemente dos threads paralelos en el cliente, y dos en el servidor por cada cliente. Así funcionan las aplicaciones de comunicación.
2) Está bien lo que haces, te doy varios consejos por lo que puedo ver:
- No mezcles inglés con español. Está bien programar en español, pero no hagas ensaladas de idiomas!
- Nunca me gustó programar todo en el Program.cs, ni en pruebas. Crea clases con comportamientos encapsulados. Luego una clase algo así como "Servidor" en donde la instancias y la inicias en el main, de esta forma te quedaría algo asi:
public static void Main (string[] args)
{
var servidor = MiSuperServidor();
servidor.Iniciar();
}
- El try-catch debería estar dentro del while (según yo).
PS: ya que estás por aquí, probablemente ponga una encuesta en la primera página para que los visitantes puedan elegir el próximo tema sobre el que voy a escribir! No te olvides de votar.!
Un saludo!
No hay una forma de que tanto el cliente como el servidor, manden varios mensajes, sin tener que utilizar otra conexión en paralelo?
ResponderEliminarNo creo, porque dependes de que el canal esté usado o libre..
ResponderEliminarBuenas tardes.
ResponderEliminarPara preguntar, a ver si me pueden orientar.
Que me recomiendan utilizar para crear la siguiente conexión:
Desde una terminal CK71 mobile, necesito enviar información a una dirección/puerto, el ambiente está en progress, pero no se si sea conveniente usar sockets.
He utilizado sockets desde progress hacia algún dispositivo con ip y puerto asignado, pero no, de un dispositivo hacia mi servidor en donde se encuentra progress.
El desarrollo se está llevando a cabo en C#, pero, que me recomendarían?
El detalle es este, necesito enviar información leida en una terminal, a mi servidor en donde se encuentra progress, para realizar una consulta y traer el resultado de nuevo a la terminal.
Sabes que podría hacer en este caso?
De antemano, muchas gracias.
Saludos.
Roberto Barajas
Hola!,
EliminarTienes varias soluciones:
1) Usar C# para conectarte directamente con TCP/IP. (No hay impedimento para esto).
2) Si existe algún problema, puedes hacer un webservice en el servidor y conectarte desde el dispositivo móvil mediante éste.
3) Una base de datos Sql Server en el servidor, y en el móvil utilizar Sql Server Replication.
4) Busca en internet a ver si Progress tiene algún tipo de API o algo parecido.
Suerte!
Buenas me da un error en q no reconoce el tipo tread donde lo puedo solucionar gracias
ResponderEliminarTe repondo después de dos años!! LO SIENTO!! ya no es por ti (que suponog que lo habrás solucionado), sino por otro que pueda tener este mismo problema.
EliminarTe faltó, seguramente, añadir los namespaces correspondientes a las clases. En este caso, System.Threading.
Un saludo!
Buen día. Gracias por el tutoria. Tengo una duda, si por ejemplo tengo 2 clientes conectados a mi servidor de manera permanente (que no cierro conexión), ¿cómo puedo en cualquier momento poder enviarle un mensaje a cada uno de ellos de manera específica? ¿al momento que se crea la conexión se crea un identificador para diferenciar cada conexión? me gustaría tener un idea general o que me brindes una palabra clave con la cual comenzar mi búsqueda. Muchas gracias de antemano.
ResponderEliminarHola Johnny,
EliminarEs correcto, tienes que, de alguna forma, identificar a los clientes. Puedes escribirte tu propio protocolo, o por ejemplo algo más simple, puedes mapear cada cliente a una IP y un identificador, de forma tal que puedas inequívocamente identificarlos.
Lo que yo haría es crear un protocolo simple entre tus clientes. En donde al momento de que se cree la conexión, le envías un identificador que luego puedas hacer un "request" o llamada de ese identificador. Y mejor si aprovechas este protocolo y lo escribes para que puedas escalarlo para más opciones. Ejm: Pedir IP al cliente, Pedir Identificador, Cerrar connecion de forma remota, enviar mensajes, establecer estados, confirmar estados, etc.
Todo esto se hace enviando y recibiendo strings específicos que te "inventes" para cada operación.
Mírate algún código de un bot de IRC, que funcionan de forma parecida parseando textos de chat y convirtiéndolos en acciones en el servidor. Aunque en tu caso sea inverso, los mensajes van del server al cliente, pero la idea es la misma.
Cualquier cosa me escribes de nuevo y te respondo lo más rápido que pueda.
Un saludo!
Hola Juan Andreu,
ResponderEliminarMe parece interesante el tema, tengo poco conocimiento de estos conceptos y como estos se relacionan, tendras algun link de algun autor sobre sockets para novatos? cual recomendarias?.
Hola que tal?
EliminarHe buscado y no hay mucho material básico. Te recomiendo leer esto primero:
http://es.ccm.net/contents/282-tcp-ip
Luego
http://www.codeproject.com/Articles/13071/Programming-Windows-TCP-Sockets-in-C-for-the-Begin
Esta en inglés pero está genial.
Intenta leerte todo lo que puedas en la wikipedia sobre redes, ip, tcp, sockets, conexiones, capas, etc. Ya que es muy importante tener todos esos conocimientos, incluso cuando prefieras usar alguna capa por encima y facilitarte la vida, siempre es bueno saber que hacen esas librerias por debajo. Creeme que te resolverá muchos problemas.
Un saludo!
Excelente , Gracias Estimado ! por compartir tus conocimientos,
Eliminarsaludos!, y tendras alguna cuenta social por donde compartes sobre programacion?
Si pero últimamente no escribo mucho. Sígueme en twitter @blogdejuan
EliminarA ver si le dedico un poco a esto y publico más artículos!
Tengo ganas de hacer una serie de post que describan lo que voy haciendo con un proyecto nuevo que está por salir.
Gracias por tu comentarios!
Saludos, aun esta activo este post? (excelete articulo), tengo un problema , y queria ver si me podrian ayudar, gracias
ResponderEliminarClaro que sí!
EliminarQué problema es?
Hola, yo tengo una cuestión que no me ha quedado clara...¿Existe la posibilidad que desde un router wireless como el de tplink, el cual puede configurarse accediendo por su ip en un browser, mande sockets o un ping continuado a una raspberry que está conectada mediante una interfaz wifi a la red creada por el router? Mi objetivo es leer en la raspberry la potencia del router pero únicamente puedo hacer desde la página de configuración un máximo de 50 pings, si pudiera enviar infinitos ping o sockets...
ResponderEliminarHola Leyre. Tendrías que tener un router capaz de ejecutar tareas o scripts. Normalmente el de casa, el que te da la compañía de internet, no es tan custom como otros modelos más avanzados.
EliminarTpLink tiene routers buenos, pero no se si se pueden ejecutar programas o comandos desde él.
Tendrías que buscar primero la forma de flashear el SO del router para ponerle otro que te permita ejecutar más cosas (aparte de la capacidad natural de router), por ejemplo DDWRT.
Lista de routers compatibles:
http://www.dd-wrt.com/wiki/index.php/Supported_Devices
Luego tendrias que hackear el router:
http://www.howtogeek.com/98408/how-to-install-additional-software-on-your-router-dd-wrt/
Luego te programas lo que necesites y lo ejecutas como un daemon. Recuerda que es linux, por lo que si haces tu "ping" en .net tendría que ser Mono compatible! (no es muy dificil)
Un saludo!
como cerrar la coneccion desde un cliente a sin que se caiga mi servidor? gracias por tu ayuda
ResponderEliminarNo puedo probar esto, por falta de tiempo.
ResponderEliminarNo es posible lo que describes, ya que es imposible saber si se ha cerrado , o se ha caido la conexion , o si hay problemas, etc.
Lo que tienes que hacer es controlar del lado del servidor el estado de cada cliente conectado. Una forma de hacer esto, y la que yo creo es la mejor, es haciendo "poll" al cliente.
Metes este codigo en un metodo en donde tengas encapsulado la logica del cliente y lo llamas cuando sea necesario.
Tambien tienes que tener en cuenta excepciones y controlarlas.
El problema esta en que la propiedad Connected a veces retorna true y no es veridico.
//nSocket es el socket de TcpClient. Lo obtienes asi: tcpClient.Client
if (_nSocket.Connected)
{
if ((_nSocket.Poll(0, SelectMode.SelectWrite)) && (!_nSocket.Poll(0, SelectMode.SelectError)))
{
byte[] buffer = new byte[1];
if (_nSocket.Receive(buffer, SocketFlags.Peek) == 0)
{
return false;
}
else
{
return true;
}
}
else
{
return false;
}
}
else
{
return false;
}
Si aun tienes problemas con tu codigo, te recomiendo revisar el diseño de tu logica, y siempre escribir todo de forma tal que puedas controlar errores en todo momento. No solamente tu servidor no deberia caerse si el cliente se desconecta, sino que tambien si se cae la conexion, etc.
Un saludo.
Muchas gracias por el aporte se agradece mucho.
ResponderEliminarHola, cuando ejecuto el programa cliente funciona todo bien, pero si reinicio el programa cliente se queda trabado, me veo obligado a reiniciar el programa servidor.Alguien sabe por que?
ResponderEliminarcomo puedo ejecutar el programa cliente sin reiniciar el servidor?
Hola,
EliminarTienes que tener en cuenta que esto es solo DEMO, una prueba de código para demostrar el funcionamiento básico de estas librerias.
Tienes que comprobar que al desconectarse el cliente "muera" el hilo relacionado con él, y que siga escuchando peticiones entrantes subsecuentes.
Fíjate que el cliente y el servidor estan en el mismo proceso, deberían estar separados. Y tambien el método AcceptSocket se llama una sola vez. Deberías llamarle varias veces y crear un hilo por cada petición.
Lamentablemente ya no tengo mucho tiempo para crear más tutoriales :(
Hola Juan, me pareció muy bueno tu articulo ya que no hay demasiada info y expertice del tema.
ResponderEliminarEstoy tratando de encontrar info para poder tomar estadística de los puertos/sockets tcp, te pongo en contexto, tengo una aplicación cliente servidor que no es mía es de un fabricante americano y tiene desconexiones con otras aplicaciones clientes, el sistema se basa en servicios distribuidos que se conectan por socket y estos están teniendo desconexiones, como son servicios críticos del negocio me surge la necesidad de poder determinar cual es el problema ya que problemas de red no son porque corren otros servicios de las mismas características en los host y los otros servicios no sufren el problema, se me ocurrió poder contabilizar los bytes enviados y recibidos en el socket y los tiempos promedios de recepción y envio como para tener la evidencia si es un problema de la aplicacion/servicio en este caso recibiria bytes pero no enviaria o al menos tener mas info para continuar en busca de la causa del problema.
Te agradezco de ante mano y en lo que me puedas colaborar sera bienvenido¡¡
Abrazo.
Buenas, te recomendaria que descartases red completamente y usases https://www.wireshark.org o similar.
ResponderEliminarLuego podria ser que teniendo una red problemática, algunos servicios estén mejor preparados para ello que esa aplicación, por lo que se generan las caidas.
Prueba con wireshark o similar y trata de determinar el problema exactamente y aislarlo.
Como son servicios distribuidos, deberías montar algo que te permita duplicar la transmisión en cualquier endpoint, asi vas variando y depurando cada equipo y tramo de red.
Un saludo
Hola me podrias ayudar. como es que podria recibir mas de un cliente y contestarles
ResponderEliminarEste comentario ha sido eliminado por el autor.
ResponderEliminarhola como estan me gustaria saber como puedo comunicar una tarjeta que me esta enviando informacion de un sensor constantemente por el puerto ethernet con c# , seria manejarlo como cliente servidor con socket o existe una manera diferente en c# ?
ResponderEliminarSí, sin problemas. Con un server TCP/IP o uno UDP (dependiendo de como te envíe los datos el sensor) te vendría bien.
EliminarSi puedes configurar el sensor para que apunte a cualquier sitio, pues lo único que tendrías que hacer es un pequeño Server y escribir la data a algún Stream y luego tratarla. Podrías guardar luego en base de datos o en archivos de texto.
Qué dispositivo es el del sensor?
hola juan mira bascicamente lo que deseo hacer es comunicar una bascula a la cual le estoy conectando un conversor de rs232 a lan y que c# me lea el dato del peso , por medio de hyperterminal ya probé la comunicación y funciona bien , pero la verdad necesito es ver esos datos en c#
EliminarHola, disculpa la tardanza. Sigues con el problema?
EliminarHas podido resolver?
Podrías decirme que adaptador de serial-ethernet estás usando?
Saludos
Hola Juan, deja te explico mi caso a ver si me das alguna idea. Tengo Un aplicacion que polea unos equipos por puerto serial y extrae la informacion. La idea es modificar los equipos seriales y ponerles un wifi, en este caso es un esp8266. Como puedes ver el cliente no envia sino que almacena hasta que es consultado. He encontrado varios ejemplos de server-cliente, pero siempre hay una actividad entre ambos lados. Como podria tener un server que vaya al cliente y ver si hay datos. He pensado en un software tercero, un puerto virtual serial para asociarlo a una IP y asi no modificar la aplicacion original. Bueno tengo que ver jale primero. Saludos
ResponderEliminarHola, esp8266 es SOC, por lo que puedes modificar el código y hacer que "escuchen" y convertirlos en "server". En realidad, un simple modelo de webhooks bidireccional te valdría. O si Http es muy alto nivel, y prefieres TCP/IP entonces es otra historia,
EliminarDe todos modos, lo mejor es programar el esp8266 para que tire data cada X tiempo, y tener un server que guarde toda la info y posteriormente la proceses.
Por otro lado, si tienes que leer cuando salte algún evento de tu lógica de negocios y ese evento es externo a dichos equipos, entonces tendrías que convertirlos en "server" (recuerda que es SOC y puedes tener tu propio programa) o hacer que ellos conecten al server, mantenerlos conectados, y enviar un comando que te retorne data a peitición.
Espero haber entendido la pregunta!! Sino, no dudes es responder :)
Gracias por tu respuesta. Estoy tratando de usar el COM2tcp software, para ver si se puede seguir usando la misma apliacion para no modificarla, ni modificar el codigo duro de la botonera. Las botoneras las configure como cliente y la pc que tiene la aplicacion de poleo la puse como server.
ResponderEliminarCon COM2tcp básicamente te conectas al dispositivo y envías los comandos como si fuese serial, el resto el software lo hace por ti. El problema es saber a donde conectarte. Creo que vas a tener que modificar código para tener más control.
EliminarLo mejor que puedes hacer ahora, para que no tengas tantos problemas es poner a un dispositivo entre ambos, Algo tipo arduino, o raspberrypi, algo barato, que obtenga la data raw, y sea éste quien se conecte a tu server y se haga cargo del resto.
De ésta forma no tienes que modificar código que quizás no estén bien comentados o documentados. Sería estilo IoT.
saludos
Bueno, cada dispositivo tiene un Id ejem. 0722. La aplicacion checa la base de datos local y hay reside que cada id de equipo, asi que comienza con el primero hasta el final. Entonces pregunta eres el ID 0722 y el equipo responde, si es, se extrae la info.
EliminarVoy a probar con el com2tcp y les mantengo al tanto.
Juan, tienes correo personal para mandar una imagen de como esta y lo que se quiere por cuestion de actualizacion tecnologica. Saludos
EliminarSí. Puedes escribirme a contact arroba andreujuan punto com
EliminarSaludos
Gracias Juan, acabo de enviar las imagenes.
EliminarSaludos
Buen dia Juan, que te cuento, por asares del destrino me encontre otro software parecido al com2tcp y este si cumplio con lo que deseaba. La version demo funciona hasta con 2 equipos conectados y eso me permitio decidir comprarlo. Esta en aggsoft dor comm. Saludos
EliminarBuenísimo, me alegro. Y disulpa que no te haya podido ayudar más, he estado super ocupado ultimamente.
EliminarSaludo!
amigo esta muy bueno pero podrias decirme que using usastes? es que copie el codigo y "NetworkServer" y "Client" me marcan un error linea roja, porfa dime que falta .
ResponderEliminarHola, ahora mismmo no estoy en PC, por lo que lo compruebo de memoria y creo que System.Net.Sockets y System.IO, si falta alguno te debería dar el error sobre la clase que falta y no sobre la clase que estás declarando.
EliminarSaludos
Hola amigo,
ResponderEliminarQuiero hacer un programa en C# el cual pueda tener comunicación con un dispositivo que tiene IP, el cual quiero que mi programa se comunique con el via IP y ya con eso poder hacer mi programa para que haga lo que yo quiera... podras darme una idea de como tener comunicación con mi programa y el dispositivo.??
Hola, perdona que no te había respondido, no vi la notificación de tu mensaje.
EliminarMás o menos este programa del tutorial sería un buen comienzo. Aunque supongo que solamente usarías la parte de "cliente".
Saludos
Saludos
ResponderEliminarHola, soy nuevo en lenguaje C# quiero hacer un proyecto para pc donde pueda enviar notificaiones a usuarios conectados por wifio por lan, ya sea moviles o pc alguien me podria ayudar??? como seria el codigo o algun link donde pueda buscar sobre el tema. Gracias
Para enviar notificaciones necesitas algún tipo de aplicación cliente-servidor.
EliminarPodrías comenzar por hacer algo local (tipo este ejemplo) y luego hacer más pruebas en red wifi.