C# - TCP
- gorilino
- Nováček

-
- Registrován: 10. pro 2010
- Kontaktovat uživatele:
C# - TCP
Dobrý den ,
vytvořil jsem si klienta a server pro TCP komunikaci , a mam problem se zamrzanim obou aplikaci kdyz zahajuji spojeni ... Dále bych se chtěl zeptat jak mám na serveru vypsat obsah NetworkStreamu ... jak jej prevest do textoveho retezce . A poslední dotaz ... kdyz zmacknu tlacitko pro zapnuti serveru tak chci aby ihned vypsal do richtextboxu ze ceka na pripojeni klienta ... on se mi ten text ze ceka na pripojeni objevi az kdyz v klientske aplikaci zmacknu tlacitko pro pripojeni k serveru a pak obe aplikace zamrznou ....
Děkuji
Kod Klient:
private void button1_Click(object sender, EventArgs e)
{
try
{
TcpClient tcpklient = new TcpClient();
tcpklient.Connect("127.0.0.1", 2000);
if (tcpklient.Connected)
{
richTextBox1.Text = "Pripojen k serveru";
NetworkStream ns = tcpklient.GetStream();
while (ns.CanWrite)
{
a:
textBox1.Text = "Zadejte co chcete odeslat";
byte[] data = Encoding.ASCII.GetBytes(textBox1.Text);
ns.Write(data, 0, data.Length);
goto a;
}
}
}
catch (Exception vyjimka)
{
MessageBox.Show(vyjimka.Message);
}
}
Kod Server:
private void button1_Click(object sender, EventArgs e)
{
try
{
TcpListener tcpposlouchac = new TcpListener(2000);
tcpposlouchac.Start();
while (true)
{
richTextBox1.Text="Cekam na pripojeni klienta";
TcpClient tcpklient = tcpposlouchac.AcceptTcpClient();
if (tcpklient.Connected)
{
richTextBox1.Text += "\n Klient pripojen";
NetworkStream NS = tcpklient.GetStream();
byte[] zprava = new byte[1024];
// ZDe bych potreboval vypsat do richtextboxu obsah Network Streamu
}
}
}
catch (Exception chyba)
{
MessageBox.Show(chyba.Message);
}
}
vytvořil jsem si klienta a server pro TCP komunikaci , a mam problem se zamrzanim obou aplikaci kdyz zahajuji spojeni ... Dále bych se chtěl zeptat jak mám na serveru vypsat obsah NetworkStreamu ... jak jej prevest do textoveho retezce . A poslední dotaz ... kdyz zmacknu tlacitko pro zapnuti serveru tak chci aby ihned vypsal do richtextboxu ze ceka na pripojeni klienta ... on se mi ten text ze ceka na pripojeni objevi az kdyz v klientske aplikaci zmacknu tlacitko pro pripojeni k serveru a pak obe aplikace zamrznou ....
Děkuji
Kod Klient:
private void button1_Click(object sender, EventArgs e)
{
try
{
TcpClient tcpklient = new TcpClient();
tcpklient.Connect("127.0.0.1", 2000);
if (tcpklient.Connected)
{
richTextBox1.Text = "Pripojen k serveru";
NetworkStream ns = tcpklient.GetStream();
while (ns.CanWrite)
{
a:
textBox1.Text = "Zadejte co chcete odeslat";
byte[] data = Encoding.ASCII.GetBytes(textBox1.Text);
ns.Write(data, 0, data.Length);
goto a;
}
}
}
catch (Exception vyjimka)
{
MessageBox.Show(vyjimka.Message);
}
}
Kod Server:
private void button1_Click(object sender, EventArgs e)
{
try
{
TcpListener tcpposlouchac = new TcpListener(2000);
tcpposlouchac.Start();
while (true)
{
richTextBox1.Text="Cekam na pripojeni klienta";
TcpClient tcpklient = tcpposlouchac.AcceptTcpClient();
if (tcpklient.Connected)
{
richTextBox1.Text += "\n Klient pripojen";
NetworkStream NS = tcpklient.GetStream();
byte[] zprava = new byte[1024];
// ZDe bych potreboval vypsat do richtextboxu obsah Network Streamu
}
}
}
catch (Exception chyba)
{
MessageBox.Show(chyba.Message);
}
}
- OndraSter
- Středně pokročilý

