04. december 2005 - 16:00Der er
15 kommentarer og 1 løsning
C# Chat med konsolapplikation som server -howto make it open 24/7
Hejsa eksperter
Jeg sidder og er igang med at lave en chat over C#.
Jeg har en Windows Applikation som Client og en Console Applikation som Server.
Hvordan får jeg min server til at blive ved med at kunne modtage svar?, for som det er nu, så hvergang serveren får en tekst besked, så modtager den beskeden og sender den ud til alle andre på chatten (IPaddress.Any), hvorefter den lukker console applikationen ned. Hvordan kan jeg få den til at blive online.?
Her er min kode for Serveren:
using System; using System.IO; using System.Net; using System.Net.Sockets;
class Server { public static void Main(string[] args) { TcpListener server = new TcpListener(IPAddress.Any, 1234); server.Start(); TcpClient client = server.AcceptTcpClient(); StreamReader rdr = new StreamReader(client.GetStream()); StreamWriter wrt = new StreamWriter(client.GetStream()); string line; while((line = rdr.ReadLine()) != null) { wrt.WriteLine("Jeg har modtaget: " + line); wrt.Flush(); } rdr.Close(); wrt.Close(); client.Close(); server.Stop(); } }
en meget simpel måde med tråde som måske er lidt dum
din main classe static void Main(string[] args) { TcpListener server = new TcpListener(IPAddress.Any, 1234); server.Start(); while(true) { TcpClient client = server.AcceptTcpClient(); ChatClient oneClient = new ChatClient(client); ThreadStart ts = new ThreadStart(oneClient.modtag); Thread thread = new Thread(ts); thread.Start(); }
}
og ChatClient klassen using System.IO; using System.Net.Sockets;
namespace chatTest { /// <summary> /// Summary description for ChatClient. /// </summary> public class ChatClient { TcpClient client = null; public ChatClient(TcpClient client) { this.client = client; } public void modtag() { StreamReader rdr = new StreamReader(client.GetStream()); StreamWriter wrt = new StreamWriter(client.GetStream()); string line; while((line = rdr.ReadLine()) != null) { wrt.WriteLine("Jeg har modtaget: " + line); wrt.Flush(); } rdr.Close(); wrt.Close(); client.Close(); } } }
Hej maabjerg. Du kan få en chat jeg har lavet for nylig. Jeg lavede den i forbindelse med en eksamen jeg læser op til for tiden. Den viser brugen af flg. teknologier : - Server/Client arkitektur - Sockets - Tråde (Delegates) - Events (Observer Pattern)
Jo tak :) vil jeg meget gerne. Send mig lige en mail på: maabjerg@gameren.dk så får du lige ftp link, og mange tak... kigger lige ham den andens igennem også.
Så lidt, forresten, hvis man skal bygge Client ind i en Windows Form, har du så nogen gode forslag til hvordan jeg kan gøre dette... for du har skrevet Console.WriteLine mange steder, men hvordan kan jeg få den til at bruge en TextBox istedet for?
Der er flere måder du kan gøre det på - fx ved at sende en reference af din formular ned i SocketClient klassen, og derfra tilgå dine kontroller (ikke en pæn løsning, men det virker).
Alternativt kan du gøre brug af et observer-pattern baseret på interfaces eller events, som jeg har brugt på serveren. En sådan løsning gør det muligt - på en noget pænere måde - at lave kald op igennem lagene. Generelt er det en ting man skal forsøge at undgå - men med denne chat vil det ikke være muligt at undgå, med mindre du smider trådene ud på (G)UI'en. Og det vil jeg nu helst slippe for :)
Men altså - hvis du er hård, så laver du den 2. løsning. Hvis du vil lave en hurtig løsning, så bruger du bare den første løsning. Det giver samme resultat omend dårligere indkapsling. Men hvis det ikke er et stort chat-system du er ved at udvikle som skal bruges af en masse mennesker, så går det nok :)
Kan jeg få dig til at give et eksempel på en reference, for er rimelig ny indenfor C#, har codet en masse andre sprog førhen, men er lige startet på C#, så ved ikke lige hvad en reference er.
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.