Witam, na chwilę dysponuję kodem który umożliwia wysłanie wiadomości do aplikacji pełniącej rolę serwera.
Poniżej zamieszczam kod. Chciałbym aby aplikacja działała w ten sposób: klient łączy się do serwera, serwer zlicza ilu klientów jest aktualnie do niego połączonych, dalej serwer ma wątek który sprawdza parametry i w niektórych przypadkach wysyła do wszystkich klientów informację, po czym jeden z klientów może, ale nie musi obsłużyć daną informację, przez co ponownie komunikuje się z serwerem, aby ten wysłał informacje o tym do pozostałych klientów. Najtrudniejsze jest utrzymanie listy klientów, nie wiem w jaki sposób to realizować?
Kod Serwera:
public class Client
{
TcpClient _client = null;
byte[] buffer;
public Client(TcpClient client)
{
_client = client;
buffer = new byte[_client.ReceiveBufferSize];
_client.GetStream().BeginRead(buffer, 0, _client.ReceiveBufferSize, receiveMessage, null);
}
public void receiveMessage(IAsyncResult ar)
{
int bytesRead;
try
{
lock (_client.GetStream())
{
bytesRead = _client.GetStream().EndRead(ar);
}
if (bytesRead < 1)
{
return;
}
else
{
string messageReceived = ASCIIEncoding.ASCII.GetString(buffer, 0, bytesRead);
MessageBox.Show("Odebrano: " + messageReceived);
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
//log.Error("Exception in Nasluchiwanie()", ex);
}
}
}
private void ThreadTaskNasluchiwanie()
{
try
{
IPAddress ipAddressLis = IPAddress.Parse(tbIpAddress.Text);
TcpListener listener = new TcpListener(ipAddressLis, PORT_NO);
listener.Start();
while (true)
{
Client user = new Client(listener.AcceptTcpClient());
}
}
catch (Exception ex)
{
pictureBox1.Image = global::SerwerTerminarz.Properties.Resources.server_error;
MessageBox.Show(ex.Message);
}
}
Kod Klienta:
IP_ADDRESS = Base.GetValueFromSetting("ip_serwer");
PORT_NO = Base.GetValueFromSetting("port_serwer");
string halloServer = "HALLO_SERVER:" + UserLogin.name;
TcpClient client = new TcpClient(IP_ADDRESS, Convert.ToInt32(PORT_NO));
byte[] toSend = ASCIIEncoding.ASCII.GetBytes(halloServer);
NetworkStream nwStream = client.GetStream();
nwStream.Write(toSend, 0, toSend.Length);