Forum » Programiranje » [VC#] TCP/IP povezava med aplikacijama
[VC#] TCP/IP povezava med aplikacijama
urosz ::
imam eno vprašanje, če bi znal kdo pomagat
Izdelat moram dve aplikaciji (oz. eno, ki pa lahko igra vlogo ali strežnika ali odjemalca), ki si med seboj pošiljata sporočila. Aplikacija se zažene 2x enaka. Najprej se požene server, nato odjemalec. Ko odjemalec prvič pošlje podatke, jih strežnik sprejme. Ko jih pošlje drugič, se pa zaustavi. Kako bi naredil, da bi strežnik cel čas prejemal podatke, kdajkoli in kolikokrat koli se odjemalec pač odloči, da bo jih poslal?
Strežnik zaženem tako:
Odjemalec se poveže in pošlje podatke tako:
Izdelat moram dve aplikaciji (oz. eno, ki pa lahko igra vlogo ali strežnika ali odjemalca), ki si med seboj pošiljata sporočila. Aplikacija se zažene 2x enaka. Najprej se požene server, nato odjemalec. Ko odjemalec prvič pošlje podatke, jih strežnik sprejme. Ko jih pošlje drugič, se pa zaustavi. Kako bi naredil, da bi strežnik cel čas prejemal podatke, kdajkoli in kolikokrat koli se odjemalec pač odloči, da bo jih poslal?
TcpClient odjemalec; TcpListener streznik; Socket socketForClient; NetworkStream networkStream; StreamReader streamReader; StreamWriter streamWriter;
Strežnik zaženem tako:
private void button_streznik_Click(object sender, EventArgs e) { Thread trd = new Thread(new ThreadStart(this.poslusaj)); trd.IsBackground = true; trd.Start(); } private void poslusaj() { streznik = new TcpListener(IPAddress.Parse("127.0.0.1"),1111); streznik.Start(); MessageBox.Show("Server: poslusam za povezavo..."); try { while (true) { if (streznik.Pending()) { socketForClient = streznik.AcceptSocket(); MessageBox.Show("Server: povezava sprejeta!"); if (socketForClient.Connected) { networkStream = new NetworkStream(socketForClient); streamReader = new StreamReader(networkStream); string sprejeto = streamReader.ReadLine(); dodajLik(sprejeto); // funkcija, ki sparsa prejeto sporočilo pač.. } } } } catch (Exception err) { ................ } }
Odjemalec se poveže in pošlje podatke tako:
private void button_odjemalec_Click(object sender, EventArgs e) { odjemalec = new TcpClient("localhost", 1111); socketForClient = odjemalec.Client; } private void poslji(string tekst) { // Pošlji strežniku if (odjemalec.Connected) { networkStream = odjemalec.GetStream(); streamReader = new StreamReader(networkStream); streamWriter = new StreamWriter(networkStream); streamWriter.WriteLine(tekst); streamWriter.Flush(); } }
Ericssony ::
Spodaj imaš primer izvorne kode enega mojih šolskih primerov odjemalca in strežnika.
Odjemalec:
Strežnik:
Odjemalec:
namespace CSharpSockets.TcpEcho { using System; using System.Net.Sockets; using System.Text; static class TcpEcho { static void Main(string[] args) { // Preveri pravilnost argumentov. if ((args.Length < 2) || (args.Length > 3)) { Console.WriteLine("TcpEcho pošlje določeno število nizov na strežnik.\n"); Console.WriteLine("Parametri: <strežnik> <niz> [<vrata>]\n"); // Končaj program. return; } // Ime serverja ali IP naslov string server = args[0]; // Če določeno uporabi argument vrat, // drugače uporabi privzeta vrata 7. int port = (args.Length == 3) ? int.Parse(args[2]) : 7; // Pretvori niz podatkov v zlogovno polje s kodiranjem UTF8. byte[] dataBuffer = Encoding.UTF8.GetBytes(args[1]); try { // Tipičen TCP odjemalec ima tri korake: // 1. Kreiranje nova instance razreda TcpClient. // 2. Komunicakija z uporabo podatkovnega toka. // 3. Konec komunikacije z uporabo metode Close() razreda TcpClient. // Ustvari vtičnico, ki je povezana na strežnik na določenih vratih. using (TcpClient client = new TcpClient(server, port)) using (NetworkStream stream = client.GetStream()) { Console.WriteLine( "\nPovezan na strežnik: {0}\nVtičnica: {1}\n", server, client.Client.RemoteEndPoint); // Pošlji kodiran niz strežniku stream.Write(dataBuffer, 0, dataBuffer.Length); Console.WriteLine( "Pošiljam sporočilo strežniku: {0} ({1} zlogov)...\n", args[1], dataBuffer.Length); // Število prejetih zlogov int totalBytesRecieved = 0; // Število nazadnje prejetih zlogov. int bytesReceived; // Sprejmi nazaj niz poslan od strežnika. while (totalBytesRecieved < dataBuffer.Length) { if ((bytesReceived = stream.Read( dataBuffer, totalBytesRecieved, dataBuffer.Length - totalBytesRecieved)) == 0) { Console.WriteLine("Povezava prekinjena predčasno.\n"); break; } totalBytesRecieved += bytesReceived; } Console.WriteLine( "Odgovor strežnika: {0} ({1} zlogov)\nPrejeto na vtičnici: {2}", Encoding.UTF8.GetString(dataBuffer, 0, totalBytesRecieved), totalBytesRecieved, client.Client.LocalEndPoint); } } catch(SocketException e) { Console.WriteLine(e.Message); } } } }
Strežnik:
namespace CSharpSockets.TcpEchoServer { using System; using System.Net; using System.Net.Sockets; static class TcpEchoServer { // Velikost dohodnega medpomnilnika, private const int BufferSize = 32; static void Main(string[] args) { // Preveri pravilnost argumentov. if (args.Length > 1) { Console.WriteLine("Parametri: [<vrata>]"); // Končaj program. return; } // Določi vrata glede na argument ali pa uporabi privzeta. int port = (args.Length == 1) ? int.Parse(args[0]) : 7; // Dohodni medpomnilnik. byte[] receiveBuffer = new byte[BufferSize]; // Tipični koraki za TCP strežnik: // 1. Kreiramo novo instanco razreda TcpListener. // 2. Ponavljajoče: // - kličemo metodo AcceptTcpClient() razreda TcpClient, // da dobimo naslednjo prihajajočo povezavo odjemalca. // - komuniciramo z odjemalcem z medoti Read() in Write() // razreda NetworkStream. // - končamo komunikacijo s vtičnico odjemalca z uporabo // metode Close() razredov NetworkStream in TcpClient. // Nova instanca objekta TcpListener, ki sprejme povezavo od klijenta. TcpListener listener = new TcpListener(IPAddress.Any, port); listener.Start(); // Sprejmi in obdelaj povezave v neskončni zanki. while (true) { try { // Povezava do klijenta using (TcpClient client = listener.AcceptTcpClient()) using (NetworkStream netStream = client.GetStream()) { Console.Write("Upravljanje z odjemalcem - "); // Število vrnjenih zlogov. int totalBytesEchoed = 0; // Število prejetih zlogov. int bytesReceived; // Prejemaj dokler odjemalec ne prekine povezave z vrnjeno vrednostjo 0 while ((bytesReceived = netStream.Read(receiveBuffer, 0, receiveBuffer.Length)) > 0) { netStream.Write(receiveBuffer, 0, bytesReceived); totalBytesEchoed += bytesReceived; } Console.WriteLine("vrnjeno {0} zlogov.", totalBytesEchoed); } } catch (SocketException e) { Console.WriteLine(e.Message); } } } } }
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Socket ServerOddelek: Programiranje | 2427 (1620) | fx |
» | C# Branje iz datotekeOddelek: Programiranje | 974 (783) | boogie_xlr |
» | [C#] Client -> Server komunikacija dela, kako je pa z Server -> Client?Oddelek: Programiranje | 1270 (1136) | Mitja Bonča |
» | [Visual C#] zaradi while zanke se ne pokaže oknoOddelek: Programiranje | 988 (865) | Fresh-Grass |
» | c# base class, derived class, inheritance problemOddelek: Programiranje | 1391 (1270) | Vapo1 |