Programim dhe zhvillim, javascript, python, php, html

Problemi i dërgimit/mbylljes së TcpClient

A duhet të mbyll lidhjen që të dërgohen mesazhe? Sepse pavarësisht nëse përdor komandën e dërgimit ose përdor një transmetim rrjeti, mesazhet e mia nuk përpunohen derisa të mbyll lidhjen. A është kështu duhet të jetë apo po më mungon diçka?

Në rregull, këtu është kodi.

private void connectButton_Click(object sender, EventArgs e)
{
   try
   {
      client = new TcpClient();
      client.Connect(ip, port);
      netStream = client.GetStream();
   }
   catch (Exception ex)
   {
      MessageBox.Show(ex.Message);
   }
}

private void disconnectButton_Click(object sender, EventArgs e)
{
   if (client != null)
   {
      if (client.Connected)
      {
         client.Close();
         client = null;
      }
   }
}

private void sendButton_Click(object sender, EventArgs e)
{
   byte[] cmd = ToByteArray("bla bla bla");
   netStream.Write(cmd, 0, cmd.Length);
   netStream.Flush();
}

Nuk mendoj se ka të bëjë me këtë metodë, por hidhini një sy.

public static byte[] ToByteArray(string str)
{
   System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
   return encoding.GetBytes(str);
}
04.02.2011

  • cilat klasa po përdorni? + Ngjitni një shembull kodi. 04.02.2011
  • i gjithë kodi juaj na përkasin neve. 04.02.2011
  • Si duket ToByteArray? 04.02.2011
  • Vetëm një shënim anësor që nuk lidhet me problemin tuaj, por sipas MSDN: Duhet të mbyllni NetworkStream kur jeni duke dërguar dhe marrë të dhëna. Mbyllja e TcpClient nuk lëshon Rrjedhën e Rrjetit. msdn.microsoft.com/en-us/ biblioteka/ 04.02.2011
  • Thx Chris, do ta kem parasysh. 04.02.2011
  • Djema ndoshta është një problem në lidhje me softuerin që dëgjon këtë port. Nuk dua t'i marr kohën askujt pa asnjë arsye. Thx të gjitha. 04.02.2011
  • @joshua - Po, mendoj se mund të jetë ana tjetër, kjo pjesë më duket mirë. 04.02.2011
  • Unë gjithashtu mendoj se është kodi që dëgjon në anën tjetër. Nëse ai kod po bën diçka si ReadToEnd, ai do të varet derisa dërguesi të mbyllë rrjedhën e tij të daljes. 04.02.2011

Përgjigjet:


1

me siguri po përdorni transmetime të buferuara, provoni të telefononi metodën .Flush, e cila gjithashtu thirret automatikisht kur thirret clode.

04.02.2011
  • Hmm duket sikur kam një problem me NetworkStream këtu siç thatë ju. Flush nuk funksionon, por mbyll/dispon funksionon. Tani më duhet të kuptoj pse. 04.02.2011

  • 2

    Jo; ato do të dërgohen, ndoshta pas një vonese prej 200 ms.

    Duhet të ketë diçka tjetër që nuk shkon.

    04.02.2011
  • Kam përdorur opsionin NoDelay. Nuk bëri dallim. 04.02.2011
  • NoDelay nuk duhet të përdoret kurrë. Prandaj përfundimi im se duhet të ketë diçka tjetër që nuk shkon. 04.02.2011

  • 3

    Nëse jeni duke bllokuar lidhjen kryesore nga ekzekutimi pasi ju Shkruaj, kjo mund të parandalojë funksionimin e pompës së mesazheve dhe mos dërgimin e të dhënave tuaja. Pra, nëse lëshoni fillin kryesor (mbyllni rrjedhën tuaj të të dhënave), mund të duket sikur po e rregullon atë, por në të vërtetë është lëshimi i fillit kryesor që lejon që të dhënat të përpunohen dhe shkruhen.

    Nëse dëshironi të bllokoni që të dhënat të shkruhen, sigurohuni që të përdorni Filloni Shkruani si kjo:

    void clientThread()
    {
       writeStream.BeginWrite(buffer, 0, buffer.Length, myCallback, networkStream);
       resetEvent.WaitOne(timeout);
    }
    void myCallback(IAsyncResult ar)
    {
       NetworkStream myNetworkStream = (NetworkStream)ar.AsyncState;
       myNetworkStream.EndWrite(ar);
       resetEvent.Set();
    }
    
    04.02.2011
  • @joshua - Nuk ka problem, nëse poston ndonjë kod, ne mund të jemi në gjendje të ndihmojmë më shumë. 04.02.2011

  • 4

    Duket sikur algoritmi i Nagle është në veprim. Provoni të aktivizoni opsionin e prizës NoDelay duke përdorur SetSocketOption. Por kini kujdes, çaktivizimi i algoritmit të Nagle do të ulë xhiros.

    15.02.2011
    Materiale të reja

    Masterclass Coroutines: Kapitulli-3: Anulimi i korutinave dhe trajtimi i përjashtimeve.
    Mirë se vini në udhëzuesin gjithëpërfshirës mbi Kotlin Coroutines! Në këtë seri artikujsh, unë do t'ju çoj në një udhëtim magjepsës, duke filluar nga bazat dhe gradualisht duke u thelluar në..

    Faketojeni derisa ta arrini me të dhënat false
    A e gjeni ndonjëherë veten duke ndërtuar një aplikacion të ri dhe keni nevojë për të dhëna testimi që duken dhe duken më realiste ose një grup i madh të dhënash për performancën e ngarkesës...

    Si të përdorni kërkesën API në Python
    Kërkesë API në GitHub për të marrë depot e përdoruesve duke përdorur Python. Në këtë artikull, unë shpjegoj procesin hap pas hapi për të trajtuar një kërkesë API për të marrë të dhëna nga..

    Një udhëzues hap pas hapi për të zotëruar React
    Në këtë artikull, do të mësoni se si të krijoni aplikacionin React, do të mësoni se si funksionon React dhe konceptet thelbësore që duhet të dini për të ndërtuar aplikacione React. Learning..

    AI dhe Psikologjia — Pjesa 2
    Në pjesën 2 të serisë sonë të AI dhe Psikologji ne diskutojmë se si makineritë mbledhin dhe përpunojnë të dhëna për të mësuar emocione dhe ndjenja të ndryshme në mendjen e njeriut, duke ndihmuar..

    Esencialet e punës ditore të kodit tim VS
    Shtesat e mia të preferuara - Git Graph 💹 Kjo shtesë është vërtet e mahnitshme, e përdor përpara se të filloj të punoj për të kontrolluar dy herë ndryshimet dhe degët më të fundit, mund të..

    Pse Python? Zbulimi i fuqisë së gjithanshme të një gjiganti programues
    Në peizazhin gjithnjë në zhvillim të gjuhëve të programimit, Python është shfaqur si një forcë dominuese. Rritja e tij meteorike nuk është rastësi. Joshja e Python qëndron në thjeshtësinë,..