Domanda

devo compito di presentare una domanda di server, che controlla se è presente alcun file sul server (il cui nome deve essere inviato dal client) e se esiste per restituire una risposta (messaggio - "esiste questo file. "). Ho problema con questo. Il server sta facendo la cosa giusta, ma quando cerco di usare la mia BinaryReader per leggere la risposta che dà Me Back questa eccezione:

Unable to read beyond the end of the stream

Ecco il codice dal 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);
        }
    }

E questo è il metodo 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;
    }

E qui come sto inviando i dati al 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();
        }
    }

Potrebbe aiutarmi, per favore?

È stato utile?

Soluzione

Dopo aver letto la stringa, si rileva che il messaggio! = Null e così il ciclo viene eseguito di nuovo. Ma il server non ha scritto niente altro al flusso, in modo che quando si tenta di leggere la stringa successiva, non c'è niente da leggere. Ogni ReadString prima legge in una stringa di lunghezza e quindi i dati di stringa (vedi http://msdn.microsoft.com/en-us/library/system.io.binaryreader.readstring.aspx ). Il server non ha nemmeno fatto una lunghezza di stringa a disposizione per leggere, in modo da ottenere un errore. Penso che sia quello che sta succedendo. Avete bisogno di qualche indicatore di quanto tempo il flusso è o quando hai raggiunto la fine.

Altri suggerimenti

mi aspetto che il flusso non ha fornito l'oggetto grafico completamente binario e così il BinaryReader sta cercando di deserializzare un oggetto parziale.

TCP è un flusso orientato protocollo, non un messaggio orientato protocollo. Ciò significa che tutto è garantito il per arrivare nel giusto ordine e di tutto o niente è ricevuto. Tuttavia, non significa che tutto arriverà con la stessa lettura.

E 'a voi per assicurarsi che tutto è stato ricevuto correttamente prima di tentare di leggerlo.

Google un po 'su NetworkStream e vedere come altri lo utilizzano in applicazioni server. Normalmente inviare un colpo di testa e poi i dati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top