[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