Send multiple files - Socket

  • Thread starter Thread starter Aretha Lemos
  • Start date Start date
A

Aretha Lemos

Guest
Guys, I've been researching this a lot, but to no avail. We are developing a Client / Server application, where Client sends files to the Server. For sending 1 file it works perfectly, but the business need is for it to send all the files in the folder one by one. Does anyone have any idea how to do this? The following is the Client / Server code. (Remembering it's in Windows Forms, VS 2017).


**Server Side**

try
{
string strEnderecoIP = "localhost";
ipEnd_servidor = new IPEndPoint(IPAddress.Parse(strEnderecoIP), 1234);
sock_Servidor = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
sock_Servidor.Bind(ipEnd_servidor);
}
catch (Exception ex)
{
mensagemServidor = "Error : " + ex.Message;
return;
}

try
{
sock_Servidor.Listen(100);
mensagemServidor = "Servidor em atendimento e aguardando para receber arquivo...";
Socket clienteSock = sock_Servidor.Accept();
clienteSock.ReceiveBufferSize = 16384;

byte[] dadosCliente = new byte[1024 * 500000];

int tamanhoBytesRecebidos = clienteSock.Receive(dadosCliente, dadosCliente.Length, 0);
int tamnhoNomeArquivo = BitConverter.ToInt32(dadosCliente, 0);
string nomeArquivo = Encoding.UTF8.GetString(dadosCliente, 4, tamnhoNomeArquivo);

BinaryWriter bWrite = new BinaryWriter(File.Open(caminhoRecepcaoArquivos + nomeArquivo, FileMode.Append));
bWrite.Write(dadosCliente, 4 + tamnhoNomeArquivo, tamanhoBytesRecebidos - 4 - tamnhoNomeArquivo);

while (tamanhoBytesRecebidos > 0)
{
tamanhoBytesRecebidos = clienteSock.Receive(dadosCliente, dadosCliente.Length, 0);
if (tamanhoBytesRecebidos == 0)
{
bWrite.Close();
}
else
{
bWrite.Write(dadosCliente, 0, tamanhoBytesRecebidos);
}
}
bWrite.Close();

clienteSock.Close();
mensagemServidor = "File received [" + nomeArquivo + "] (" + (tamanhoBytesRecebidos - 4 - tamnhoNomeArquivo) + " bytes recebido); Server Stopped";
}
catch (SocketException ex)
{
mensagemServidor = ex.Message + " - Erro ao receber arquivo.";
}
}


**Client Side - Call the method to send the files**

public void Send()
{
var dirInfo = new DirectoryInfo(@"C:\Diretorio\");
var cliente = new FTCliente();
foreach (FileInfo file in dirInfo.GetFiles())
{
var mensagem = cliente.SendFiles(file.FullName);
lstMensagens.Items.Add(mensagem);
}
}


**Method to send the files**

public string SendFiles(string fileName)
{
var mensagemCliente = string.Empty;
try
{
string strEnderecoIP = "localhost";
IPEndPoint ipEnd_cliente = new IPEndPoint(IPAddress.Parse(strEnderecoIP), 1234);
Socket clientSock_cliente = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);

string filePath = "";
fileName = fileName.Replace("\\", "/");

while (fileName.IndexOf("/") > -1)
{
filePath += fileName.Substring(0, fileName.IndexOf("/") + 1);
fileName = fileName.Substring(fileName.IndexOf("/") + 1);
}

byte[] nomeArquivoByte = Encoding.UTF8.GetBytes(fileName);
if (nomeArquivoByte.Length > 5000 * 1024)
mensagemCliente += "File [ " + fileName + "] with incorrect size! </ br>";

if (fileName.Length < 52)
mensagemCliente += "File [" + fileName + "] Não tem o comprimento correto </ br>";

if (fileName.Any())
{
-- Validações internas
}

string path = filePath + fileName;

byte[] fileData = File.ReadAllBytes(path);
byte[] clientData = new byte[4 + nomeArquivoByte.Length + fileData.Length];
byte[] nomeArquivoLen = BitConverter.GetBytes(nomeArquivoByte.Length);

nomeArquivoLen.CopyTo(clientData, 0);
nomeArquivoByte.CopyTo(clientData, 4);
fileData.CopyTo(clientData, 4 + nomeArquivoByte.Length);

clientSock_cliente.Connect(ipEnd_cliente);
clientSock_cliente.Send(clientData, 0, clientData.Length, 0);
clientSock_cliente.Close();
mensagemCliente = "File [" + path + "] transferred.";
}
catch (Exception ex)
{
mensagemCliente = ex.Message + " " + "\n Fail, server failed....";
}
return mensagemCliente;
}
}


Thanks!

Continue reading...
 

Similar threads

P
Replies
0
Views
176
Policy standard local admin account with Active Di
P
M
Replies
0
Views
145
MyCatAlex
M
Back
Top