[C# TCP VS] Hjälp med Chatt-applikation. Hur får jag det att funka?

Trädvy Permalänk
Proffsmoddare
Plats
Lomma
Registrerad
Nov 2011

[C# TCP VS] Hjälp med Chatt-applikation. Hur får jag det att funka?

Hej, har suttit med en chatt-applikation som jag har skrivit till ett arbete jag gör i skolan.
Det ska finnas en server där ett antal klienter kan ansluta till, och sedan gruppchatta med varandra.
Användarna ska också kunna ha användarnamn.

Jag har kämpat med den här ett bra tag, och jag får allt att funka fram till biten där jag ska skicka tillbaka datan till klienten.

Det som mitt program kan göra hittills.

Flera klienter kan ansluta till servern.
Klienterna kan skicka data till servern som skrivs ut i klartext serverside.
Klienternas information samt användarnamn har sparats i en lista serverside. Tanken var att kunna få ut användarnamnet där samt skicka tillbaka.

Det jag behöver hjälp med

Varför mina desperata försök i att skicka tillbaka data till klienterna inte funkar. Hur jag ska skicka tillbaka datan som servern tar emot.

Projektet ligger uppe på git. Är skrivet i Visual Studio https://github.com/Auxiliumdesign/Chatprogram

Serverside

public partial class ServerForm : Form { //initierar lyssnare, och klient TcpListener listener; TcpClient client; //skapar en ny lista med användare List<User> users = new List<User>(); IPAddress hostAddress; // visar vår adress public ServerForm( ) { InitializeComponent(); string hostName = Dns.GetHostName(); IPAddress[] hostAddresses = Dns.GetHostAddresses( hostName ); foreach ( IPAddress address in hostAddresses ) { if ( address.AddressFamily == AddressFamily.InterNetwork ) { hostAddress = address; Text = hostName + ": " + address.ToString(); } } } // Börjar lyssna efter anslutningar på vald port private void btnLyssna_Click( object sender, EventArgs e ) { listener = new TcpListener( hostAddress, int.Parse( tbxPort.Text ) ); listener.Start(); StartAccepting(); } //Börjar acceptera klienter public async void StartAccepting() { try { //väntar på en anslutande klient client = await listener.AcceptTcpClientAsync(); //Skapar en ny user av klassen User User newUser = new User(); newUser.client = client; //Lägger till newUser i listan users users.Add(newUser); //initierar metoden Läs Läs(newUser); } catch ( Exception error ) { MessageBox.Show( error.Message, "Serverfel" ); return; } //börjar om asyncen StartAccepting(); } //private? private async void Läs(User u) { byte[] data = new byte[1024]; await u.client.GetStream().ReadAsync(data, 0, 1024); //om det ej finns något användarnamn definierat så tilldelas det av första meddelandet if (u.username == null) { u.username = data.ToString(); } StartReading(client); } //börjar läsa den skickade informationen från klienten public async void StartReading( TcpClient k ) { byte[] buffer = new byte[1024]; int n = 0; try { n = await k.GetStream().ReadAsync( buffer, 0, 1024 ); } catch ( Exception error ) { MessageBox.Show( error.Message, "Serverfel" ); return;} tbxKlientData.AppendText(Encoding.Unicode.GetString( buffer, 0, n ) + Environment.NewLine); StartReading( k ); } //Funktion för att skicka? /*public async void StartSending(string message) { for (int i = 0; users.Count > i; i++) { if (client.Connected) { byte[] utData = Encoding.Unicode.GetBytes("Hej!"); try { await client.GetStream().WriteAsync(utData, 0, utData.Length); } catch (Exception error) { MessageBox.Show(error.Message, "Klientfel"); return; } } } }*/ }

Klientside

public partial class KlientForm : Form { TcpClient klient = new TcpClient(); public KlientForm( ) { InitializeComponent(); klient.NoDelay = true; } private void btnSägHej_Click( object sender, EventArgs e ) { StartSending(tbxMessage.Text); tbxMessage.Clear(); } public async void Connect ( ) { IPAddress adress = IPAddress.Parse( tbxIPAdress.Text ); int port = int.Parse( tbxPort.Text ); try { await klient.ConnectAsync( adress, port ); } catch ( Exception error ) { MessageBox.Show( error.Message, "Klientfel" ); return; } btnSend.Enabled = true; btnAnslut.Enabled = false; StartSending(tbxUsername.Text); } public async void StartSending ( string message ) { if ( klient.Connected ) { byte[] utData = Encoding.Unicode.GetBytes(message); try { await klient.GetStream().WriteAsync( utData, 0, utData.Length ); } catch ( Exception error ) { MessageBox.Show( error.Message, "Klientfel" ); return; } } } private void KlientForm_FormClosing( object sender, FormClosingEventArgs e ) { if ( klient != null ) klient.Close(); } private void btnAnslut_Click( object sender, EventArgs e ) { if ( ! klient.Connected ) Connect(); } private void tbxMessage_KeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar == (char)13) { StartSending(tbxMessage.Text); tbxMessage.Clear(); } } }

Är tacksam för all hjälp jag kan få, har lagt snart 3 dagar av mitt sportlov på bara detta problemet.
Är öppen för förslag.

Mvh

Lucas

Lucas är en glad 19-åring, på fritiden bygger han datorer, spelar volleyboll och saxofon. Att hjälpa andra är en självklarhet och han hänger massor i gruppen Swerigs på Facebook. Ni hittar hans hemsida här www.auxiliumdesign.com