Question

J'ai tâche de faire une application serveur, qui vérifie si un fichier sur le serveur (dont le nom doit être envoyé par le client) existe et si elle existe pour redonner une réponse (message - « Ce fichier existe. « ). J'ai problème avec cela. Le serveur fait la bonne chose, mais lorsque je tente d'utiliser mon BinaryReader pour lire la réponse, il me rend cette exception:

Unable to read beyond the end of the stream

Voici un code du client:

    private void OnRequest()
    {
        try
        {
            IPEndPoint serverIp = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 55555);
            TcpClient client = new TcpClient();
            client.Connect(serverIp);
            if (client.Connected)
            {
                AddLog("Connected!");

                writer = new BinaryWriter(client.GetStream());

                writer.Write("request");
                GetFileText();
                writer.Write(fileText);
                writer.Flush();

                AddServerResponse(GetResponse(client.Client));

                writer.Close();
                client.Close();
                AddLog("Disconnected!");
            }

        }
        catch (Exception e)
        {
            MessageBox.Show(e.Message, "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

Et c'est la méthode GetResponse:

    private string GetResponse(Socket server)
    {
        NetworkStream stream = new NetworkStream(server);
        reader = new BinaryReader(stream);
        string message;
        do
        {
            message = reader.ReadString();
        }
        while (message != null);
        reader.Close();
        return message;
    }

Et voici comment j'envoie des données au client:

    private void SendDataToClient(string data, Socket client)
    {
        if (client != null && client.Connected)
        {
            NetworkStream stream = new NetworkStream(client);
            BinaryWriter writer = new BinaryWriter(stream);
            writer.Write(data);
            writer.Flush();
            writer.Close();
            stream.Close();
        }
    }

Pourriez-vous me aider, s'il vous plaît?

Était-ce utile?

La solution

Après avoir lu la chaîne, vous détectez ce message! = Null et ainsi la boucle se présente à nouveau. Mais le serveur n'a pas écrit quoi que ce soit d'autre au courant, donc quand vous essayez de lire la chaîne suivante, il n'y a rien à lire. Chaque ReadString lit d'abord une longueur de chaîne, puis les données de chaîne (voir http://msdn.microsoft.com/en-us/library/system.io.binaryreader.readstring.aspx ). Le serveur n'a même pas fait une longueur de chaîne disponible à lire, vous obtenez une erreur. Je pense que ce qui se passe. Vous avez besoin d'un indicateur de la durée du cours d'eau est ou lorsque vous avez atteint la fin.

Autres conseils

J'attendre à ce que le flux n'a pas fourni le graphe d'objet complètement binaire et donc le BinaryReader tente de désérialiser un objet partiel.

TCP est un protocole de flux, et non un protocole orienté message. Cela signifie que tout est guranteed pour arriver dans le bon ordre et que tout ou rien reçu. Cependant, il ne veut pas dire que tout va arriver avec la même lecture.

Il est à vous pour vous assurer que tout a été reçu correctement avant de tenter de le lire.

Google sur certains NetworkStream et voir comment les autres utilisent dans des applications de serveur. Vous envoyez normalement un en-tête et que les données.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top