- Registrován: 22. úno 2006
- Bydliště: Praha / ČVUT FIT
- Kontaktovat uživatele:
Re: C# - TCP
Musíš použít asynchronní volání těch socketových funkcí.
PC: i5-2500k 4.5GHz/24GB RAM/GTX560 Ti 1GB/>5TB - W7 Prof x64; Microsoft SideWinder X3 notebook: HP 6715b (4GB RAM) - W7 Prof x64;
mobil: Nokia Lumia 800 Cyan, 16GB; tablet: Toshiba Portege M200 (2GB, 64GB SSD, GeForce FX5200) - W7 Prof x32
Nahraďte Arduino výkonnější variantou!
Vývojová prostředí a nástroje | Webové prohlížeče | Seznam freehostingů
mobil: Nokia Lumia 800 Cyan, 16GB; tablet: Toshiba Portege M200 (2GB, 64GB SSD, GeForce FX5200) - W7 Prof x32
Nahraďte Arduino výkonnější variantou!
Vývojová prostředí a nástroje | Webové prohlížeče | Seznam freehostingů
- Maranov
- Mírně pokročilý

- Registrován: 21. črc 2006
Re: C# - TCP
Kód: Vybrat vše
a:
textBox1.Text = "Zadejte co chcete odeslat";
byte[] data = Encoding.ASCII.GetBytes(textBox1.Text);
ns.Write(data, 0, data.Length);
goto a;a) goto patří do Assembleru, ne do vyšších jazyků; nepoužívej
b) neustále ti to cyklí a odesílá "Zadejte co chcete odeslat"; to bude asi ten problém
Máš tam pár nepotřebných věcí, co se týče zaseknutí GUI, neškodilo by komunikaci pustit v odděleném WorkerThread. Server kvůli tomu není konkurentní, takže více klientů neobslouží, možná má problém i s oním jedním klientem, který odesílá moc rychle.
Na MSDN jsou pěkné ukázky, ze kterých můžeš vyjít a obsahují i opačnou konverzi pro odeslaný řetězec:
http://msdn.microsoft.com/en-us/library ... aspx#Y2160
http://msdn.microsoft.com/en-us/library ... S.71).aspx
DESKTOP: C2D E8200 (pasivně); ATI HD 3870 (AC S1, 120 fan@5V); 4GB RAM; OCZ Vertex2 SSD 64GB; 320+320+250GB JBOD (odhlučněno); 2x FSC P19-2 (2056x1024)
MOBILE: Lenovo Thinkpad T420 4177 CTR, Crucial M4 SSD 128GB, 6GB RAM; FSC P19-2; Logitech G400
POCKET: Nokia Hulmia 800; Hitachi 500GB@Scythe Kamazo 2 (eSATA); Creative EP-630
AUDIO: Sennheiser HD 555 (foam mod), NuForce Icon µDAC, FLAC, ReplayGain, f2k
"A Man's mortality is a compass that points his way in life."
MOBILE: Lenovo Thinkpad T420 4177 CTR, Crucial M4 SSD 128GB, 6GB RAM; FSC P19-2; Logitech G400
POCKET: Nokia Hulmia 800; Hitachi 500GB@Scythe Kamazo 2 (eSATA); Creative EP-630
AUDIO: Sennheiser HD 555 (foam mod), NuForce Icon µDAC, FLAC, ReplayGain, f2k
"A Man's mortality is a compass that points his way in life."
- gorilino
- Nováček

-
- Registrován: 10. pro 2010
- Kontaktovat uživatele:
Re: C# - TCP
Naposledy upravil(a) gorilino dne ned 14. srp 2011, 11:33, celkem upraveno 1 x.
- OndraSter
- Středně pokročilý

- Registrován: 22. úno 2006
- Bydliště: Praha / ČVUT FIT
- Kontaktovat uživatele:
Re: C# - TCP
Aha, tak samotný TcpClient zřejmě nemá asynchronní verzi (asynchronní = vytvoří si další thread pro připojování, pro přijímání dat atd). Tu má jenom Socket s BeginConnect, BeginReceive, BeginSend atd.
Anebo, jak Maranov říká, použít BackgroundWorker.
Anebo, jak Maranov říká, použít BackgroundWorker.
PC: i5-2500k 4.5GHz/24GB RAM/GTX560 Ti 1GB/>5TB - W7 Prof x64; Microsoft SideWinder X3 notebook: HP 6715b (4GB RAM) - W7 Prof x64;
mobil: Nokia Lumia 800 Cyan, 16GB; tablet: Toshiba Portege M200 (2GB, 64GB SSD, GeForce FX5200) - W7 Prof x32
Nahraďte Arduino výkonnější variantou!
Vývojová prostředí a nástroje | Webové prohlížeče | Seznam freehostingů
mobil: Nokia Lumia 800 Cyan, 16GB; tablet: Toshiba Portege M200 (2GB, 64GB SSD, GeForce FX5200) - W7 Prof x32
Nahraďte Arduino výkonnější variantou!
Vývojová prostředí a nástroje | Webové prohlížeče | Seznam freehostingů
- gorilino
- Nováček

