Escribimos un chat en Delphi. Haciendo un chat primitivo en DELPHI. Instalación de requisitos previos

En este tema me gustaría escribir en detalle cómo crear el chat ICQ más simple en Delphi.

Qué necesitamos para esto:
1.Delfos (7 es mejor)
2. Componente TICQ instalado.
3. Brazos rectos.

¡Empecemos!
Y entonces creamos un nuevo proyecto en Delphi y agregamos el componente TICQ al formulario.
Lanzamos Memo1, EDIT1, Edit2, botón1, ListBox1, L istBox2 en el formulario.
Explicación:
Memo1 - registro de chat
Editar1 - UIN
Edit2 - contraseña
botón1 - conexión
ListBox1 - usuario en línea
ListBox2 - registro de usuario

Botón 1:

Procedimiento TForm1.Button1Click(Remitente: TObject); comenzar ICQClient1.UIN:=StrToInt(Edit1.Text); ICQClient1.Contraseña:=Editar2.Texto; icqclient1.Login(); fin;

El evento ICQClient1MessageRecv1 debería verse así:

Procedimiento TForm1.ICQClient1MessageRecv1(Remitente: TObject; Msg, UIN: String); comenzar Memo1.Lines.Add(trim(nick(UIN))+": "+Msg); //registrar si mensaje<>"!" entonces //si el mensaje comienza con "!" no lanzar comenzar si está en línea (UIN) en el chat<>-1 luego //comprobando si el usuario está en el chat Send(Msg,UIN) //si está en el chat entonces acepta mensajes en el chat else if Reged(UIN)=-1 entonces//comprobando el registro icqclient1.SendMessage( StrToInt(UIN), "bienvenido al chat!" + #13#10 + "para registrarse, ingrese!reg<ваш ник>") else comienza icqclient1.SendMessage(StrToInt(UIN), "Para ingresar al chat, usa el comando!chat" + #13#10 + "Para obtener ayuda, envía!ayuda") //¡el usuario no está en el chat! fin ; fin else Comando( UIN,Msg); //comandos de chat!

Función en línea:

Función TForm1.OnLine(UIN:cadena):entero; var i: entero; comenzar en línea:=-1; para i:=0 a ListBox1.Items.Count-1, haga si Trim(Copy(ListBox1.Items[i],4,9))=UIN entonces //longitud UIN OnLine:=i; fin;

Envío de mensajes al chat:

Procedimiento TForm1.Send(Msg,UIN:string); var i2: entero; yo: entero; Cadena, Cadena2:cadena; comenzar Str2:=ListBox1.Items; para i:=0 a ListBox1.Items.Count-1 comience si i2=5 luego comience Sleep(2000); i2:=0; fin; si está en línea (UIN)<>entonces empiezo i2:=i2+1; Cadena:=ListBox1.Items[i]; si Trim(Copy(Str,1,2))=Trim(Copy(Str2,1,2)) entonces icqclient1.SendMessage(StrToInt(Copy(ListBox1.Items[i],4,9)), nick(UIN) +": "+Mensaje); fin; fin; fin;

Función de apodo:

Función TForm1.nick(UIN:cadena):cadena; comenzar si Reged(UIN)<>-1 luego nick:=TRIM(Copiar(ListBox2.Items,13,50)) fin

Función sucia:

Función TForm1.Reged(UIN:cadena):entero; var i: entero; comenzarReged:=-1; para i:=0 a ListBox2.Items.Count-1, haga si Copy(ListBox2.Items[i],4,9)=UIN y luego Reged:=i; fin;

Y por último el procedimiento Command (comandos de chat):

