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
Annonceindlæg tema
16. februar 2006 - 04:16
#1
socket ?
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
16. februar 2006 - 18:09
#3
Kan du give et eksempel arne. Jeg står nemlig også med det problem
16. februar 2006 - 19:13
#4
det er lige ud af landevejen
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(); } }
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(); } }
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(); } }
16. februar 2006 - 19:24
#8
undskyld dobbelt post af server - jeg troede at browseren hang
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?
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
16. februar 2006 - 20:44
#11
Ja du har ret :) Hvordan opretter jeg den i en separet tråd?
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
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
16. februar 2006 - 21:24
#14
du skal kalde den med en metode ikke resultat fra en metode
16. februar 2006 - 21:30
#15
Kan du ikke give et eksempel. Jeg aner ikke hvordan man gør
16. februar 2006 - 21:43
#16
(new Thread(new ThreadStart(FooBar))).Start(); hvor public static void FooBar() { }
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 :)
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
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(); }
16. februar 2006 - 22:27
#20
hvis upload tager lang tid saa start en traad for hver client - det er ret almindeligt
16. februar 2006 - 22:27
#21
[og du skal selvfoelgelig goere noget for filnavnet ...]
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 :)
18. februar 2006 - 23:39
#23
sende filnavn fra client til server ? 16/02-2006 21:43:13 viser threads
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å???
19. februar 2006 - 23:22
#25
hvis du lukker en socket som en traad lytter paa saa skal du faa en exception
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???
24. februar 2006 - 21:39
#27
ingen anelse
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.