1. Delphi y el zócalo
La red informática se compone de una serie de protocolos de comunicación de red, cuyos protocolos principales son los protocolos TCP/ip y UDP en la capa de transporte. TCP está orientado a la conexión y ambas partes que se comunican mantienen una ruta, al igual que la línea telefónica actual. Si usa telnet para iniciar sesión en BBS, se usa el protocolo TCP sin conexión y las partes que se comunican no mantienen cada una. El estado del otro se utiliza cuando el navegador accede a Internet. El protocolo HTTP se basa en el protocolo UDP. Tanto el protocolo TCP como el UDP son muy complejos, especialmente el protocolo TCP. Para garantizar la exactitud y eficacia de la transmisión de la red, se deben realizar una serie de procesos complejos de corrección y clasificación de errores.
Socket es una especificación de socket basada en protocolos de capa de transporte (principalmente TCP y UDP). Fue propuesta originalmente por la Universidad de California en Berkeley. Define una especificación para la comunicación entre dos computadoras (también una especificación de programación). un "canal", entonces los dos extremos de este "canal" son dos enchufes. Los sockets protegen las diferencias entre el software de comunicación subyacente y los sistemas operativos específicos, haciendo posible la comunicación entre dos computadoras que hayan instalado el software del protocolo TCP e implementado la especificación del socket.
La especificación de Windows Socket de Microsoft (winsock para abreviar) extiende la especificación de socket de Berkeley. Usando los métodos estándar de Socket, puede comunicarse con Sockets en cualquier plataforma usando sus extensiones y puede implementarla de manera más efectiva en plataformas Windows. En Delphi, el Socket subyacente también debería ser el Socket de Windows. Socket reduce la dificultad de escribir software de comunicación entre computadoras, pero en general sigue siendo bastante complicado (esto se discutirá en detalle más adelante); InPRise encapsula efectivamente Windows Socket en Delphi, lo que permite a los usuarios escribir fácilmente programas de comunicación de red. A continuación explicamos con ejemplos cómo utilizar Socket para escribir programas de comunicación en Delphi.
2. Utilice Delphi para escribir un programa de comunicación Socket.
El siguiente es un programa de comunicación Socket simple, en el que el cliente y el servidor son el mismo programa. Cuando el cliente (servidor) ingresa un fragmento de texto en memo1 y presiona Enter, el texto se puede mostrar en el servidor (cliente) en. memo2, lo contrario también es cierto. Los pasos específicos son los siguientes:
1. Cree un nuevo formulario y asígnele un nombre arbitrario. También puede configurarlo como chatForm; coloque un MainMenu (en la columna Estándar) y cree elementos de menú ListenItem, ConnectItem, Disconnect y Exit, seleccione TServerSocket y TClientSocket en la columna Internet. agréguelos al chatForm, donde el nombre de TClientSocket está configurado en ClientSocket, Configure el puerto en 1025, el activo predeterminado es falso; establezca el nombre de TServerSocket en ServerSocket, configure el puerto en 1025, el activo predeterminado es falso y deje los demás sin cambios, luego coloque dos notas, una llamada memo1 y la otra; other Para memo2, el color de memo2 se establece en gris porque se utiliza principalmente para mostrar la entrada de la otra parte. A continuación explicamos el motivo al escribir el código.
2. Haga doble clic en ListemItem. Escribe el siguiente código:
procedimiento TChatForm.ListenItemClick (Remitente: TObject);
comenzar
ListenItem.Checked := no ListenItem.Checked;
si ListenItem.Checked entonces
comenzar
ClientSocket.Active: = Falso;
ServerSocket.Active: = Verdadero;
fin
demás
comenzar
si ServerSocket.Active entonces
ServerSocket.Active: = Falso;
fin;
fin;
La descripción de este segmento del programa es la siguiente: Cuando el usuario selecciona ListemItem, ListenItem se invierte. Si se selecciona, significa que está en el estado Escuchar. Lo que los lectores deben entender es: escuchar es un método propietario cuando sirve Socket. como el Servidor. Si está en escucha, entonces ServerSocket se establece en estado activo; de lo contrario, la escucha se cancela y ServerSocket se cierra. De hecho, sólo el usuario selecciona inicialmente este elemento del menú, lo que indica que el programa está actuando como un servidor. Por el contrario, si el usuario selecciona ConnectItem, deberá utilizarlo como Cliente.
3. Haga doble clic en ConnectItem e ingrese el siguiente código.
procedimiento TChatForm.ConnectItemClick(Remitente: TObject);
comenzar
si ClientSocket.Active entonces ClientSocket.Active := False;
si InputQuery ('Computadora a la que conectarse', 'Nombre de dirección:', Servidor) entonces
si Longitud (Servidor) > 0 entonces
con ClientSocket hacer
comenzar
Anfitrión:= Servidor;
Activo := Verdadero;
ListenItem.Checked: = Falso;
fin;
fin;
La función principal de este programa es configurar la aplicación como cliente cuando el usuario selecciona el elemento del menú ConnectItem y aparece un cuadro de entrada para permitir al usuario ingresar la dirección del servidor. Es por eso que no reparamos el host ClientSocket al principio, para que los usuarios puedan conectarse dinámicamente a diferentes servidores. Lo que los lectores deben entender es que la dirección del host es solo un atributo que tiene Socket cuando es un cliente. Cuando Socket es un servidor, "generalmente" no usa la dirección porque está vinculada a la máquina local.
4. Escriba el siguiente código en el método de pulsación de tecla de memo1:
procedimiento TChatForm.Memo1KeyDown(Remitente: TObject; var Clave: Word;
Cambio: TShiftState);
comenzar
si clave = VK_Return entonces
si es servidor entonces
ServerSocket.Socket.Connections[0].SendText(Memo1.Lines[Memo1.Lines.Count - 1])
demás
ClientSocket.Socket.SendText(Memo1.Lines[Memo1.Lines.Count - 1]);
fin;
La función de este código es obvia, es decir, comienza a enviar mensajes. Si es un servidor, solo envía un mensaje al primer cliente. Dado que un servidor puede conectarse a varios clientes y cada conexión con el cliente es mantenida por un Socket, la matriz ServerSocket.Socket.Connections lo que se almacena es el Socket. que mantiene la conexión con el Cliente. En el Socket estándar, el Socket del lado del servidor obtiene el Socket que mantiene la conexión con el cliente a través del valor de retorno del método aceptar (), y los métodos para enviar y recibir mensajes son send (sendto) y recv (recvfrom) respectivamente. Delphi ha realizado esta encapsulación.
5. Una breve introducción a los códigos restantes.
procedimiento TChatForm.ServerSocketAccept(Remitente: TObject;
Zócalo: TCustomWinSocket);
comenzar
IsServer := Verdadero;
fin;
El método Accept de ServerSocket se completa cuando el cliente se conecta por primera vez. Por sus parámetros, se puede considerar que se ejecuta después del método de aceptación estándar. Debido a que existe el tipo de parámetro TCustomWinSocket, debe ser el valor de retorno de. Zócalo estándar del lado del servidor.
procedimiento TChatForm.ClientSocketRead(Remitente: TObject;
Zócalo: TCustomWinSocket);
comenzar
Memo2.Lines.Add(Socket.ReceiveText);
fin;
procedimiento TChatForm.ServerSocketClientRead(Remitente: TObject;
Zócalo: TCustomWinSocket);
comenzar
Memo2.Lines.Add(Socket.ReceiveText);
fin;
Delphi activa estos dos fragmentos de código cuando el lado del servidor y el lado del cliente reciben los mensajes del otro, y su función es mostrar los mensajes recibidos en memo2. Entre ellos, el Socket en ClientSocketRead es en realidad el Socket en sí, y el Socket en ServerSocketClientRead es en realidad un Socket en ServerSocket.Socket.Connection []. Sin embargo, en Delphi, el socket del lado del servidor está efectivamente encapsulado.
procedimiento TChatForm.ServerSocketClientConnect(Remitente: TObject;
Zócalo: TCustomWinSocket);
comenzar
Memo2.Líneas.Borrar;
fin;
procedimiento TChatForm.ClientSocketDisconnect(Remitente: TObject;
Zócalo: TCustomWinSocket);
comenzar
EscucharItemClick(nulo);
fin;
Estos dos párrafos son relativamente simples. Entre ellos, ServerSocketClientConnect se activa cuando ServerSocket recibe una nueva conexión. ClientSocketDisconnect se activa cuando ClientSocket emite Disconncet.
procedimiento TChatForm.Exit1Click(Remitente: TObject);
comenzar
ServerSocket.Cerrar;
ClientSocket.Cerrar;
Cerca;
fin;
procedimiento TChatForm.Disconnect1Click (Remitente: TObject);
comenzar
ClientSocket.Active: = Falso;
ServerSocket.Active: = Verdadero;
fin;
El primer párrafo es para cerrar la aplicación. En el Socket estándar, cuando cada Socket está cerrado, se debe llamar al método closesocket (); de lo contrario, el sistema no liberará recursos. En ServerSockt.Close y ClientSocket.Close, el método closesocket() debe llamarse internamente en el sistema.
3. Zócalo estándar y Zócalo en Delphi.
El marco de aplicación estándar de Socket es el siguiente:
Lado del servidor: Socket()[Crear un nuevo Socket]--Bind()[Vincular con la dirección del servidor]--Listen()--Aceptar()--bloquear espera--leer()[Aceptar mensajes, en Windows plataforma, el método es enviar(TCP), o enviar a(UDP)]--procesar solicitud de servicio--Escribir()[enviar mensaje, en la plataforma Windows, el método es enviar(TCP), O enviar a (UDP).
El lado del cliente es relativamente simple: Socket () - Connect () [Conectarse a un servidor específico a través de un puerto determinado, que es para establecer una conexión con el servidor] - Write () - Read ().
Socket puede basarse en TCP o UDP, e incluso se basa en otros protocolos, como IPX/SPX, DECNet, etc. Al crear un nuevo Socket, puede especificar qué tipo de Socket crear. Bind() se utiliza para vincularse a la dirección del servidor. Si un host tiene solo una dirección IP, la función de vinculación es en realidad relativamente redundante. Listen () comienza a monitorear la red, Accept () se usa para aceptar la conexión y su valor de retorno es el Socket que mantiene contacto con el cliente.
En Delphi, Socket en Windows está efectivamente encapsulado. En Delphi, según su relación de herencia, se pueden dividir en dos categorías:
1. TComponent--TAbstractSocket--TCustomSocket--TCustomServerSocket--TServerSocket
TComponent--TAbstractSocket--TCustomSocket--TClientSocket
2. Heredar directamente de TObject:
TObject--TCustomWinSocket--TServerWinSocket
TObject--TCustomWinSocket--TClientWinSocket
TObject--TCustomWinSocket--TServerClientWinSocket
Se puede ver que el primer tipo se basa en TCustomSocket y el segundo tipo se basa en TCustomWinSocket. El primer tipo se basa en TComponet y el segundo tipo se basa directamente en TObject. Por lo tanto, si el usuario está muy familiarizado con Socket y quiere escribir un programa de consola, puede utilizar la clase TCustomWinScoket.
Como se puede ver en los mismos usos, todos están implementados en ScktComp.pas, y schtComp.pas contiene el archivo winsock.pas. Si continúa profundizando en el archivo winsock, puede encontrar todos los métodos básicos de Windows Socket.
De hecho, si comprende el marco de la aplicación Socket estándar, se sentirá cómodo usando Delphi para escribir aplicaciones Socket. Esto no significa que deba comprender las funciones estándar en Socket complejos, y no es necesario, porque Delphi ya lo ha hecho; Para usted, está bien encapsulado, que es el punto fuerte de Delphi. Solo necesita comprender un poco el marco básico.
Esta es mi comprensión de las aplicaciones Socket en Delphi. Espero que puedan corregirme si tengo alguna deficiencia. Al mismo tiempo, también estaré encantado de responder preguntas sobre Socket en Delphi.