-
- Registrován: 10. pro 2010
- Kontaktovat uživatele:
Re: C# - TCP
V jednom ukazkovem kodu bylo toto .... nechapu to pouziti celociselne promenne b ... dokazete mi nekdo vysvetlit?
NetworkStream NS = tcpklient.GetStream();
StringBuilder SB = new StringBuilder();
byte[] zprava = new byte[1024];
int b = 0;
do
{
b = NS.Read(zprava, 0, zprava.Length);
SB.AppendFormat(Encoding.ASCII.GetString(zprava, 0, b));
}
while (NS.DataAvailable);
richTextBox1.Text = SB;
NetworkStream NS = tcpklient.GetStream();
StringBuilder SB = new StringBuilder();
byte[] zprava = new byte[1024];
int b = 0;
do
{
b = NS.Read(zprava, 0, zprava.Length);
SB.AppendFormat(Encoding.ASCII.GetString(zprava, 0, b));
}
while (NS.DataAvailable);
richTextBox1.Text = SB;
- Maranov
- Mírně pokročilý

- Registrován: 21. črc 2006
Re: C# - TCP
Udává to skutečnou délku té přečtené zprávy. Buffer má 1024B, zpravidla ale nemusí být vždy naplněný celý, proto z něj čteš jen tu krátkou zprávu.
BTW používej tag[/code], fórum ničí odsazení.
BTW používej tag
Kód: Vybrat vše
[code]DESKTOP: C2D E8200 (pasivně); ATI HD 3870 (AC S1, 120 fan@5V); 4GB RAM; OCZ Vertex2 SSD 64GB; 320+320+250GB JBOD (odhlučněno); 2x FSC P19-2 (2056x1024)
MOBILE: Lenovo Thinkpad T420 4177 CTR, Crucial M4 SSD 128GB, 6GB RAM; FSC P19-2; Logitech G400
POCKET: Nokia Hulmia 800; Hitachi 500GB@Scythe Kamazo 2 (eSATA); Creative EP-630
AUDIO: Sennheiser HD 555 (foam mod), NuForce Icon µDAC, FLAC, ReplayGain, f2k
"A Man's mortality is a compass that points his way in life."
MOBILE: Lenovo Thinkpad T420 4177 CTR, Crucial M4 SSD 128GB, 6GB RAM; FSC P19-2; Logitech G400
POCKET: Nokia Hulmia 800; Hitachi 500GB@Scythe Kamazo 2 (eSATA); Creative EP-630
AUDIO: Sennheiser HD 555 (foam mod), NuForce Icon µDAC, FLAC, ReplayGain, f2k
"A Man's mortality is a compass that points his way in life."
- gorilino
- Nováček

-
- Registrován: 10. pro 2010
- Kontaktovat uživatele:
Re: C# - TCP
a kdyz to presahne velikost 1024 tak to hodi chybu? nejaky overflow exception? a ten buffer ... pokud to dobre chapu slouzi pro ukladani prenesenych dat? jako ze se mi odesilaji nejaka data a ty se pekne byte po bytu ukladaji do bufferu ? a kdyz posle dalsi zpravu tak se ten buffer vymaze nebo se do nej ukladaji data ty zpravy za sebou?
tomuhle moc nerozumim tak mozna mluvim blbosti
- Maranov
- Mírně pokročilý

