Elección de los lectores
Articulos populares
Algunos lectores, al ver el título de la sección, pueden indignarse y preguntar: "¿Cuál es la conexión entre X-Coding y un simple chat?" Básicamente, no hay conexión. Chat es un programa sencillo que funciona con la red. Sé que no se puede poner todo bajo el mismo pincel, y si alguna utilidad utiliza la red, eso no significa que sea un hacker. Pero aún así, describiré aquí la creación del chat, porque lo construiremos sobre un protocolo fundamentalmente diferente al habitual. En cualquier caso, este conocimiento no será superfluo.
Pero hablaremos del chat un poco más tarde, pero ahora un poco de teoría.
Actualmente existen dos protocolos principales: TCP y UDP. Anteriormente, todavía era muy común IPX, que era utilizado por Novell. Pero en este momento se está alejando y ya rara vez se ve un animal así. Sólo en sistemas más antiguos puedes ver IPX. La mayoría de los demás protocolos que conoce (FTP, HTTP, POP3, SMTP, etc.) se ejecutan sobre TCP o UDP.
¿Qué significa "encima de otro protocolo"? TCP implementa las funciones básicas para trabajar con una red. Puede establecer una conexión con una computadora remota, transmitir y recibir datos y verificar si el servidor recibió los paquetes enviados correctamente. Digamos que queremos crear un protocolo de transferencia de archivos (FTP). Para hacer esto, tomamos TCP, lo dotamos de las capacidades que necesitamos y, lo obtenemos, lo firmamos. Entonces resulta que FTP funciona a través (además) del protocolo TCP. Si queremos crear FTP desde cero, tendremos que volver a implementar las funciones de configuración de conexión y transferencia de datos. Por lo tanto, solo necesita preparar los datos en un formato especial (protocolo FTP) y entregárselos al protocolo TCP, que a su vez establecerá una conexión y enviará estos datos donde sea necesario.
Si está familiarizado con Delphi de primera mano y comprende al menos un poco la teoría de la programación orientada a objetos, entonces ya habrá notado la analogía con la programación orientada a objetos. Este es exactamente el principio según el cual opera la red. Todo esto está estandarizado, y si quieres saber más, lee alguna documentación sobre el modelo OSI (Open Systems Interconnection) y sus siete niveles (aquí puedo enviarlo nuevamente a mi sitio web o ver la Sección 4.1 de este libro). Este tema es bastante interesante, y en cualquier caso conviene conocer la estructura de los protocolos.
El protocolo UDP es muy similar a TCP. También implementa capacidades de transferencia de datos, pero no establece conexiones y no mantiene la integridad de los datos transmitidos. El protocolo simplemente abre un puerto, arroja allí una porción de datos y ni siquiera se preocupa de si llegan al destinatario o no. Por tanto, UDP es mucho más rápido que TCP.
Si desea trabajar con este protocolo, deberá implementar usted mismo la verificación de la exactitud de la recepción de datos. Por lo tanto, para transferir archivos u otra información de gran tamaño, debe elegir TCP, porque si se pierde incluso una pequeña parte del archivo, no se restaurará. Bueno, para el chat que escribiremos hoy, UDP será una opción más conveniente. Es muy rápido y muy eficiente para mensajes de tamaño pequeño.
En Delphi, la biblioteca es muy adecuada para trabajar con
Creo que pronto se convertirá en tu mejor amiga.
Se acabó la teoría, pasemos a escribir el chat. Estire los dedos, el mouse, el teclado e inicie Delphi. Ahora comenzaremos mi actividad favorita: la programación. Necesitaremos 3 componentes en el formulario.
□ Componente Tmeto. Se puede estirar hasta casi toda la forma.
□ El componente TEdit, en el que escribiremos el mensaje a enviar.
□ Botón T, al pulsarlo se enviará el mensaje. En la Fig. La Figura 4.21 muestra la forma del chat futuro.
Para trabajar con puertos, necesitamos los componentes idUDPClient (puede enviar datos, Fig. 4.22) desde la pestaña Clientes Indy e idUDPServer (puede recibir datos, Fig. 4.23) desde la pestaña Mis servidores. Transfiera uno de esos componentes al formulario.
Figura 4.22. Propiedades del componente idUDPCiient
Arroz. 4.23. Propiedades del componente idUDPServer
Ahora necesitamos configurar el protocolo y O R. Lo primero que haremos será seleccionar cualquier puerto del 1 al 65.000 a través del cual se producirá la comunicación. Decidí elegir 11245 (puedes elegir cualquier otro). Asigne este valor a la propiedad Puerto del componente cliente idUDpc y a la propiedad Puerto predeterminado del componente idUDPServer. Esto obligará al cliente y al servidor a ejecutarse en el mismo puerto, lo cual es necesario para que funcione la comunicación.
¡¡¡RECORDAR!!! Los puertos del protocolo UDP no se superponen con los puertos TCP. Esto significa que el puerto TCP 80 no es igual al puerto UDP 80.
Ahora el cliente (idüDPCIlent) necesita especificar la propiedad Host. Aquí se registra la dirección IP de la computadora a la que se enviarán los mensajes. Pero nuestro chat y mensajes deberían ser recibidos por todos los usuarios de la red que hayan iniciado el programa. Por lo tanto, para evitar problemas, es recomendable establecer BroadcastEnabled en verdadero para ambos componentes. R En lugar de una dirección IP específica, utilice una dirección de transmisión (una dirección que todos reciban). Si utiliza direcciones como 192,168,100.x en su red, entonces su dirección de transmisión será 192.168.100.255 (cambiamos el último octeto a 255).
Los preparativos están completos, puedes programar.
Cree un controlador de eventos de botón y escriba el siguiente código allí:
Procedimiento TForml.ButtonlClick(Remitente: TObject); comenzar IdUDPClientl.Send(Editl.Text); fin;
Solo hay una línea que envía el contenido de la línea de entrada (componente) usando un cliente UDP
Ahora necesitamos enseñarle al servidor UDP a recibir esta información. Para hacer esto, cree un controlador de eventos OnUDPRead PARA el componente idUDPServer. Escribe en él lo siguiente:
Procedimiento TForml. IdODPServerlüDPRead(Remitente: TObject; ÄEata: Tstream; ABrnding: TIdSocketHandle);
var StringFormatedStream: TStringStream; s:cadena; comenzar //Inicialización
StringFormatedStream: = TStringStream.Create(""); //Copiar de una secuencia simple a una cadena StringFormatedStream.CopyFrom(AData, AData.Size);
//Enviar el mensaje recibido
Memol.Lines.Add(ABinding.PeerIP+" "+StringFormatedStream.DataString);
ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, s, Longitud(es)); //Liberando el flujo de cadenas StringFormatedStream.Free; fin;
El procedimiento del controlador de eventos tiene tres parámetros. El primero está presente en todos los controladores y no contiene nada interesante para nosotros. El segundo son los datos que se reciben de la red. En tercer lugar, almacena información sobre el origen de los datos.
Entonces, los datos recibidos se almacenan en el segundo parámetro. Nos llegan como un simple TStream sin formato. Para que sea más cómodo trabajar con datos, es mejor transferirlos a un flujo de cadenas. ¿Crees que esto es un inconveniente? ¿Qué pasa si no pasa texto, sino una imagen, y el componente la formatea como texto? Ahora esto ya no será un inconveniente, ¡sino un completo fastidio!
Vea con qué facilidad todo se convierte en texto. El controlador declara una variable StringFormatedStream de tipo TStringStream (flujo de cadenas). La primera línea de código lo inicializa. La segunda línea copia datos de un flujo sin formato simple a un flujo de cadena. ¡¡¡Todo!!! Ahora el texto pasado está en la propiedad Datastring de StringFormatedStream. DESPUÉS DE ESTO, siéntase libre de ENVIAR este resultado en el componente Memo.
Fig.4.24. Charla en acción
Pero estamos escribiendo un chat y sería deseable mostrar información sobre quién envió este texto. Por ejemplo, se muestra la dirección IP del remitente de datos, que se encuentra en la propiedad repe del tercer parámetro ABinding. Pero esto es sólo un ejemplo, y en un programa real se verá feo. ¿De qué está hablando el señor 192.168.100.x? O tal vez incluso sea la señora la que habla. Por lo tanto, puede agregar el nombre del remitente directamente al texto de envío. El código cambiará de la siguiente manera:
IdUDPClisntl. Enviar("Ponga aquí el nombre del remitente" Editl.Text); Puede permitir que el usuario ingrese un nombre en una línea de entrada Edit2 separada. En este caso el código será así; IdUDPClisntl.Send(Edit2.Text+" "+Editl.Text);
En el CD en el directorio \Examples\Chapter 4\Chat puedes ver un ejemplo de este programa.
nuevo jugador 4 de julio de 2012 a las 18:26Buenas tardes, Habrauser. Seré honesto, amo el lenguaje Delphi y creo que ha sido olvidado injustificadamente. Y en este tema, me gustaría compartir con ustedes mi experiencia al escribir un chat. Este no es un asunto muy complicado, pero sí muy, muy divertido.
Introducción.
Para escribir este mismo chat, utilicé el ensamblaje IDE Borland Delphi 7 Lite. Todas las bibliotecas que se necesitaban ya estaban incluidas.
En realidad esta parte es la más fácil. Primero, debemos pensar en cómo funcionará nuestro chat. Decidí seleccionar manualmente el puerto, la dirección del servidor y el apodo. En principio, puedes elegir tú mismo el puerto y especificarlo en el código fuente, pero de esta forma podremos ejecutar tantas copias del programa como queramos en modo servidor hasta que nos quedemos sin puertos. Entonces, creamos cuatro campos de entrada, un elemento tipo Memo y tres botones. No olvide agregar dos sockets, servidor y cliente. Escribimos texto en botones. Nombre del programa, icono. Etc. Con esto concluye la primera parte.
En principio aquí no hay mucho trabajo, pero todo es importante. Primero, escribimos el código de los botones. Se encuentra debajo.
procedimiento TForm1. Botón1Clic(Remitente: TObject);
comenzar
botón2. Habilitado: = falso; // Deshabilitar el botón del servidor
Enchufe. dirección := editar1. Texto ;
Enchufe. Puerto: = StrtoInt(edit2.Text); //Anota el puerto y la IP
Enchufe. Activo: = verdadero; //Habilita el socket
Enchufe. Abierto ;
// Abrelo botón3. habilitado: = verdadero;
//Desbloquear el botón enviar
fin ;
Y más o menos lo mismo para todos los demás botones.
No necesita nada para los campos de entrada.
Por otra parte, quiero considerar escribir el código para el botón de enviar mensaje porque es muy importante.
procedimiento TForm1. Button3Click(Remitente: TObject);
comenzar
varf: entero; hoy: TdateTime;
hoy : = ahora ; //Descubre la hora s1:=editar4. Texto ;
//Forma una línea con el apodo y la hora de envío
s2:=editar3. Texto ; s3: = "[" + s2+ "] (" + TimetoStr(hoy) + "):" + s1;
//Pega todo junto
siclsocket. activo = verdadero entonces ClSocket. Enchufe. EnviarTexto(s3)
//Enviar una cadena al servidor
comenzar
demás para f: = 0 a SrSocket. Enchufe. ActiveConnections - 1 hacer
comenzar
//Enviar en nombre del servidor a todos los clientes
Srsocket. Enchufe. Conexiones[f]. EnviarTexto(s3);
fin ; Nota 1. líneas. agregar(s3);
Srsocket. Enchufe. Conexiones[f]. EnviarTexto(s3);
// Anota la fecha del chat tú mismo
//Desbloquear el botón enviar
editar4. texto: = "";
Y por último escribimos el código de conexión/desconexión/recepción. Aquí es importante no olvidar vincular los eventos con los procedimientos.
procedimiento TForm1. SrsocketClientRead(Remitente: TObject;
comenzar
var i: entero; //Transfiere el texto recibido a una variable
para i: = 0 a SrSocket. Enchufe. ActiveConnections - 1 hacer //Enviar la información recibida a todos los clientes conectados
Srsocket. Enchufe. Conexiones[yo]. EnviarTexto(Recibido);
nota1. Líneas. agregar (Recibido); //Escribirlo para nosotros mismos
Srsocket. Enchufe. Conexiones[f]. EnviarTexto(s3);procedimiento TForm1. SrSocketClientDisconnect(Remitente: TObject;
Zócalo: TCustomWinSocket);
comenzar
Nota 1. Líneas. Agregar ( "El cliente se ha desconectado") ; //Solo notifica al servidor
Srsocket. Enchufe. Conexiones[f]. EnviarTexto(s3);procedimiento TForm1. SrSocketClientConnect (Remitente: TObject; Conector: TCustomWinSocket);
comenzar
Nota 1. Líneas. Agregar ( "El cliente se ha conectado") ;
//Desbloquear el botón enviar
Esta parte es la más corta. En la configuración del proyecto, agregue un nombre, una versión, cree y dibuje un ícono.
Además, después de buscar un poco en Internet, encontré este código para especificar la dirección IP y lo incluí en mi chat.
función GetLocalIP: Cadena;
constante WSVer = $101;
var
wsaData: TWSAData;
P:PHostEnt;
Buf: matriz [0.. 127] de Char;
comenzar
Resultado: = "";
si WSAStartup(WSVer, wsaData) = 0 entonces comienza //No quiero comentar nada aquí, porque... No estoy del todo seguro de cómo funciona
si GetHostName(@ Buf, 128) = 0 entonces comienza
P: = GetHostByName(@Buf);
si p<>nulo entonces
Resultado: = iNet_ntoa(PInAddr(p^ . h_addr_list ^ ) ^ );
Srsocket. Enchufe. Conexiones[f]. EnviarTexto(s3);
Limpieza WSA;
Srsocket. Enchufe. Conexiones[f]. EnviarTexto(s3);
//Desbloquear el botón enviar
En realidad, este es el chat completo. Como puedes ver, escribirlo es muy sencillo. Y simplemente te agradezco que respetes esta publicación.
¡Que tenga un buen día!
Etiquetas: Delphi, programación
Buenas tardes, Habrauser. Seré honesto, amo el lenguaje Delphi y creo que ha sido olvidado injustificadamente. Y en este tema, me gustaría compartir con ustedes mi experiencia al escribir un chat. Este no es un asunto muy complicado, pero sí muy, muy divertido.
Introducción.
Para escribir este mismo chat, utilicé el ensamblaje IDE Borland Delphi 7 Lite. Todas las bibliotecas que se necesitaban ya estaban incluidas.
En realidad esta parte es la más fácil. Primero, debemos pensar en cómo funcionará nuestro chat. Decidí seleccionar manualmente el puerto, la dirección del servidor y el apodo. En principio, puedes elegir tú mismo el puerto y especificarlo en el código fuente, pero de esta forma podremos ejecutar tantas copias del programa como queramos en modo servidor hasta que nos quedemos sin puertos. Entonces, creamos cuatro campos de entrada, un elemento tipo Memo y tres botones. No olvide agregar dos sockets, servidor y cliente. Escribimos texto en botones. Nombre del programa, icono. Etc. Con esto concluye la primera parte.
En principio aquí no hay mucho trabajo, pero todo es importante. Primero, escribimos el código de los botones. Se encuentra debajo.
procedimiento TForm1. Botón1Clic(Remitente: TObject);
comenzar
botón2. Habilitado: = falso; // Deshabilitar el botón del servidor
Enchufe. dirección := editar1. Texto ;
Enchufe. Puerto: = StrtoInt(edit2.Text); //Anota el puerto y la IP
Enchufe. Activo: = verdadero; //Habilita el socket
Enchufe. Abierto ;
// Abrelo botón3. habilitado: = verdadero;
//Desbloquear el botón enviar
fin ;
Y más o menos lo mismo para todos los demás botones.
No necesita nada para los campos de entrada.
Por otra parte, quiero considerar escribir el código para el botón de enviar mensaje porque es muy importante.
procedimiento TForm1. Button3Click(Remitente: TObject);
comenzar
varf: entero; hoy: TdateTime;
hoy : = ahora ; //Descubre la hora s1:=editar4. Texto ;
//Forma una línea con el apodo y la hora de envío
s2:=editar3. Texto ; s3: = "[" + s2+ "] (" + TimetoStr(hoy) + "):" + s1;
//Pega todo junto
siclsocket. activo = verdadero entonces ClSocket. Enchufe. EnviarTexto(s3)
//Enviar una cadena al servidor
comenzar
demás para f: = 0 a SrSocket. Enchufe. ActiveConnections - 1 hacer
comenzar
//Enviar en nombre del servidor a todos los clientes
Srsocket. Enchufe. Conexiones[f]. EnviarTexto(s3);
fin ; Nota 1. líneas. agregar(s3);
Srsocket. Enchufe. Conexiones[f]. EnviarTexto(s3);
// Anota la fecha del chat tú mismo
//Desbloquear el botón enviar
editar4. texto: = "";
Y por último escribimos el código de conexión/desconexión/recepción. Aquí es importante no olvidar vincular los eventos con los procedimientos.
procedimiento TForm1. SrsocketClientRead(Remitente: TObject;
comenzar
var i: entero; //Transfiere el texto recibido a una variable
para i: = 0 a SrSocket. Enchufe. ActiveConnections - 1 hacer //Enviar la información recibida a todos los clientes conectados
Srsocket. Enchufe. Conexiones[yo]. EnviarTexto(Recibido);
nota1. Líneas. agregar (Recibido); //Escribirlo para nosotros mismos
Srsocket. Enchufe. Conexiones[f]. EnviarTexto(s3);procedimiento TForm1. SrSocketClientDisconnect(Remitente: TObject;
Zócalo: TCustomWinSocket);
comenzar
Nota 1. Líneas. Agregar ( "El cliente se ha desconectado") ; //Solo notifica al servidor
Srsocket. Enchufe. Conexiones[f]. EnviarTexto(s3);procedimiento TForm1. SrSocketClientConnect (Remitente: TObject; Conector: TCustomWinSocket);
comenzar
Nota 1. Líneas. Agregar ( "El cliente se ha conectado") ;
//Desbloquear el botón enviar
Esta parte es la más corta. En la configuración del proyecto, agregue un nombre, una versión, cree y dibuje un ícono.
Además, después de buscar un poco en Internet, encontré este código para especificar la dirección IP y lo incluí en mi chat.
función GetLocalIP: Cadena;
constante WSVer = $101;
var
wsaData: TWSAData;
P:PHostEnt;
Buf: matriz [0.. 127] de Char;
comenzar
Resultado: = "";
si WSAStartup(WSVer, wsaData) = 0 entonces comienza //No quiero comentar nada aquí, porque... No estoy del todo seguro de cómo funciona
si GetHostName(@ Buf, 128) = 0 entonces comienza
P: = GetHostByName(@Buf);
si p<>nulo entonces
Resultado: = iNet_ntoa(PInAddr(p^ . h_addr_list ^ ) ^ );
Srsocket. Enchufe. Conexiones[f]. EnviarTexto(s3);
Limpieza WSA;
Srsocket. Enchufe. Conexiones[f]. EnviarTexto(s3);
//Desbloquear el botón enviar
En realidad, este es el chat completo. Como puedes ver, escribirlo es muy sencillo. Y simplemente te agradezco que respetes esta publicación.
¡Que tenga un buen día!
Etiquetas: Delphi, programación
Creo que la idea de crear tu propio chat (corporativo) te ha surgido más de una vez. A mí se me ocurrió la misma idea y como siempre me puse a buscar información en Internet, pero no encontré nada bueno. De alguna manera, todo no describe completamente cómo se puede hacer esto.
Y me prometí que tan pronto como lo estudie, publicaré información completa sobre este tema. Hice mi chat en sockets. Puede comunicarse usándolos tanto a través de Internet como a través de una red local. Para hacer esto, solo necesitas saber la dirección IP. Programado en Delphi7.
Como lo hice en delphi7, los componentes que necesitaba no estaban ahí de forma predeterminada. ( ServidorSocket1, ClienteSocket1).
Para hacer esto necesita agregar componentes de Socket.
Vaya al menú Componente --> Instalar paquetes...--> Agregar --> dclsockets70.bpl
Y le indicamos la ruta al paquete con los componentes, se encuentra en la carpeta raíz de Delphi en el paquete Bin. Lo tenia en:
C:\Archivos de programa\Borland\Delphi7\Bin\ dclsockets70.bpl
Después de esta adición, estos componentes deberían aparecer en su pestaña de Internet.
Agregué los siguientes elementos al formulario: ServerSocket1, ClientSocket1, Edit1 (para chatear), Edit2 (para la dirección IP del servidor), Memo1 para mostrar un mensaje y 3 botones.
Para crear un Servidor, escriba lo siguiente al evento en el botón:
función Obtener IP local: Cadena;procedimiento TForm1.Button3Click(Remitente: TObject);
comenzar
ServerSocket1.Puerto:=65000; // Puerto de tu servidor, configura el que quieras
ServerSocket1.Active:=Verdadero; //activar el servidor
ServerSocket1.Open; //comenzar
ShowMessage("Su IP: "+GetLocalIP); //damos nuestra dirección IP para que el cliente pueda conectarse con nosotros
fin;
Una vez que el servidor se haya encendido, el cliente podrá conectarse al servidor.
Para hacer esto, ingresa la dirección IP del servidor en Edit2 y presiona el botón de conexión:
Atención: El Cliente sólo puede enviar un mensaje y el Servidor, a su vez, puede recibirlo. Para una comunicación bidireccional, habilite Cliente y Servidor en dos programas en diferentes extremos de la red.
Para leer un mensaje, el servidor tiene que esperar a que se reciba el mensaje...aquí está
procedimiento TForm1.ServerSocket1ClientRead(Remitente: TObject;Para enviar el mensaje escribí en dos procedimientos. Aquí están:
si formulario1.ClientSocket1.Activo entonces
form1.ClientSocket1.Socket.SendText(Texto);
fin;
procedimiento TForm1.Button1Click(Remitente: TObject);
comenzar
EnviarMes(Editar1.Texto);
memo1.Lines.add(GetLocalIP+": ");
memo1.Lines.add(Edit1.Text);
fin;
Artículos relacionados: | |
Cómo promover un programa ambiental
Src="https://present5.com/presentación/1/172394332_324917534.pdf-img/172... En Internet ha aparecido una base de datos de premios para veteranos de la Segunda Guerra Mundial.
Te permite encontrar muy rápidamente, en línea, información sobre un soldado o... Módulos bíblicos "Citas bíblicas" en iOS
La actualización 4.2 de la aplicación bíblica para iPhone, iPad y iPod touch está disponible... |