I have the following situation, I need to transfer an xml from one application to another via the Socket network I mounted the client and server which I will post below, The file is transmitted without problems, but files with
I have the following situation, I need to transfer an xml from one application to another via the Socket network I mounted the client and server which I will post below, The file is transmitted without problems, but files with
I did this, I do not know if it would be the right one but it was the only one that solved the problem, as the problem was files that exceeded 6kbs I instead of sending the whole file, I broke it in "Packages" of 6kbs and on sent separately, At the end I unite the parts and the file arrives 100%, Follow:
CLIENT:
//Coneta com o Cliente
clientSock.Connect(ipEnd);
#region ENVIO
//Pega o tamanho total do arquivo e envia para o servidor
var tamanho = Encoding.UTF8.GetBytes(xml.Length.ToString());
//Envia o tamanho do arquivo ao servidor
clientSock.Send(tamanho);
//Aguarda a confirmação de recebimento
clientSock.Receive(new byte[1024*5000]);
//Indice inicial do substring
var startIndex = 0;
//Total restante a ser enviado
var restante = xml.Length;
//Envia os pacotes
while (restante > 0)
{
//Se o restante for maior que 6kbs
if (restante > 6144)
{
//Quebra a string em 6kb
var pacote = xml.Substring(startIndex, 6144);
//Incrementa o indice do substring
startIndex += 6144;
//Abate do restante ja enviado
restante = restante - pacote.Length;
//Envia o pacote
clientSock.Send(Encoding.UTF8.GetBytes(pacote));
//Recebe resposta confirmação
clientSock.Receive(new byte[1024*5000]);
}
else
{
//Pega o restante ou total se arquivo menor que 6kbs
var pacote = xml.Substring(startIndex, restante);
//Abate do restante
restante = restante - pacote.Length;
//Envia o pacote
clientSock.Send(Encoding.UTF8.GetBytes(pacote));
//Recebe resposta confirmação
clientSock.Receive(new byte[1024 * 5000]);
}
}
SERVER:
using (Socket clientSock = sock.Accept())
{
//Buffer de recebimento
byte[] clientData = new byte[1024*5000];
//Recebe o tamanho total esperado
clientSock.Receive(clientData);
WriteLog("Recebendo dados cliente...");
//Retorna confirmação de recebimento
clientSock.Send(Encoding.UTF8.GetBytes("true"));
//Recebe o tamanho total do arquivo que esta sendo recebido
var tamanho = int.Parse(Encoding.UTF8.GetString(clientData).Replace("//Coneta com o Cliente
clientSock.Connect(ipEnd);
#region ENVIO
//Pega o tamanho total do arquivo e envia para o servidor
var tamanho = Encoding.UTF8.GetBytes(xml.Length.ToString());
//Envia o tamanho do arquivo ao servidor
clientSock.Send(tamanho);
//Aguarda a confirmação de recebimento
clientSock.Receive(new byte[1024*5000]);
//Indice inicial do substring
var startIndex = 0;
//Total restante a ser enviado
var restante = xml.Length;
//Envia os pacotes
while (restante > 0)
{
//Se o restante for maior que 6kbs
if (restante > 6144)
{
//Quebra a string em 6kb
var pacote = xml.Substring(startIndex, 6144);
//Incrementa o indice do substring
startIndex += 6144;
//Abate do restante ja enviado
restante = restante - pacote.Length;
//Envia o pacote
clientSock.Send(Encoding.UTF8.GetBytes(pacote));
//Recebe resposta confirmação
clientSock.Receive(new byte[1024*5000]);
}
else
{
//Pega o restante ou total se arquivo menor que 6kbs
var pacote = xml.Substring(startIndex, restante);
//Abate do restante
restante = restante - pacote.Length;
//Envia o pacote
clientSock.Send(Encoding.UTF8.GetBytes(pacote));
//Recebe resposta confirmação
clientSock.Receive(new byte[1024 * 5000]);
}
}
", string.Empty));
//Arquivo xml para armazenar os pacotes ja em string
var xml = "";
//Recebe os dados e monta o xml
while (tamanho > 0)
{
//Recebe o pacote
var pacote = clientSock.Receive(clientData);
//Incrementa na string (Uni os pacotes) o valore recebido
xml += Encoding.UTF8.GetString(clientData).Replace("using (Socket clientSock = sock.Accept())
{
//Buffer de recebimento
byte[] clientData = new byte[1024*5000];
//Recebe o tamanho total esperado
clientSock.Receive(clientData);
WriteLog("Recebendo dados cliente...");
//Retorna confirmação de recebimento
clientSock.Send(Encoding.UTF8.GetBytes("true"));
//Recebe o tamanho total do arquivo que esta sendo recebido
var tamanho = int.Parse(Encoding.UTF8.GetString(clientData).Replace("%pre%", string.Empty));
//Arquivo xml para armazenar os pacotes ja em string
var xml = "";
//Recebe os dados e monta o xml
while (tamanho > 0)
{
//Recebe o pacote
var pacote = clientSock.Receive(clientData);
//Incrementa na string (Uni os pacotes) o valore recebido
xml += Encoding.UTF8.GetString(clientData).Replace("%pre%", string.Empty);
//Abate do total ja recebido
tamanho -= pacote;
//Limpa o buffer
clientData = new byte[1024*5000];
//Envia ao cliente a confirmação de recebimento
clientSock.Send(Encoding.UTF8.GetBytes("true"));
}
}
", string.Empty);
//Abate do total ja recebido
tamanho -= pacote;
//Limpa o buffer
clientData = new byte[1024*5000];
//Envia ao cliente a confirmação de recebimento
clientSock.Send(Encoding.UTF8.GetBytes("true"));
}
}
I tested uploader file with more than 1MB and it worked perfectly.
I have something similar, but the information is different. I use MLLP to transfer the files completely. Here's the implementation:
public class SiMLLP
{
private static byte[] StartBlock = new byte[] { 0x0B };
private static byte[] EndBlock = new byte[] { 0x1C, 0x0D };
private static byte[] ACK = new byte[] { 0x0B, 0x06, 0x1C, 0x0D };
private static byte[] NAK = new byte[] { 0x0B, 0x15, 0x1C, 0x0D };
private Stream _stream;
private bool _version3;
public SiMLLP(Stream stream, bool version3)
{
_stream = stream;
_version3 = version3;
}
public bool Send(string message)
{
byte[] bytes = Encoding.ASCII.GetBytes(message);
_stream.Write(StartBlock, 0, StartBlock.Length);
_stream.Write(bytes, 0, bytes.Length);
_stream.Write(EndBlock, 0, EndBlock.Length);
_stream.Flush();
if (_version3)
{
byte[] rsp = new byte[4];
if (_stream.Read(rsp, 0, 4) != 4)
return false;
return rsp[1] == 0x06;
}
return true;
}
public string Receive()
{
int ib = 0x00;
MemoryStream ms = new MemoryStream();
for (; _stream.ReadByte() != 0x0B; ) ;
while (true)
{
if (ib == 0x1C)
{
ib = _stream.ReadByte();
if (ib == 0x0D)
break;
ms.WriteByte(0x1C);
ms.WriteByte((byte)ib);
}
else
{
ib = _stream.ReadByte();
if (ib != 0x1C)
ms.WriteByte((byte)ib);
}
}
if (_version3)
{
_stream.Write(ACK, 0, ACK.Length);
_stream.Flush();
}
return Encoding.ASCII.GetString(ms.ToArray());
}
}
Usage:
NetworkStream _stream = this.TCPClient.GetStream();
SiMLLP mllp = new SiMLLP(_stream, false);
//Enquanto a flag _running estiver como true, e o client conectado
while (_running && this.TCPClient.Connected)
{
try
{
if (_stream.DataAvailable)
{
//Aqui será retornada a mensagem completa, independente do tamanho dela
string msgRecebida = mllp.Receive();
if (!String.IsNullOrEmpty(msgRecebida))
{
//Processa a mensagem
//Aqui envio qualquer mensagem de retorno
mllp.Send("ACK");
}
}
...
}
catch{}
...
}