Avatar billede maabjerg Nybegynder
15. februar 2006 - 23:34 Der er 27 kommentarer

Sende en fil fra computer til computer

Hej eksperter

Jeg er rimelig ny i C#, har codet meget PHP og andre sprog førhen, men nu vil jeg videre med C#.

Jeg er ved at lave et simpelt program til at sende en fil fra en maskine til en anden, men ved ikke hvordan jeg skal gøre det, nogen der kan hjælpe mig her, det vil jeg sætte stor pris på.


På forhånd tak

Med venlig hilsen
Steffen Maabjerg
Avatar billede arne_v Ekspert
16. februar 2006 - 04:16 #1
socket ?
Avatar billede arne_v Ekspert
16. februar 2006 - 04:20 #2
server:

construct TcpListener
accept en TcpClient
get en Stream
aaben en FileStream
kopier fra net stream til file stream

client:

construct en TcpClient
get en Stream
aaben en FileStream
kopier fra file stream til net stream
Avatar billede alex_sleiborg Nybegynder
16. februar 2006 - 18:09 #3
Kan du give et eksempel arne. Jeg står nemlig også med det problem
Avatar billede arne_v Ekspert
16. februar 2006 - 19:13 #4
det er lige ud af landevejen
Avatar billede arne_v Ekspert
16. februar 2006 - 19:18 #5
using System;
using System.IO;
using System.Net;
using System.Net.Sockets;

public class Server
{
    public static void Main(string[] args)
    {
        TcpListener srv = new TcpListener(IPAddress.Any, 1234);
        srv.Start();
        TcpClient cli = srv.AcceptTcpClient();
        Stream nstm = cli.GetStream();
        Stream fstm = new FileStream(@"C:\z.2", FileMode.CreateNew, FileAccess.Write);
        byte[] b = new byte[10000];
        int n;
        while((n = nstm.Read(b, 0, b.Length)) > 0)
        {
            fstm.Write(b, 0, n);
        }
        nstm.Close();
        fstm.Close();
        cli.Close();
        srv.Stop();
    }
}
Avatar billede arne_v Ekspert
16. februar 2006 - 19:19 #6
using System;
using System.IO;
using System.Net;
using System.Net.Sockets;

public class Client
{
    public static void Main(string[] args)
    {
        TcpClient cli = new TcpClient("localhost", 1234);
        Stream nstm = cli.GetStream();
        Stream fstm = new FileStream(@"C:\z.1", FileMode.Open, FileAccess.Read);
        byte[] b = new byte[10000];
        int n;
        while((n = fstm.Read(b, 0, b.Length)) > 0)
        {
            nstm.Write(b, 0, n);
        }
        nstm.Close();
        fstm.Close();
        cli.Close();
    }
}
Avatar billede arne_v Ekspert
16. februar 2006 - 19:19 #7
using System;
using System.IO;
using System.Net;
using System.Net.Sockets;

public class Server
{
    public static void Main(string[] args)
    {
        TcpListener srv = new TcpListener(IPAddress.Any, 1234);
        srv.Start();
        TcpClient cli = srv.AcceptTcpClient();
        Stream nstm = cli.GetStream();
        Stream fstm = new FileStream(@"C:\z.2", FileMode.CreateNew, FileAccess.Write);
        byte[] b = new byte[10000];
        int n;
        while((n = nstm.Read(b, 0, b.Length)) > 0)
        {
            fstm.Write(b, 0, n);
        }
        nstm.Close();
        fstm.Close();
        cli.Close();
        srv.Stop();
    }
}
Avatar billede arne_v Ekspert
16. februar 2006 - 19:24 #8
undskyld dobbelt post af server - jeg troede at browseren hang
Avatar billede alex_sleiborg Nybegynder
16. februar 2006 - 20:31 #9
Sorry maabjerg, hvis jeg har spammer din tråd. Hvis du ikke vil have det, må du sige til. Så skal jeg nok oprette en selv, men jeg står nemlig med nøjagtig samme problem som dig. Du skal nok også få nogle point fra mig arne, hvis du vil hjælpe...

