Je développe une application simple pour envoyer des fichiers sur TCP en utilisant les classes TCPListener et TCPClient. Voici le code qui envoie le fichier.Comment envoyer des fichiers sur TCP avec TcpListener/Client? Problème SocketException
Stop est un booléen volatile qui aide à arrêter le processus à tout moment et WRITE_BUFFER_SIZE pourrait être modifié dans l'exécution (autre volatile)
while (remaining > 0 && !stop)
{
DateTime current = DateTime.Now;
int bufferSize = WRITTE_BUFFER_SIZE;
buffer = new byte[bufferSize];
int readed = fileStream.Read(buffer, 0, bufferSize);
stream.Write(buffer, 0, readed);
stream.Flush();
remaining -= readed;
// Wait in order to guarantee send speed
TimeSpan difference = DateTime.Now.Subtract(current);
double seconds = (bufferSize/Speed);
int wait = (int)Math.Floor(seconds * 1000);
wait -= difference.Milliseconds;
if (wait > 10)
Thread.Sleep(wait);
}
stream.Close();
ce qui est le code qui gère le côté récepteur:
do
{
readed = stream.Read(buffer, 0, READ_BUFFER_SIZE);
// write to .part file and flush to disk
outputStream.Write(buffer, 0, readed);
outputStream.Flush();
offset += readed;
} while (!stop && readed > 0);
Maintenant, lorsque la vitesse est faible (environ 5 Kbits/s), tout fonctionne bien mais, à mesure que j'augmente la vitesse, la taille du récepteur devient plus encline à déclencher une exception SocketException lors de la lecture du flux. Je suppose que cela a à voir avec le socket distant étant fermé avant que toutes les données peuvent être lues, mais quelle est la bonne façon de faire cela? Quand dois-je fermer le client expéditeur?
Je n'ai pas trouvé de bons exemples de transmission de fichiers sur google, et ceux que j'ai trouvés ont une implémentation similaire de ce que je fais donc je suppose que je manque quelque chose.
Modifier: Je reçois cette erreur "Impossible de lire les données de la connexion de transport". C'est une exception IOException dont l'exception interne est une exception SocketException. J'ai ajouté ceci dans la fonction d'expéditeur, j'obtiens toujours la même erreur, le code n'atteint jamais le stream.close() et bien sûr le tcpclient ne se ferme jamais vraiment ... donc je suis complètement perdu maintenant .
buffer = new byte[1];
client.Client.Receive(buffer);
stream.Close();
L'expéditeur est-il le client? – grieve
En fait, l'application est à la fois client et serveur. Actuellement, je transfère de l'application à elle-même, alors oui, le client est l'expéditeur. –