public void CloseClientSocket(AsyncSocketUserToken userToken) { if (userToken.ConnectSocket == null) { return; } string socketInfo = string.Format("Local Address: {0} Remote Address: {1}", userToken.ConnectSocket.LocalEndPoint, userToken.ConnectSocket.RemoteEndPoint); Debug.WriteLog.Log(eLogLevel.ell_Debug, "Client connection disconnected. " + socketInfo); if (Monitor.TryEnter(lock_obj, 100)) { try { TCPProtocol tcp = (TCPProtocol)userToken.AsyncSocketInvokeElement; if (tcp != null && tcp.MessageHandle != null) { userToken.ConnectSocket.Shutdown(SocketShutdown.Both); userToken.ConnectSocket.Close(); userToken.ConnectSocket.Dispose(); userToken.ConnectSocket = null; //释放引用,并清理缓存,包括释放协议对象等资源 } } catch (Exception E) { Debug.WriteLog.Log(eLogLevel.ell_Error, String.Format("CloseClientSocket Disconnect client {0} error, message: {1}", socketInfo, E.ToString())); } Monitor.Exit(lock_obj); } }
private void SendFileList(TCPProtocol protocol, ListFilesRequest request) { var response = new ListFilesResponse(); try { response.Cmd = CommandEnum.ListFiles; response.Result = TransferResponseEnum.OK; StringBuilder sb = new StringBuilder(); foreach (var file in ServerData.Instance.FileList) { sb.Append(file); sb.Append(","); } response.Data = sb.ToString(); response.FileLength = sb.Length; //Envio respuesta protocol.SendMessage(response); } catch (Exception ex) { response.Result = TransferResponseEnum.ConnectionError; protocol.SendMessage(response); } }
public UploadResponse SendFile(TCPProtocol protocol) { try { UploadResponse response; //Envio mensaje pidiendo subir archivo protocol.SendMessage(this); //Recibo respuesta response = (UploadResponse)protocol.RecieveMessage(); if (response.Result != TransferResponseEnum.OK) { return(response); } //Envio el archivo protocol.SendFile(this.File); //Recibo respuesta response = (UploadResponse)protocol.RecieveMessage(); return(response); } catch (Exception ex) { throw new Exception("Error enviando mensaje " + ex.Message); } }
public ListFilesResponse ListFiles(TCPProtocol protocol) { try { ListFilesResponse response; //Envio mensaje pidiendo descargar archivo protocol.SendMessage(this); //Recibo respuesta response = (ListFilesResponse)protocol.RecieveMessage(); if (response.Result != TransferResponseEnum.OK) { return(response); } //Envio request nuevamente protocol.SendMessage(this); return(response); } catch (Exception ex) { throw new Exception("Error enviando mensaje " + ex.Message); } }
public void SyncServers() { var protocol = new TCPProtocol(); try { var request = new ListFilesRequest(); //Me conecto al servidor de archivos protocol.ConnectClient(ClientData.Instance.ServerIP, ClientData.Instance.ServerPort); SendRemotingConnectionRequest(); //Reutilizo este mensaje, cambiandole el CMD request.Cmd = CommandEnum.Backup; //Envio pedido var response = request.ListFiles(protocol); } catch { CurrentStatus = "Ocurrio un error."; } finally { protocol.Disconnect(); SendRemotingDisconnectionRequest(); } }
public List <string> ListFiles() { var protocol = new TCPProtocol(); try { var request = new ListFilesRequest(); //Me conecto al servidor de archivos protocol.ConnectClient(ClientData.Instance.ServerIP, ClientData.Instance.ServerPort); SendRemotingConnectionRequest(); //Envio pedido y obtengo respuesta var response = request.ListFiles(protocol); List <string> fileList = response.Data.Split(',').ToList(); fileList.Remove(fileList.Last()); CurrentStatus = "Listado recibido con exito."; return(fileList); } catch (Exception e) { CurrentStatus = "Ocurrio un error desconocido."; return(new List <string>()); } finally { protocol.Disconnect(); SendRemotingDisconnectionRequest(); } }
public DownloadResponse DownloadFile(TCPProtocol protocol, string repository) { try { DownloadResponse response; protocol.SendMessage(this); response = (DownloadResponse)protocol.RecieveMessage(); if (response.Result != TransferResponseEnum.OK) { return(response); } protocol.SendMessage(this); bool resp = protocol.RecieveFile(string.Format("{0}\\{1}", repository, this.FileName), Rest == 0, response.FileLength - this.Rest); response.Result = resp ? TransferResponseEnum.OK : TransferResponseEnum.Error; return(response); } catch (Exception ex) { throw new Exception("Error enviando mensaje " + ex.Message); } }
public void Listen(TcpListener tcpListener) { while (!_shouldStop) { var protocol = new TCPProtocol(); var clientName = String.Empty; protocol.Listen(tcpListener); try { var message = protocol.RecieveMessage(); clientName = message.ClientName; //Le comunico al servidor de conciliacion que un cliente se conecto. var remotingRequest = new ClientConnectionRequest() { ClientName = clientName }; _remotingService.SendMessage(remotingRequest); if (message.Header == MessageTypeEnum.REQ) { if (message.Cmd == CommandEnum.Download) { DownloadFile(protocol, (DownloadRequest)message); } else if (message.Cmd == CommandEnum.Upload) { UploadFile(protocol, (UploadRequest)message); } else if (message.Cmd == CommandEnum.ListFiles) { SendFileList(protocol, (ListFilesRequest)message); } else if (message.Cmd == CommandEnum.Backup) { SyncFiles(protocol, (ListFilesRequest)message); } } } catch (Exception ex) { Console.WriteLine("Ocurrio un error.", ex.Message); } finally { protocol.Disconnect(); //Le comunico al servidor de conciliacion que un cliente se desconecto. var remotingRequest = new ClientDisconnectionRequest() { ClientName = clientName }; _remotingService.SendMessage(remotingRequest); } } }
public void DownloadFile(string fileName) { var protocol = new TCPProtocol(); try { string path = string.Format("{0}\\{1}", ClientData.Instance.FileRepository, fileName); var request = new DownloadRequest(); request.ClientName = ClientData.Instance.ClientName; request.FileName = fileName; request.Rest = FileHelper.FileExists(path) ? FileHelper.ReadFile(path).LongLength : 0; //Me conecto al servidor de archivos protocol.ConnectClient(ClientData.Instance.ServerIP, ClientData.Instance.ServerPort); SendRemotingConnectionRequest(); var response = request.DownloadFile(protocol, ClientData.Instance.FileRepository); //Le comunico al servidor de registro de pedi descargar un archivo. var remotingRequest = new ClientDownloadRequest() { ClientName = ClientData.Instance.ClientName, FileName = fileName }; _remotingService.SendMessage(remotingRequest); if (response.Result == TransferResponseEnum.OK) { CurrentStatus = "Archivo descargado con exito"; } else if (response.Result == TransferResponseEnum.FileDoesntExist) { CurrentStatus = "Error el archivo que quiere descargar no existe. Actualize la lista de archivos."; } else if (response.Result == TransferResponseEnum.ConnectionError) { CurrentStatus = "Ocurrio un error de conexion."; } else { CurrentStatus = "Ocurrio un error desconocido."; } } catch { CurrentStatus = "Ocurrio un error desconocido."; } finally { protocol.Disconnect(); SendRemotingDisconnectionRequest(); } }
public void SyncRecieve(TcpListener tcpListener) { while (!_shouldStop) { var protocol = new TCPProtocol(); protocol.Listen(tcpListener); try { var mensaje = protocol.RecieveMessage(); if (mensaje.Header == MessageTypeEnum.REQ && mensaje.Cmd == CommandEnum.Backup) { //Recibo un req para listar archivos por este puerto, se que es un pedido de sync var response = new ListFilesResponse(); try { response.Cmd = CommandEnum.ListFiles; response.Result = TransferResponseEnum.OK; StringBuilder sb = new StringBuilder(); foreach (var file in ServerData.Instance.FileList) { sb.Append(file); sb.Append(","); } response.Data = sb.ToString(); response.FileLength = sb.Length; //Envio respuesta protocol.SendMessage(response); } catch (Exception ex) { response.Result = TransferResponseEnum.ConnectionError; protocol.SendMessage(response); } } else if (mensaje.Header == MessageTypeEnum.REQ && mensaje.Cmd == CommandEnum.Download) { this.DownloadFile(protocol, (DownloadRequest)mensaje); } } catch (Exception ex) { Console.WriteLine(string.Format("Error enviando datos {0}", ex.Message)); } } }
public void SendFile(string pathArchivo) { var portocol = new TCPProtocol(); try { //Obtengo el archivo byte[] fileBytes = FileHelper.ReadFile(pathArchivo); var request = new UploadRequest(); request.ClientName = ClientData.Instance.ClientName; request.FileName = Path.GetFileName(pathArchivo); request.FileLength = fileBytes.LongLength; request.File = fileBytes; //Me conecto al servidor de archivos portocol.ConnectClient(ClientData.Instance.ServerIP, ClientData.Instance.ServerPort); SendRemotingConnectionRequest(); //Envio el archivo y obtengo respuesta var response = request.SendFile(portocol); //Le comunico al servidor de registro de pedi subir un archivo. var remotingRequest = new ClientUploadRequest() { ClientName = ClientData.Instance.ClientName, FileName = Path.GetFileName(pathArchivo) }; _remotingService.SendMessage(remotingRequest); if (response.Result == TransferResponseEnum.OK) { CurrentStatus = "Archivo subido con exito"; } else if (response.Result == TransferResponseEnum.FileExists) { CurrentStatus = "Error: El archivo ya existia en el servidor."; } else { CurrentStatus = "Ocurrio un error."; } } catch { CurrentStatus = "Ocurrio un error."; } finally { portocol.Disconnect(); SendRemotingDisconnectionRequest(); } }
private void UploadFile(TCPProtocol protocol, UploadRequest request) { var response = new UploadResponse(); try { //Le comunico al servidor de conciliacion un usuario pidio subir un archivo. var remotingRequest = new ClientUploadRequest() { ClientName = request.ClientName, FileName = request.FileName }; _remotingService.SendMessage(remotingRequest); response.Result = ServerData.Instance.FileExists(request.FileName) ? TransferResponseEnum.FileExists : TransferResponseEnum.OK; protocol.SendMessage(response); if (response.Result == TransferResponseEnum.OK) { bool archivo = protocol.RecieveFile(string.Format("{0}\\{1}", ServerData.Instance.FileRepository, request.FileName), true, request.FileLength); response = new UploadResponse(); response.Result = (archivo) ? TransferResponseEnum.OK : TransferResponseEnum.Error; if (response.Result == TransferResponseEnum.OK) { ServerData.Instance.AddFile(request.FileName); } else { FileHelper.DeleteFile(string.Format("{0}\\{1}", ServerData.Instance.FileRepository, request.FileName)); } protocol.SendMessage(response); } else { Console.WriteLine("Error subiendo archivo"); } } catch (Exception ex) { FileHelper.DeleteFile(string.Format("{0}\\{1}", ServerData.Instance.FileRepository, request.FileName)); response.Result = TransferResponseEnum.ConnectionError; protocol.SendMessage(response); } }
public void BuildingSocketInvokeElement(ref AsyncSocketUserToken userToken) { TCPProtocol tcpHandle = new TCPProtocol(AsyncSocketSvr, userToken); userToken.AsyncSocketInvokeElement = tcpHandle; tcpHandle.MessageReceiveEvent = new SocketTCPEventHandler( (object sender, byte[] bMessage) => { // TODO 消息解析 TCPProtocol proto = (TCPProtocol)sender; EditorClient client = null; if (proto.MessageHandle == null) { client = new EditorClient(); proto.MessageHandle = client; client.TCPHandle = proto; client.FrameSpeedChange = new FPSChange((int fps) => { if (FrameSpeedChange != null) { FrameSpeedChange(fps); } }); client.LogOutputEvent = new LogOutput((string log) => { if (LogOutputEvent != null) { LogOutputEvent(log); } }); Clients.Add(client); } else { lock (lock_obj) { client = proto.MessageHandle as EditorClient; descMsg(bMessage, client); } } }); if (userToken.AsyncSocketInvokeElement != null) { Debug.WriteLog.Log(eLogLevel.ell_Debug, "[ true ]" + "Building socket invoke element " + userToken.AsyncSocketInvokeElement + ".Local Address: " + userToken.ConnectSocket.LocalEndPoint + ", Remote Address: " + userToken.ConnectSocket.RemoteEndPoint); } }
private void DownloadFile(TCPProtocol protocol, DownloadRequest request) { var response = new DownloadResponse(); try { byte[] archivo = null; response.Result = ServerData.Instance.FileExists(request.FileName) ? TransferResponseEnum.OK : TransferResponseEnum.FileDoesntExist; if (response.Result == TransferResponseEnum.OK) { archivo = FileHelper.ReadFile(string.Format("{0}\\{1}", ServerData.Instance.FileRepository, request.FileName)); response.FileLength = archivo.LongLength; } protocol.SendMessage(response); if (response.Result == TransferResponseEnum.OK) { request = (DownloadRequest)protocol.RecieveMessage(); byte[] archivoAEnviar = new byte[archivo.LongLength - request.Rest]; Array.Copy(archivo, request.Rest, archivoAEnviar, 0, archivoAEnviar.LongLength); protocol.SendFile(archivoAEnviar); } else { throw new Exception("Error enviando archivo"); } } catch (Exception ex) { response.Result = TransferResponseEnum.ConnectionError; protocol.SendMessage(response); } }
private void SyncFiles(TCPProtocol protocol, ListFilesRequest request) { int pos = 0; foreach (var serverIP in ServerData.Instance.ServersIPs) { //Envio pedido y obtengo respuesta var port = ServerData.Instance.ServersPorts[pos]; //Me conecto al servidor "serverIP" protocol.ConnectClient(serverIP, port); var response = request.ListFiles(protocol); List <string> fileList = response.Data.Split(',').ToList(); fileList.Remove(fileList.Last()); foreach (var file in fileList) { if (!ServerData.Instance.FileList.Contains(file)) { //El archivo no existe, pido para descargarlo var downloadRequest = new DownloadRequest(); downloadRequest.FileName = file; downloadRequest.Rest = 0; var downloadResponse = downloadRequest.DownloadFile(protocol, ServerData.Instance.FileRepository); if (downloadResponse.Result == TransferResponseEnum.OK) { Console.WriteLine("Archivo descargado con exito"); ServerData.Instance.FileList.Add(file); } } } pos++; } }
private void DownloadFile(TCPProtocol protocol, DownloadRequest request) { var response = new DownloadResponse(); try { //Le comunico al servidor de conciliacion que un usuario pidio descargar un archivo. var remotingRequest = new ClientDownloadRequest() { ClientName = request.ClientName, FileName = request.FileName }; _remotingService.SendMessage(remotingRequest); byte[] archivo = null; response.Result = ServerData.Instance.FileExists(request.FileName) ? TransferResponseEnum.OK : TransferResponseEnum.FileDoesntExist; if (response.Result == TransferResponseEnum.OK) { archivo = FileHelper.ReadFile(string.Format("{0}\\{1}", ServerData.Instance.FileRepository, request.FileName)); response.FileLength = archivo.LongLength; } protocol.SendMessage(response); if (response.Result == TransferResponseEnum.OK) { request = (DownloadRequest)protocol.RecieveMessage(); byte[] archivoAEnviar = new byte[archivo.LongLength - request.Rest]; Array.Copy(archivo, request.Rest, archivoAEnviar, 0, archivoAEnviar.LongLength); protocol.SendFile(archivoAEnviar); } else { throw new Exception("Error enviando archivo"); } } catch (System.IO.FileNotFoundException e) { response.Result = TransferResponseEnum.FileDoesntExist; //Actualizo mi lista, por las dudas. ServerData.Instance.FileList = new List <string>(); foreach (string pathArchivo in FileHelper.SearchFilesInLocation(ServerData.Instance.FileRepository)) { ServerData.Instance.FileList.Add(Path.GetFileName(pathArchivo)); } //Envio respuesta. protocol.SendMessage(response); } catch (Exception ex) { response.Result = TransferResponseEnum.ConnectionError; protocol.SendMessage(response); } }