Mit program fryser, hvis jeg har den her linje med

TcpClient cli = srv.AcceptTcpClient();

Hvordan kan det være?
Avatar billede arne_v Ekspert
16. februar 2006 - 20:40 #10
den linie blokker indtil client connecter

hvis det er en GUI app saa skal den slags kode koere i en separat traad og ikke
i en event
Avatar billede alex_sleiborg Nybegynder
16. februar 2006 - 20:44 #11
Ja du har ret :)

Hvordan opretter jeg den i en separet tråd?
Avatar billede arne_v Ekspert
16. februar 2006 - 20:52 #12
(new Thread(new ThreadStart(DinMetode))).Start();

men du skal holde tungen lige i munden naar du skal opdatere GUI fra den traad
Avatar billede alex_sleiborg Nybegynder
16. februar 2006 - 21:08 #13
Hmm det vil den ikke. Den skriver følgende

LoginSystem2005.Connection.clients_connected' is a 'field' but is used like a 'method

Her er min Thread start

(new Thread(new ThreadStart(clients_connected()))).Start();

Og den kalder en helt almindelig metode
Avatar billede arne_v Ekspert
16. februar 2006 - 21:24 #14
du skal kalde den med en metode ikke resultat fra en metode
Avatar billede alex_sleiborg Nybegynder
16. februar 2006 - 21:30 #15
Kan du ikke give et eksempel. Jeg aner ikke hvordan man gør
Avatar billede arne_v Ekspert
16. februar 2006 - 21:43 #16
(new Thread(new ThreadStart(FooBar))).Start();

hvor

  public static void FooBar()
  {
  }
Avatar billede maabjerg Nybegynder
16. februar 2006 - 21:58 #17
Så, nu fik jeg tid til at sidde ved computeren igen. Jeg kan se i er i fuld gang med at give mig svar, og helt iorden at du lige kommenterer med alex_sleiborg :).

Det er også en windows applikation jeg skal lave som den ene altså clienten og så server, skal bare være en Console Applikation.

Jeg prøver lige med noget af det du er kommet med arne, og tak :)
Avatar billede maabjerg Nybegynder
16. februar 2006 - 22:10 #18
Nu har jeg arbejdet med det og fået det til at virke.

Server - Kører som Console App.
Client - Kører som Win App.

Men tænkte på hvordan at min console applikation kan forblive åben, den lukker så snart den har modtaget filen.??

På forhånd tak

Med venlig hilsen
Steffen Maabjerg
Avatar billede arne_v Ekspert
16. februar 2006 - 22:26 #19
TcpListener srv = new TcpListener(IPAddress.Any, 1234);
srv.Start();
while(true)
{
        TcpClient cli = srv.AcceptTcpClient();
        Stream nstm = cli.GetStream();
        Stream fstm = new FileStream(@"C:\z.2", FileMode.CreateNew, FileAccess.Write);
        byte[] b = new byte[10000];
        int n;
        while((n = nstm.Read(b, 0, b.Length)) > 0)
        {
            fstm.Write(b, 0, n);
        }
        nstm.Close();
        fstm.Close();
        cli.Close();
}
Avatar billede arne_v Ekspert
16. februar 2006 - 22:27 #20
hvis upload tager lang tid saa start en traad for hver client - det er ret almindeligt
Avatar billede arne_v Ekspert
16. februar 2006 - 22:27 #21
[og du skal selvfoelgelig goere noget for filnavnet ...]
Avatar billede maabjerg Nybegynder
18. februar 2006 - 22:30 #22
Tak for det, men angående filnavne, hvordan kan jeg sende det med ??..

Og angående Threads, hvordan fungere det, og kan du give et eksempel på hvordan jeg gør?

