Пример #1
0
        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);
            }
        }
Пример #4
0
        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);
            }
        }
Пример #5
0
        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();
            }
        }
Пример #6
0
        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);
                }
            }
        }
Пример #9
0
        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();
            }
        }
Пример #10
0
        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));
                }
            }
        }
Пример #11
0
        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);
            }
        }
Пример #13
0
        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);
            }
        }
Пример #14
0
        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);
            }
        }