Diskuze: TCP server
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 9 zpráv z 9.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Mělo by to jít takhle (nezkoušel jsem):
CLIENT:
TcpClient client = new TcpClient();
client.Connect(ip, 9999); // ip serveru, port
NetworkStream stream = client.GetStream();
while (true) // Nebo dokud nebudes chtit zavrit komunikaci
{
string response = String.Empty;
byte[] Cdata = new byte[256];
int bytes = stream.Read(Cdata, 0, Cdata.Length); // Tady mas data
response = Encoding.ASCII.GetString(Cdata, 0, bytes); // Kdybys posilal treba text, takhle to hodis do stringu
Console.WriteLine("Received string: " + response);
}
stream.Close(); // Odpojeni klienta
client.Close();
SERVER:
TcpListener server = new TcpListener(IPAddress.Parse(ip), 9999); //ip = IP adresa serveru, 9999 je port
server.Start();
TcpClient myClient = server.AcceptTcpClient();
NetworkStream myStream = myClient.GetStream();
while (true) // Dokud budes neco posilat
{
byte[] msg = System.Text.Encoding.ASCII.GetBytes("data"); // Data co budes posilat. Budto byte[], nebo muzes posilat string
myStream.Write(msg, 0, msg.Length);
}
// Vypni server (nebo skoc na zacatek a cekej na dalsiho klienta)
myClient.Close();
Ahoj,
nie, tak ako pises to nepojde. Neviem z uvedeneho zistit ci sa pocas komunikacie
odpojil alebo nie. Ak by som pouzil read ktory by to cital, zablokoval by som
cely cyklus...
Write na serveri myStream.Write(msg, 0, msg.Length); nezneguje
while(true)...
Tak to asi budeš asi muset udělat tak, že
nebo
Posílání zpráv serveru: [CLIENT]
byte[] data = Encoding.ASCII.GetBytes("Jsem online");
stream.Write(data, 0, data.Length);
Přijímání zpráv od clienta: [SERVER]
string zprava;
byte data = new byte[256];
while ((i = myStream.Read(data, 0, data.Length)) != 0)
{
zprava = System.Text.Encoding.ASCII.GetString(data, 0, i);
Console.WriteLine("Received string: " + zprava);
}
Nemozem ovplyvnit klientsku aplikaciu. Ta je dana.
Klient sa pripoji a caka na data ktore mu server posle. Ked mu nieco posle,
spracuje ich a caka na dalsie alebo ak mu stacia tak zatvori spojenie (read
vrati 0). Read nemozem vracat lebo je to blocking funkcia.
Nerozumím, proč mluvíš o Read, když klienta nemůžeš ovlivnit. Myslíš tím tedy volání Write na serveru (protože podle toho, co píšeš, tak server jen zapisuje a klient jen čte)?
Mělo by být možné nastavit na Write nějaký timeout, který když vyprší, funkce vrátí nějakou hodnotu nebo vyhodí výjimku. Stejně musíš řešit případy, kdy spojení spadne "samo od sebe".
Klienta nemozem ovplyvnit, ten je dany.
Klient sa pripoji na Server a caka na data. Server mu ich posle a ma
skontrolovat, ci je klient stale pripojeny. Ak nie, server ukonci cyklus a caka
na nove spojenie.
Read som pouzival pretoze cez neho viem zistit, ci je velkost prijatych dat
<1. V tom pripade viem, ze klient sa odpojil.
Podle tohoto
https://msdn.microsoft.com/…vs.110).aspx
nastavíš vlastnost SendTimeout instance TcpClient, kteoru dostaneš z acceptu, na nějakou rozumnou hodnotu (třeba pět vteřin = 5000). Pokud se volání Write zablokuje na delší dobu, vyhodí výjimku SocketException. Tím se zároveň dozvíš, že klient se pravděpodobně odpojil (ať už chtěl, nebo prostě spadlo připojení).
Další relativně jednoduchá kontrola je, že se pokusíš zapsat nic do toho streamu... Nevím, jak moc je to správné řešení, ale funguje to dobře. Hlavně jde o to, že tím nic neovlivníš...
try
{
client.GetStream().Write(new byte[] { }, 0, 0);
}
catch
{
// Stream je uzavřený a klient odpojený
}
Zobrazeno 9 zpráv z 9.