- Registrován: 21. črc 2006
Re: C# - TCP
Ne, proto je tam ten while, čte to po 1024B dlouhých kouscích v cyklu. Ukládá se to za sebou.
V C# jsem tohle ještě nedělal, tak jsem si to taky zkusil...
Jednosměrná komunikace od klienta k serveru.
Můžeš vycházet z tohohle. Všimni si vytvoření Thread po přijetí připojení - server je tzv. konkurentní a může obsluhovat více připojení zároveň, takže když se jeden klient připojí, neblokuje spojení pro ostatní, vždy se vytvoří TcpClient a ten se obsluhuje v té metodě paralelně.
Ukázka, jak to funguje se třemi klienty (jeden postupně odesílá čísla 0-99, další 100-199, třetí 200-299): V případě GUI aplikace ještě máš problém (na který jsi narazil), že Accept*() ti zablokuje thread a čeká. Proto aplikace zatuhne a nereaguje. Proto ho musíš spustit buď zmíněnými asynchronními metodami:
http://msdn.microsoft.com/en-us/library ... lient.aspx
nebo v druhém threadu, podobně jak je řešená konkurence.
Otázka je, co na to nemožnost upravovat vlastnosti TextBox a dalších prvků z jiného threadu... okenní aplikace jsou pro začátečníka celkem zátěž...
V C# jsem tohle ještě nedělal, tak jsem si to taky zkusil...
Ukázka, jak to funguje se třemi klienty (jeden postupně odesílá čísla 0-99, další 100-199, třetí 200-299): V případě GUI aplikace ještě máš problém (na který jsi narazil), že Accept*() ti zablokuje thread a čeká. Proto aplikace zatuhne a nereaguje. Proto ho musíš spustit buď zmíněnými asynchronními metodami:
http://msdn.microsoft.com/en-us/library ... lient.aspx
nebo v druhém threadu, podobně jak je řešená konkurence.
Otázka je, co na to nemožnost upravovat vlastnosti TextBox a dalších prvků z jiného threadu... okenní aplikace jsou pro začátečníka celkem zátěž...
Nemáte oprávnění prohlížet přiložené soubory.
DESKTOP: C2D E8200 (pasivně); ATI HD 3870 (AC S1, 120 fan@5V); 4GB RAM; OCZ Vertex2 SSD 64GB; 320+320+250GB JBOD (odhlučněno); 2x FSC P19-2 (2056x1024)
MOBILE: Lenovo Thinkpad T420 4177 CTR, Crucial M4 SSD 128GB, 6GB RAM; FSC P19-2; Logitech G400
POCKET: Nokia Hulmia 800; Hitachi 500GB@Scythe Kamazo 2 (eSATA); Creative EP-630
AUDIO: Sennheiser HD 555 (foam mod), NuForce Icon µDAC, FLAC, ReplayGain, f2k
"A Man's mortality is a compass that points his way in life."
MOBILE: Lenovo Thinkpad T420 4177 CTR, Crucial M4 SSD 128GB, 6GB RAM; FSC P19-2; Logitech G400
POCKET: Nokia Hulmia 800; Hitachi 500GB@Scythe Kamazo 2 (eSATA); Creative EP-630
AUDIO: Sennheiser HD 555 (foam mod), NuForce Icon µDAC, FLAC, ReplayGain, f2k
"A Man's mortality is a compass that points his way in life."
- gorilino
- Nováček

-
- Registrován: 10. pro 2010
- Kontaktovat uživatele:
Re: C# - TCP
Děkuji mockrát za ukázku . Jeste kdyz tam je server.Start() ... a pote je podminka while (true ) ... to znamena dokud je listener v naslouchacim modu? a jak pak vypnu naslouchaci mod? zavrenim listeneru (server.Close() )?
- Maranov
- Mírně pokročilý