Procedimiento TForm1.Command(UIN,Msg:string); var i,i1,razdel:entero; comando, clave, clave2: cadena; Cadena:cadena; ayuda: TStrings; comenzar la sección de prueba:=0; para i:=1 a Longitud(Msg) comience la ayuda:= TStringList.Create; ayuda.LoadFromFile("comando/ayuda.txt"); //Abre un archivo con texto if (Msg[i]=" ") y (razdel=0) luego razdel:=i; fin; si divide<>0 luego comience el comando:=Copiar(Msg,1,razdel-1); clave:=Copiar(Mensaje,razdel+1,Longitud(Mensaje)); clave2:=Copiar(Mensaje,razdel+1,Longitud(Mensaje)); fin si no comenzar comando:=Msg; clave:=""; fin; si (command="!chat") o (command = "!chat") entonces comience ListBox1.Items.Append(ListBox2.Items); icqclient1.SendMessage(StrToInt(UIN), "ha iniciado sesión"); fin; if (command = "!help") o (command = "!help") entonces comience if OnLine(UIN)<>-1 luego comience icqclient1.SendMessage(StrToInt(UIN), help.Text); end else icqclient1.SendMessage(StrToInt(UIN), "Para usar comandos, ingresa al chat!"); fin; //fin; si (command="!exit") o (command = "!Exit") o (command = "!EXIT") entonces comience ListBox1.Items.Delete(OnLine(UIN)); fin; si (command="!reg") o (command="!nick") o (command="!REG") y (clave<>"") luego comienza si Reged(UIN)<>-1 luego icqclient1.SendMessage(StrToInt(UIN), "¡Ya estás registrado en el chat!:)") else if (Length(Trim(key))>15) entonces icqclient1.SendMessage(StrToInt(UIN), "Apodo demasiado largo, debe tener más de 3 y menos de 15 caracteres y no debe contener espacios") else if (Longitud(Recortar(clave))<3) then icqclient1.SendMessage(StrToInt(UIN), "Слишком короткий ник, Он должен быть длинной,больше 3 и менее 15 символов, не должен сожержать пробелов") else //if (Length(Trim(UIN))<9) then //icqclient1.SendMessage(StrToInt(UIN), "Ваш уин не подходит для регистрации!") //else begin ListBox2.Items.Append("0 "+UIN+" "+Trim(Key)); icqclient1.SendMessage(StrToInt(UIN), "Вы успешно зарегистрировались!Для входа в чат наберите!чат"); ListBox2.Items.SaveToFile("user/user.txt"); end; end; //end; except end; end;

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:26

Escribimos nuestra bicicleta en Delfos.

  • Trastero *

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.

Parte I. Escribiendo la interfaz.

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.

Parte 2. Internalidades.

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

Parte 3. Pruebas finales.

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.

Parte I. Escribiendo la interfaz.

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.

Parte 2. Internalidades.

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

Parte 3. Pruebas finales.

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.

Instalación de requisitos previos

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.

Colocar componentes y escribir código

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;
constante WSVer = $101;
var
wsaData: TWSAData;
P:PHostEnt;
Buf: formación de Carbonizarse;
comenzar
Resultado:= "";
si WSAStartup(WSVer, wsaData) = 0 entonces comienza
si Obtener nombre de host (@Buf, 128) = 0 entonces comienza
P:= GetHostByName(@Buf);
si PAG<> nulo entonces
Resultado:= iNet_ntoa(PInAddr(p^.h_addr_list^)^);
fin;
Limpieza WSA;
fin;
fin;

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:

procedimiento TForm1.Button2Click (Remitente: TObject);
comenzar
ClientSocket1.Address:=Edit2.Text; // Dirección IP del servidor
ClientSocket1.Port:=65000; //su puerto
ClientSocket1.Active:=Verdadero; //activar el cliente
ClientSocket1.Open; //comenzar
fin;

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;
Zócalo: TCustomWinSocket);
comenzar
memo1.Lines.add(Socket.RemoteAddress+": ");
memo1.Lines.add(Socket.ReceiveText);
StatusBar1.Panels.Items.Text:=Socket.RemoteAddress;
fin;

Para enviar el mensaje escribí en dos procedimientos. Aquí están:

procedimiento TForm1.SendMes(Texto: Cadena);
comenzar
si formulario1.ServerSocket1.Activo entonces
si formulario1.ServerSocket1.Socket.ActiveConnections>0 entonces
form1.ServerSocket1.Socket.Connections.SendText(Texto);

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;



gastrogurú 2017