Hallo,
ich habe mal testweise eine kleine Client- / Serveranwendung gebastelt. Und zum Testen so eine Art Chat daraus gebaut.
Nun bekommt der Server auch alle Nachrichten der jeweiligen Clients. Allerdings sendet der Server die Nachrichten immer nur an den anfragenden Client zurück. Mir ist nicht ganz klar wie man die Nachricht den anderen Clients ebenfalls zur Verfügung stellt.
Kann mir jemand dabei helfen?
Meine Code sieht wie folgt aus:
Server
class Program
{
static void Main(string[] args)
{
TcpListener server = new TcpListener(5550);
TcpClient client = default(TcpClient);
server.Start();
Console.WriteLine("Server started");
Console.WriteLine("Wait for connections...");
int counter = 0;
while (true)
{
counter += 1;
client = server.AcceptTcpClient();
Console.WriteLine(" >> " + "Client No: " + Convert.ToString(counter) + " started!");
HandleClient handleClient = new HandleClient();
handleClient.StartClient(client, Convert.ToString(counter));
}
client.Close();
server.Stop();
Console.WriteLine(" >> " + "exit");
Console.ReadLine();
}
}
public class HandleClient
{
TcpClient client;
Thread ctThread;
string clientNo;
public void StartClient(TcpClient pClient, string pClientNo)
{
this.client = pClient;
this.clientNo = pClientNo;
ctThread = new Thread(DoChat);
ctThread.Start();
}
private void DoChat()
{
int requestCount = 0;
byte[] bytesFrom = new byte[10025];
string dataFromClient = null;
byte[] sendBytes = null;
string serverResponse = null;
string rCount = null;
requestCount = 0;
while (true)
{
try
{
requestCount = requestCount + 1;
NetworkStream networkStream = client.GetStream();
networkStream.Read(bytesFrom, 0, (int)client.ReceiveBufferSize);
dataFromClient = Encoding.ASCII.GetString(bytesFrom);
dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$"));
Console.WriteLine(" >> From client-" + clientNo + " " + dataFromClient);
rCount = Convert.ToString(requestCount);
serverResponse = "Client(" + clientNo + ") " + dataFromClient;
sendBytes = Encoding.ASCII.GetBytes(serverResponse);
networkStream.Write(sendBytes, 0, sendBytes.Length);
networkStream.Flush();
Console.WriteLine(" >> " + serverResponse);
}
catch (Exception ex)
{
Console.WriteLine(" >> " + ex.ToString());
}
}
}
}
Client
public partial class Form1 : Form
{
private TcpClient _client;
public Form1()
{
InitializeComponent();
this.OpenConnection();
}
private void OpenConnection()
{
try
{
System.Net.IPAddress IP = System.Net.IPAddress.Parse("192.168.68.128");
_client = new TcpClient();
_client.Connect(IP, 5550);
textBoxChat.Text = "Client Socket Program - Server Connected ...";
}
catch (Exception)
{
throw new Exception();
}
}
private void SendMessage(string message)
{
NetworkStream messageStream = _client.GetStream();
ASCIIEncoding encoder = new ASCIIEncoding();
byte[] buffer = encoder.GetBytes(message + "$");
messageStream.Write(buffer, 0, buffer.Length);
messageStream.Flush();
byte[] inStream = new byte[10025];
messageStream.Read(inStream, 0, (int)_client.ReceiveBufferSize);
string returndata = System.Text.Encoding.ASCII.GetString(inStream);
DisplayMessage(returndata);
}
private void DisplayMessage(string msgData)
{
textBoxChat.Text += "\r\n" + msgData ;
}
private void btnSend_Click(object sender, EventArgs e)
{
SendMessage(textBoxEntry.Text);
textBoxEntry.Clear();
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
_client.Close();
}
}
Du sendest doch auch nur die Antwort an den sendenden Clienten. Warum erwartest Du das die Nachricht bei allen anderen auch ankommt?
Erstelle Dir eine Liste für alle Clienten die sich anmelden. Wenn dann eine Nachricht von einem Clienten kommt, sende diese an alle in der Liste enthaltenen Clienten.
Noch ein Hinweis: Jeder Client hat seinen eigenen Networkstream.
Wenn ich Dein Code so sehe, außer den Fehler, den Neidhard genannt hatte, folgende Tipps:
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Danke für Eure Tipps! Hatte den Code gestern Abend um 2 Uhr auf die Schnelle zusammengehackt und habe noch nicht so die Ahnung von Client- / Serveranwendungen. Mittlerweile habe ich es aber geschafft den Code von der Oberfläche zu trennen und das mehrere Chatfenster die Nachricht erhalten (über ein Dictionary) 😃
War auch nur mal als Test gedacht, weil mich interessiert hat wie das funktioniert.