- Registrován: 21. črc 2006
Re: C# - TCP
Start() začne naslouchat a požadavky na připojení se začnou řadit do fronty. Při každém zavolání Accept*() je pak navázáno spojení s tím požadavkem, co je zrovna na řadě, ostatní čekají.
Proto je lepší zadat samotnou komunikaci (která funguje na jiném, automaticky přiřazeném socketu a portu) zadat jinému threadu a přijmout hned další požadavek (v onom cyklu while(true)), jinak klientům může vypršet timeout a musí se pokusit o připojení znovu.
Close() přestane zařazovat požadavky a žádné nové spojení tak nevznikne. Takže ano, přestaneš tím naslouchat.
Proto je lepší zadat samotnou komunikaci (která funguje na jiném, automaticky přiřazeném socketu a portu) zadat jinému threadu a přijmout hned další požadavek (v onom cyklu while(true)), jinak klientům může vypršet timeout a musí se pokusit o připojení znovu.
Close() přestane zařazovat požadavky a žádné nové spojení tak nevznikne. Takže ano, přestaneš tím naslouchat.
DESKTOP: C2D E8200 (pasivně); ATI HD 3870 (AC S1, 120 fan@5V); 4GB RAM; OCZ Vertex2 SSD 64GB; 320+320+250GB JBOD (odhlučněno); 2x FSC P19-2 (2056x1024)
MOBILE: Lenovo Thinkpad T420 4177 CTR, Crucial M4 SSD 128GB, 6GB RAM; FSC P19-2; Logitech G400
POCKET: Nokia Hulmia 800; Hitachi 500GB@Scythe Kamazo 2 (eSATA); Creative EP-630
AUDIO: Sennheiser HD 555 (foam mod), NuForce Icon µDAC, FLAC, ReplayGain, f2k
"A Man's mortality is a compass that points his way in life."
MOBILE: Lenovo Thinkpad T420 4177 CTR, Crucial M4 SSD 128GB, 6GB RAM; FSC P19-2; Logitech G400
POCKET: Nokia Hulmia 800; Hitachi 500GB@Scythe Kamazo 2 (eSATA); Creative EP-630
AUDIO: Sennheiser HD 555 (foam mod), NuForce Icon µDAC, FLAC, ReplayGain, f2k
"A Man's mortality is a compass that points his way in life."
- gorilino
- Nováček

-
- Registrován: 10. pro 2010
- Kontaktovat uživatele:
Re: C# - TCP
takze tato cast kodu dokaze obsluhovat vice klientu v jednom case ? pro kazdeho vytvori spojeni a sve vlastni vlakno? Nechapu totiz jak muze byt vice vlaken a spojeni se stejnym nazvem .. je mozne treba kdyby se pripojili tri klienti abych mel tri tcpklienty a tri vlakna se stejnym nazvem?
Omlouvam se za me blbe dotazy
ale v tomhle jsem trochu nechapavy a rad bych to pochopil
Omlouvam se za me blbe dotazy
Kód: Vybrat vše
while (true)
{
TcpClient connection = server.AcceptTcpClient();
Thread worker = new Thread(new ParameterizedThreadStart(ReadMessage));
worker.Start(connection);
}
- Maranov
- Mírně pokročilý

- Registrován: 21. črc 2006
Re: C# - TCP
Ty vlákna mají jiné ID. Ta hodnota ve worker se vždycky přepíše informacemi o novém vlákně, vlákno samotné si však žije vlastním životem, tu referenci de facto potřebuješ jen na nějaké operace s tím vláknem (třeba zde jeho spuštění pomocí Start(...)).
Každým zavoláním (dokončením zavolání) vzniká nové spojení, které funguje na novém socketu, má vlastní čísla portů apod. Pokud se nemýlím, vzniklá spojení budou stále otevřená, i když zavřeš TcpListener.
Každým zavoláním (dokončením zavolání) vzniká nové spojení, které funguje na novém socketu, má vlastní čísla portů apod. Pokud se nemýlím, vzniklá spojení budou stále otevřená, i když zavřeš TcpListener.
DESKTOP: C2D E8200 (pasivně); ATI HD 3870 (AC S1, 120 fan@5V); 4GB RAM; OCZ Vertex2 SSD 64GB; 320+320+250GB JBOD (odhlučněno); 2x FSC P19-2 (2056x1024)
MOBILE: Lenovo Thinkpad T420 4177 CTR, Crucial M4 SSD 128GB, 6GB RAM; FSC P19-2; Logitech G400
POCKET: Nokia Hulmia 800; Hitachi 500GB@Scythe Kamazo 2 (eSATA); Creative EP-630
AUDIO: Sennheiser HD 555 (foam mod), NuForce Icon µDAC, FLAC, ReplayGain, f2k
"A Man's mortality is a compass that points his way in life."
MOBILE: Lenovo Thinkpad T420 4177 CTR, Crucial M4 SSD 128GB, 6GB RAM; FSC P19-2; Logitech G400
POCKET: Nokia Hulmia 800; Hitachi 500GB@Scythe Kamazo 2 (eSATA); Creative EP-630
AUDIO: Sennheiser HD 555 (foam mod), NuForce Icon µDAC, FLAC, ReplayGain, f2k
"A Man's mortality is a compass that points his way in life."