Du solltest die Verbindung offen halten. Der Overhead für das Betriebssystem ist nicht nennbar. Vermutlich sogar größer wenn du immer wieder eine neue öffnest. Es ist auch nicht zwingend notwendig einen Heartbeat mitzuschicken. Im Zweifel kann es passieren, dass du erst bei der Verwendung der Verbindung mitbekommst, dass die Verbindung nicht mehr steht. Hier musst du wissen, ob das ein Problem für dich ist.
Es ist auch kein Problem eine Verbindung länger offen zu halten. Einige interne Serversysteme halten monatelange Verbindungen (z.B. zwei
MySQL Server). Na und? Dafür gewinnst du beim Schicken von Anfragen deutlich an Zeit.
Ich weiß nicht, ob es überhaupt funktioniert wenn beide Clients die Verbindung schließen. Einer wird vermutlich schneller sein und der andere kann eine geschlossene Verbindung nicht erneut schließen. Leg es protokollbedingt fest, wer die Verbindung zu schließen hat. Wenn dein Server offene Verbindungen unterstützt, dann lass den Client entscheiden, wann er disconnected. Wenn dein Protokoll vorsieht, dass nach einer Anfrage die Verbindung geschlossen wird, dann entscheide dich von wem, dokumentiere es und setze es so um.
Wichtig ist aber, dass entsprechend darauf eingegangen wird, was beispielsweise passiert wenn das Protokoll festlegt, dass die Verbindung geschlossen werden soll, dies jedoch nicht passiert. Eine weitere Anfrage über
TCP zu senden wäre dann nicht gemäß der Spezifikation.