¿Problema de comunicación entre el socket del servidor y el socket del cliente de Delphi?
Código fuente de serversocket:
const
CMax=10; //Número máximo de conexiones de cliente, establecido por usted mismo para requisitos específicos
escriba
client_record=record
CHandle: integer; // Identificador del socket del cliente
CSocket:TCustomWinSocket; //Socket del cliente
CName:string; //Nombre de la computadora del cliente
CAddress:string; //Dirección IP de la computadora del cliente
CUsed: boolean; //Indicador en línea del cliente
end ;
///////////////
sesión: matriz[0..CMax] de client_record // matriz de conexión del cliente
Sesiones: entero;
//Abre la conexión del socket y pon el socket en estado de escucha
procedimiento TfrmServerMain.tbConnectClick( Sender: TObject);
comenzar
serversocket.Port:=9999;//Puerto de escucha
ServerSocket.Open;
fin ;
/ /Cerrar la conexión del socket y ya no escuchar las solicitudes de los clientes
procedimiento TfrmServerMain.tbDisconnectedClick(Sender: TObject);
comenzar
ServerSocket.Close; p>
StatusBar.Panels[0].Text :='La conexión del socket del servidor se ha cerrado y la solicitud de conexión del cliente no se puede aceptar.';
end;
//Leer información del cliente
procedimiento TfrmServerMain.ServerSocketClientRead(Sender: TObject;Socket: TCustomWinSocket);
var
i:integer;
comenzar
//Agregar la información leída del cliente a Memo1
Memo1.Lines.Add(Socket .ReceiveText);
para i :=0 para que las sesiones
comiencen
//Obtenga el cliente coincidente
si la sesión [i].CHandle = Socket.SocketHandle entonces
comenzar
sesión[i].CSocket.SendText('Responder al cliente'+sesión[i].CAddress+' ==> '+Edit1.Text);
finalizar ;
end;
end;
//El socket del lado del servidor ingresa al estado de monitoreo para monitorear las conexiones del cliente
procedimiento TfrmServerMain.ServerSocketListen(Remitente: TObj
ect;Socket: TCustomWinSocket);
comenzar
StatusBar.Panels[0].Text :='Esperando conexión del cliente...';
finalizar ;
//Cuando el cliente se conecta al servidor
procedimiento TfrmServerMain.ServerSocketClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
var
i,j:integer;begin
comenzar
j:=-1;
para i:= 0 a sesiones hacer
comenzar
//Hay conexiones de cliente interrumpidas en la matriz de conexión de cliente original
si no es sesión[i].CUsed entonces
comenzar
sesión[i].CHandle := Socket.SocketHandle;// Identificador del socket del cliente
sesión[i].CSocket: = Socket; //Socket del cliente;
session[i].CName := Socket.RemoteHost; //Nombre del ordenador cliente
session[i].CAddress := Socket.RemoteAddress ;//IP del ordenador cliente p>
session[i].CUsed := True; //La posición actual en la matriz de conexiones ha sido ocupada
Break;
end;
j:=i;
fin;
si j=sesiones entonces
comenzar
inc(sesiones); p>
sesión[j].CHandle := Socket.SocketHandle ;
sesión[j].CSocket := Socket;
sesión [j].CName := Socket .RemoteHost ;
sesión[j].CAddress := Socket.RemoteAddress ;
sesión[j].CUsed := True;
fin; p>
StatusBar.Panels[0].Text := 'Client'+Socket.RemoteHost + 'Connected';
end;
//Cuando el cliente se desconecta
procedimiento TfrmServerMain.ServerSocketClientDisconnect(Remitente: TObject;
Socket: TCustomWinSocket);
var
p>i:integer; p>
comenzar
para i:=0 para sesiones
comenzar
si sesión[i].CHandle =Socket.SocketHandle entonces p>
comenzar
sesión
[i].CHandle :=0;
sesión[i].CUsed := False;
Interrupción;
fin;
fin;
StatusBar.Panels[0].Text :='Client'+Socket.RemoteHost + 'Desconectado';
end;
// Cerrar la ventana
procedimiento TfrmServerMain.tbCloseClick(Sender: TObject);
comenzar
Cerrar;
finalizar;
p>procedimiento TfrmServerMain.FormCreate(Remitente: TObject);
iniciar
sesiones := 0;
finalizar;
procedimiento TfrmServerMain.FormClose(Remitente: TObject;var Acción: TCloseAction);
comenzar
ServerSocket.Close ;
finalizar;
//Cuando el cliente se conecta al servidor
procedimiento TfrmServerMain.ServerSocketGetSocket(Sender: TObject;
Socket: Integer; var ClientSocket: TServerClientWinSocket);
begin
StatusBar.Panels[0].Text :='El cliente se está conectando...';
end;
//Cliente Un error ocurrió
procedimiento TfrmServerMain.ServerSocketClientError(Remitente: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
StatusBar.Panels[0].Text :='Client'+Socket.RemoteHost +'¡Ocurrió un error! ';
Código de error := 0;
fin;
===================== ================================================= p>
Código fuente del cliente:
procedimiento TfrmClientMain.tbConnectedClick(Sender: TObject);
comenzar
ClientSocket.Host:='127.0.0.1 ';//Conectar IP
ClientSocket.Port:=9999; //Conectar puerto
ClientSocket.Open;
end;
//Cerrar la conexión del socket
procedimiento TfrmClientMain.tbDisconnectedClick(Sender: TObject);
comenzar
ClientSocket.Close;
p>
end;
//Acepta la respuesta del servidor
procedimiento TfrmClientMain.ClientSocketRead(Sender: TObject;Socket: TCustomWinSocket);
comenzar
Memo1.Lines.Add(Socket.ReceiveText);
fin;
//Enviar información al servidor
procedimiento TfrmClientMain. tbSendClick(Remitente: TObject);
comenzar
ClientSocket.Socket.SendText(Edit1.Text);
finalizar;
procedimiento TfrmClientMain.tbCloseClick(Sender: TObject);
comenzar
Cerrar;
finalizar;
//Configurar el servidor en conectarse a la dirección
procedimiento TfrmClientMain.FormShow(Sender: TObject);
comenzar
ClientSocket.Host := SocketHost;
finalizar ;
//Ya conectado al servidor
procedimiento TfrmClientMain.ClientSocketConnect(Sender: TObject;Socket: TCustomWinSocket);
comenzar
tbSend .Enabled := Verdadero;
tbDisconnected.Enabled :=Verdadero;
btnSend.Enabled := Verdadero;
StatusBar.Panels[0]. Texto : = 'Ya conectado a'+ Socket.RemoteHost;
end;
//Conectándose al servidor
procedimiento TfrmClientMain.ClientSocket1Connecting(Sender: TObject ; Socket: TCustomWinSocket);
comenzar
StatusBar.Panels[0].Text := 'Conectando al servidor... ' ;
fin;
//Ocurre cuando se desconecta la conexión al servidor
procedimiento TfrmClientMain.ClientSocketDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
comenzar
tbSend.Enabled := False;
btnSend.Enabled := False
tbDisconnected.Enabled := False;
StatusBar.Panels[0].Text := 'Desconectado de '+ Socket.RemoteHost +'
Conexión';
fin;
procedimiento TfrmClientMain.FormClose(Remitente: TObject;
var Acción: TCloseAction);
comenzar
ClientSocket.Close ;
end;
//Cuando ocurre un error en la conexión con el servidor
procedimiento TfrmClientMain.ClientSocketError( Remitente: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;var ErrorCode: Integer);
comenzar
StatusBar.Panels[0].Texto:= 'Con Se produjo un error en la conexión del lado del servidor';
ErrorCode := 0;
end;
end.