På forhånd tak :)
Avatar billede arne_v Ekspert
18. februar 2006 - 23:39 #23
sende filnavn fra client til server ?

16/02-2006 21:43:13 viser threads
Avatar billede alex_sleiborg Nybegynder
19. februar 2006 - 19:35 #24
Hvordan kan jeg stoppe den tcp listener??? Jeg har prøvet med følgende, men får fejl under runtime

Her er noget af min kode

        private TcpListener srv;
        private TcpClient cli;
        private void StartTcpListener()
        {
            this.srv = new TcpListener(IPAddress.Any, 80);
            srv.Start();
            this.cli = srv.AcceptTcpClient();//Her får jeg fejl under runtime, når jeg kalder metoden StopServer()
            ++clients_connected;
            DoSetClientconnText(clients_connected.ToString());
        }
        private void StartServer()
        {
            (new Thread(new ThreadStart(StartTcpListener))).Start();
        }
        private void StopServer()
        {
            if(this.cli != null)
            this.cli.Close();
            this.srv.Stop();
            this.clients_connected = 0;
            this.lbl_Clientsconn.Text = "0";
        }
        public delegate void SetClientsconnTextDelegate(string atext);
        public void DoSetClientconnText(string aText)
        {
            if (this.InvokeRequired)
                this.Invoke(new SetClientsconnTextDelegate(this.DoSetClientconnText), new object[] { aText });

            else
                this.lbl_Clientsconn.Text = aText;
        }

Den skriver følgende fejl besked
En blokeringshandling blev afbrudt af et kald til WSACancelBlockingCall

Skal jeg bare sætte exception handling på???
Avatar billede arne_v Ekspert
19. februar 2006 - 23:22 #25
hvis du lukker en socket som en traad lytter paa saa skal du faa en exception
Avatar billede alex_sleiborg Nybegynder
20. februar 2006 - 16:41 #26
Okay. Så laver jeg bare en exception der ikke gør noget.

Arne i mit server program vil jeg gerne have åbnet en ny winform, hvis den fil klient programmet prøver at sende ikke eksisterer... Her er klient programmets kode

TcpClient cli = new TcpClient(this.txt_ServerIP.Text, 80);
            Stream nstm = cli.GetStream();

            if (File.Exists("certifikat.xml"))
            {
                Stream fstm = new FileStream(@"certifikat.xml", FileMode.Open, FileAccess.Read);
                byte[] b = new byte[10000];
                int n;
                while ((n = fstm.Read(b, 0, b.Length)) > 0)
                {
                    nstm.Write(b, 0, n);
                }
                nstm.Close();
                fstm.Close();
            }
            else
            {
                byte[] b = new byte[0];
                int n = 0;
                nstm.Write(b, 0, n);
            }
            nstm.Close();
            cli.Close();


Og noget af server programmets kode. Men det virker ikke rigtig

this.srv = new TcpListener(IPAddress.Any, 80);
                srv.Start();
                this.cli = srv.AcceptTcpClient();
                ++clients_connected;
                DoSetClientconnText(clients_connected.ToString());
                Stream nstm = cli.GetStream();
               
               
                byte[] b = new byte[10000];
                int n;
                while ((n = nstm.Read(b, 0, b.Length)) > 0)
                {
                    if (nstm.Length == null)
                    {
                        Klient_Properties kli = new Klient_Properties();
                        kli.MdiParent = this.MdiParent;
                        kli.Show();
                        ((Main)this.MdiParent).MainEnabled(true);
                    }
                    else
                    {
                        Stream fstm = new FileStream(@"test", FileMode.CreateNew, FileAccess.Write);
                        fstm.Write(b, 0, n);
                        fstm.Close();
                    }
                }
                nstm.Close();
                cli.Close();

Hvordan kan jeg lige gøre det???
Avatar billede arne_v Ekspert
24. februar 2006 - 21:39 #27
ingen anelse
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