Tcp Server   zodpovězená otázka

C#

Dobrý den,

chtěl bych se zeptat jak udělat TCP server ke kterému se může připojit více klientů. V seriálů na vbnet jsem našel komunikaci Server-Client pomocí asynchronní komunikace.

tcpListener = new TcpListener(IPAddress.Any, 3560);
tcpListener.Start();
tcpListener.BeginAcceptTcpClient(new AsyncCallback(ClientConnecting), tcpListener);


private void ClientConnecting(IAsyncResult ar)
{
  tcpClient = tcpListener.EndAcceptTcpClient(ar);
}

Toto je mě celkem jasné. Taky tuším že po připojení klienta nezastavím poslouchání a asi spustím znova tcpListener.BeginAcceptTcpClient() , ale netusím jak a kde vytvořit novou instanci tcpClient pro dalšího klienta a jak pak tyto instance spravovat případně odeslat data na všechny klienty.

Děkuji za radu

Tom

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jednoduše zavoláte znovu BeginAccpetTcpClient na konci metody ClientConnecting.

Dejte si ale pozor na případný vznik vyjímky uvnitř této metody, který by mohl zapříčinit, že se BeginAccpetTcpClient znovu nezavolá. Například:

private void ClientConnecting(IAsyncResult ar)
{
  try {
     tcpClient = tcpListener.EndAcceptTcpClient(ar);
     // další inicializační kód nového klienta
  } catch { 
     // zpracování vyjímky
  } finally {
     tcpListener.BeginAcceptTcpClient(new AsyncCallback(ClientConnecting), tcpListener);
  }
}

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

A jak pak přistupuji k jednotlivím tpcClientům ?

Pro jednoho klienta je to jasné

tcpClient = tcpListener.EndAcceptTcpClient(ar);
networkStream = tcpClient.GetStream()

public void zapis(string data)
{
   networkStream.Write(data)
}

ale pokud BeginAcceptTcpClient zavolám znova tak si předchozí tcpClient musím nějak uložit? A pak k němu přistupovat.

V c# jsem skoro začátečník takže se omlouvám pokud je to něco triviálního :)

Dik

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Metoda EndAcceptTcpClient vrací příslušného klienta. Tyto klienty můžete vkládat do nějaké kolekce a s tou následně pracujte. Při odpojení jej zase odeberte. Jen nesmíte zapomenout na synchronizaci, aby se do kolekce nepřistupovalo z více vláken najednou, což je pravděpodobné (asynchronní přijímání nových klientů).

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Toto je příliš low-level. Doporučuji vám nastudovat WCF, které má neuvěřitelné možnosti.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Vždyť nevíme, co přesně tazatel potřebuje. WCF není univerzální kladivo na vše a pro začátečníky se to nehodí.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

WCF je zase proti tomu příliš high-level. A začátečníci by se měli nejprve naučit elementárnější záležitosti. A zrovna na TcpListener se dají naučit krásně učebnicové základy ošetřování výjimek, asynchronní programování, práce s objekty a řada dalších problémů a technik. WCF není rozhodně pro někoho, kdo se učí programovat.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Co přesně má aplikace dělat, respektive k čemu má sloužit TCP komunikace?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zatím se to jen učím a tak si zkouším udělat pomocí příkladu o TCP chat pro více uživatelů. Dival jsem se na WCF vubec se nechytám takže zatim zůstanu u Low-levelu :)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pokud si to chcete vyzkoušet a naučit se s tím pracovat, pak je to vhodná volba. Ovšem u skutečných aplikací je využití čistého socketu ve většině případů nesmysl, protože tam je potřeba zaměřit se na samotnou funkčnost aplikace a zabývat se věcmi jako je low-level komunikace je ztráta času. Zde přichází ke slovu WCF.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback