Avatar billede misbruger Nybegynder
28. november 2002 - 14:10 Der er 5 kommentarer og
1 løsning

Stream håndtering

Jeg skal lave en methode (C#), som sender en stream til en given ip addresse.

Streamen jeg sender indenholder en eller flere parametere samt et funktionskald.

Derpå modtager jeg en ligeledes en stream med en eller flere parametere.

Parameterne er adskildt af ;
Har linieskift ved §
Streamen afsluttes ved $

Er der nogle der kan guide mig i hvordan man gør?
Avatar billede simon.ulsnes Nybegynder
28. november 2002 - 15:15 #1
using System.Net.Sockets;
using System.Net;
using System.IO;

TcpClient client = new TcpClient("adresse", port);
NetworkStream ns = client.GetStream();
StreamWriter writer = new StreamWriter(ns);
writer.Write("dinedata§en ny linje$");
writer.Close();
ns.Close();
client.Close();

Det kan anbefales at bruge exceptions, hvis nu modtageren ikke gider at være med...

// Simon
Avatar billede simon.ulsnes Nybegynder
28. november 2002 - 15:18 #2
Du kan evt. formatere dine data således:

CALL DinMetode(string, string, int)§
PARAM string DataForFørsteStreng§
PARAM string DataForAndenStreng§
PARAM int Tallet$

Der er i øvrigt ingen grund til at benytte specielle tegn som § og $ til at angive linjeskift og slutning af stream, det klare automatisk - linjeskiftet ("\n") sendes automatisk med hvis strengen indeholder det.

// Simon
Avatar billede simon.ulsnes Nybegynder
28. november 2002 - 15:20 #3
For at modtage data, dropper du client.Close() og ns.Close() i mit første svar og tilføjer detter:

string received = "";
StreamReader reader = new StreamReader(ns);
recevied = reader.ReadToEnd();
reader.close();
ns.Close();
client.Close();

// simon
Avatar billede misbruger Nybegynder
28. november 2002 - 18:06 #4
Hej Simon

Det er sku' ganske godt! Tak skal du have....!

Men jeg har besluttet mig for at bruge sockets....

[STAThread]
static void Main(string[] args)
{
Console.WriteLine(DoSocketGet("ip-address"));
}

public static string DoSocketGet(string server)
{
    //Sets up variables and a string to write to the server
    Encoding ASCII = Encoding.ASCII;
    string Get = "GET / HTTP/1.1\r\nHost: " + server + "\r\nConnection: Close\r\n\r\n";
    Byte[] ByteGet = ASCII.GetBytes(Get);
    Byte[] RecvBytes = new Byte[256];
    String strRetPage = null;
   
    // IPAddress and IPEndPoint represent the endpoint that will
    //  receive the request.
    // Get the first IPAddress in the list using DNS.
    IPAddress hostadd = Dns.Resolve(server).AddressList[0];
    IPEndPoint EPhost = new IPEndPoint(hostadd, 80);
   
    //Creates the Socket for sending data over TCP.
    Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp );
   
    // Connects to the host using IPEndPoint.
    s.Connect(EPhost);
    if (!s.Connected)
    {
        strRetPage = "Unable to connect to host";
    }
    else
    {
        // Sends the GET text to the host.
        s.Send(ByteGet, ByteGet.Length, SocketFlags.None);

        // Receives the page, looping until all bytes are received
        Int32 bytes = s.Receive(RecvBytes, RecvBytes.Length, 0);
        strRetPage = "Default HTML page on " + server + ":\r\n";
        strRetPage = strRetPage + ASCII.GetString(RecvBytes, 0, bytes);

        while (bytes > 0)
        {
            bytes = s.Receive(RecvBytes, RecvBytes.Length, SocketFlags.None);
            strRetPage = strRetPage + ASCII.GetString(RecvBytes, 0, bytes);
        }
    }
return strRetPage;
}

Lækker ikke? :)

Men du skal have tak for din hjælp!
Avatar billede misbruger Nybegynder
28. november 2002 - 18:07 #5
...den mangler selvfølgelig stadig lidt exception håndtering!
Avatar billede misbruger Nybegynder
28. november 2002 - 23:05 #6
/*
Damn! Jeg har lige kørte en række tester på både sockets og streams, og faktisk har alle tester vist at læse det som streams, har bedre performance end sockets....

Derfor, såfremt der er andre der skal bruge det, har jeg vedlagt den fulde kode til en effektiv stream håndtering....
*/
using System;
using System.Net.Sockets;
using System.Net;
using System.IO;

namespace WebControl
{
    /// <summary>
    /// Summary description for Streams.
    /// </summary>
    public class Streams
    {
        public static string getStream(string server, int port, string textToSent)
        {
            string result = "";
            TcpClient Client = null;
            NetworkStream netStream = null;
            StreamWriter writer = null;
            StreamReader reader = null;
            try
            {       
                Client = new TcpClient(server, port);
                netStream = Client.GetStream();

                if(netStream.CanWrite)
                {
                    writer = new StreamWriter(netStream);
                    writer.Write(textToSent);   
                    writer.Flush();
                    //writer.Close();

                    if(netStream.CanRead)
                    {
                        reader = new StreamReader(netStream);
                        result = reader.ReadToEnd().ToString();
                        //reader.Close();
                    }
                    else
                    {
                        result += netStream.DataAvailable.ToString();
                        result += "The stream is not readable!";
                    }
                }
                else
                {
                    result = "The stream is not writable!";
                }
            }
            catch (Exception e)
            {
                result = e.ToString();
            }
            finally
            {
                netStream.Close();
                Client.Close();
            }
            return result;
        }
    }
}

/*
God fornøjelse!
*/
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester