Witam. Mam do napisania program w C#. Klient ma nawiązać połączenie z serwerem, wysłać identyfikator i dane, serwer odsyła odpowiedź i serwer ma zainicjować rozłączenie - i tu jest problem. Połączenie działa, serwer odpowiada itd. tylko, że zawsze rozłączenie inicjuje klient. Jak ustawić aby to serwer inicjował zakończenie połączenia z klientem?
Klient:
class Client
{
private TcpClient tcpClient;
private BinaryWriter Output;
private BinaryReader Input;
private int Client_ID;
public Client()
{
openConnection("xxx", 9999);
Console.Write("\nPodaj dlugość tekstu (n): ");
String length1 = Console.ReadLine();
int length = Int32.Parse(length1);
Console.Write("\nPodaj tekst: ");
String tekst = Console.ReadLine();
Output = new BinaryWriter(tcpClient.GetStream());
Input = new BinaryReader(tcpClient.GetStream());
Client_ID = 1;
Output.Write(Client_ID);
bool server_ID_Answer = Input.ReadBoolean();
while (server_ID_Answer != true)
{
Client_ID+=1;
if (Client_ID > 10)
{
closeConnection();
Console.WriteLine("Błąd połączenia. Serwer nie akceptuje połączenia.");
Console.Read();
Environment.Exit(0);
}
Output.Write(Client_ID);
server_ID_Answer = Input.ReadBoolean();
}
Output.Write(length);
Output.Write(tekst);
bool serverAnswer = Input.ReadBoolean();
Console.WriteLine("Odpowiedź serwera: " + serverAnswer);
closeConnection();
Console.Read();
}
private void openConnection(String address, int port)
{
try {
tcpClient = new TcpClient();
tcpClient.Connect(IPAddress.Parse(address), port);
Console.WriteLine("Otwarto połączenie.");
}catch(ArgumentNullException arg)
{
Console.WriteLine(arg);
}catch(ArgumentOutOfRangeException arg)
{
Console.WriteLine(arg);
}catch(ArgumentException arg)
{
Console.WriteLine(arg);
}catch(SocketException arg)
{
Console.WriteLine(arg);
}
}
private void closeConnection()
{
tcpClient.GetStream().Close();
tcpClient.Close();
}
}
Serwer:
class Server
{
private TcpListener listener;
private TcpClient client;
private BinaryReader Input;
private BinaryWriter Output;
private int[] Client_ID = new int[10];
public Server()
{
for (int i = 0; i < 10; i++) Client_ID[i] = 0;
openConnection(9999);
client = listener.AcceptTcpClient();
Input = new BinaryReader(client.GetStream());
Output = new BinaryWriter(client.GetStream());
int ID = 0;
ID = Input.ReadInt32();
Console.WriteLine("Odebrano połączenie. ID = " + ID);
bool status = check_Client_ID(ID);
while (status != true)
{
Output.Write(false);
ID = Input.ReadInt32();
status = check_Client_ID(ID);
}
Output.Write(true);
int n = Input.ReadInt32();
Console.WriteLine("Odebrano n = " + n);
String Text = Input.ReadString();
Console.WriteLine("Odebrano tekst: " + Text);
if (Text != null && n > 0)
{
if (Text.Length == n)
{
Output.Write(true);
}
else Output.Write(false);
}
client.GetStream().Close();
client.Close();
listener.Stop();
listener.Server.Close();
Console.WriteLine("Zamknieto połączenie.");
Console.Read();
}
private void openConnection(int port)
{
try {
listener = new TcpListener(IPAddress.Any, port);
listener.Start(); // Start nasłuchiwania
Console.WriteLine("Otwarto połączenie: ");
}catch (ArgumentNullException arg)
{
Console.WriteLine(arg);
}
catch (ArgumentOutOfRangeException arg)
{
Console.WriteLine(arg);
}
catch (ArgumentException arg)
{
Console.WriteLine(arg);
}
catch (SocketException arg)
{
Console.WriteLine(arg);
}
}
private bool check_Client_ID(int ID)
{
if (ID == 0 || ID > 10) return false;
else if (Client_ID.Contains(ID)) { Console.WriteLine("Jest juz taki ID w tablicy."); return false; }
else{
for(int i = 0; i < 10; i++)
{
if(Client_ID[i] == 0)
{
Client_ID[i] = ID;
break;
}
}
return true;
}
}
}