Skicka data mellan två program via nätverket?

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
DanG
Inlägg: 151
Blev medlem: 30 januari 2013, 10:22:32

Re: Skicka data mellan två program via nätverket?

Inlägg av DanG »

Pajn :"Det kan även vara bra att sända en heartbeat lite då och då för att ..."

Heart beat krävs också om Din(a) sessioner går genom en brandvägg. Även om Du öppnat för trafiken kommer brandväggen, i de flesta uppsättningar, att stänga sessionen(erna) efter 1 timmes tystnad. (3600sek, parameteriserbart).

Om inte denna funktion fanns, skulle FWs minne förr eller senare fyllas upp av "döda sessioner".

M.v.h DanG

Edit: Stafningen ...
Användarvisningsbild
JimmyAndersson
Inlägg: 26578
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Re: Skicka data mellan två program via nätverket?

Inlägg av JimmyAndersson »

Pajn:
"Om det inte rör sig om för många maskiner som ska hämta data skulle jag troligtvis
skapat en TCP server som skapar en ny tråd för vare anslutning (mycket lätt i Python)."


Skulle du kunna visa ett kodexempel?
Jag fastnar hela tiden och känner mig väldigt vilse rent allmänt med min kod nu.
Eventuellt får plan B bli att leta efter en färdig burk som klarar det jag behöver.
Användarvisningsbild
SeniorLemuren
Inlägg: 8424
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: Skicka data mellan två program via nätverket?

Inlägg av SeniorLemuren »

Vet inte om jag förstått problemet fullt ut, men för väldigt många år sedan hade vi 5 st datorer i familjen som var kopplade i ett enkelt hemmanät. Jag gjorde för skoj skull ett internt postsystem där vi kunde skicka post till varandra.

Det var väldigt basic. Varje burk fick en mapp (brevlåda) Man skrev en textfil vars filnamn byggdes av namnet på mottagaren samt datum och klockslag. denna textfil sparades sedan i den brevlådemapp på hårddisken man ville skicka post till. (I själva verket 2 filer. En txt-fil med headerinfo och en RFT-fil med själva meddelandet.)

Ett annat program pollade alltid i bakgrunden om post inkommit och meddelade mottagaren. När filen lästs klickade man på arkivera eller ta bort och filen flyttades ut från brevlådemappen. Var mottagarens dator inte påslagen och brevet inte kunde postas fick man ett meddelandet om detta.

Bifogar proceduren som skickade brevet. Visserligen skrivet i Pascal, men det kanske går att se själva idén.

Kod: Markera allt

procedure TWriteForm.SendButtonClick(Sender: TObject);
  begin
     Klockslag:=TimeToStr(Time);
     while Pos(':',Klockslag) > 0 do
     Klockslag[Pos(':',Klockslag)] := ' ';
    {skapa filnamn}
    Enhet:=OrvarForm.ValdPath[1];
    ProgramMapp:=Copy(OrvarForm.ValdPath,4,Length(OrvarForm.ValdPath)-3);
    Mottagare:='\\'+AdressForm.MottagareCombo.text+'\'+Enhet+'\'+ProgramMapp+'\Orvar\Brevlådan\';
    TxtFilNamn:=AdressForm.FromName.text+' '+AdressForm.SubjectEdit.text+' '+AdressForm.FromDator.text;
    try
    AdressForm.AdressListBox.Items.SaveToFile(Mottagare+TxtFilNamn+' '+DateToStr(Date)+' '+Klockslag+'.Txt');
    WEdit.Lines.SaveToFile(Mottagare+TxtFilNamn+' '+DateToStr(Date)+' '+Klockslag+'.Rtf');
    except
      showmessage('det är ingen påloggad just nu');
    end;
  end;
Edit: lade till bild på brevbäraren. :)
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
JimmyAndersson
Inlägg: 26578
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Re: Skicka data mellan två program via nätverket?

Inlägg av JimmyAndersson »

Kul idé! :)

Det gav en del idéer som kanske skulle gå om jag måste ge upp den nuvarande lösningen.
Hur gjorde du pollningen?



I mitt projekt så kommer det då och då (vi pratar timmars mellanrum) in data
på serieporten på en server som kör Linux.

När det händer så vill jag att övriga datorer (med Windows XP) i nätverket ska får reda på det.
De behöver då även få lite data från servern.

Från det att datan kommer in på servern serieport
och till det att de övriga datorerna får reda på det
så vill jag förstås ha så kort fördröjning som möjligt.
1 sekund är okej. Men inte mer än 3-4 sek fördröjning.

Så i den här tråden sökte jag efter det som ska skicka datan från servern och till klienterna (dvs de övriga datorerna).



Jag fastnade för Pajn's förslag att använda Python och (TCP) "socket",
men dessvärre har jag nu fastnat på ett annat sätt: Jag kommer inte vidare.
Det nuvarande problemet beskrivs i grann-tråden Python: Avsluta socket anslutning snyggt? (Nu med fråga 2).

Men jag känner även att jag är lite ovan med själva trådningen
och att det eventuellt kan vara nästa hinder på vägen.





Tyvärr verkar det som att de som först ger korta förslag sedan är spårlöst borta.
(Det är absolut inte specifikt för just den här tråden eller mina frågor.)
Lite synd, för det är så kul när man får ta del av andras erfarenheter och
diskutera olika lösningar på ett lite längre perspektiv.


Så jag har lite i bakhuvudet börjat fundera över "hur gör jag annars?"
Dvs vad gör jag om jag tvingas lägga ner tanken på Python till detta.
Jag vet att det finns små moduler med en serieport i ena änden
och en nätverksport i andra. Men någonstans behöver jag då ändå
baka in lite mer kontroll innan datan når Windows-datorerna.

(Jag har visserligen en PIC-krets som levererar datan till serieporten,
men att låta ett gäng Windows-datorer styra detta blir för trassligt...)


Så för tillfället har jag ingen färdig idé över hur 17 ska ska genomföra detta projekt.
Men jag känner helt klart att jag skulle vilja få ordning på Python-varianten.
Jag skulle ha stor nytta av att kunna det, även till andra projekt.

Jag får nog avgöra det i morgon, för det verkar inte bli så mycket mer aktivitet i den här kategorin idag.
Jag hoppas inte att det beror på att medlemmar undrar över något och sedan låter bli att fråga mig. :)
janno
Inlägg: 434
Blev medlem: 11 oktober 2009, 07:34:45
Ort: Västerås

Re: Skicka data mellan två program via nätverket?

Inlägg av janno »

Jag har gjort så här.
PIC skickar data via serieport till linuxdator (Rasp PI). Linuxdator skriver till en fil (den börjar bli stor nu) var 2-3s med nya värden. (Tid (i UTC) + data värden för varje nytt "paket").
Foldern där filen ligger är utdelad som en nätverksshare via SMB.
Klienterna som behöver data läser de sista 500 raderna med 5min mellanrum. Kastar bort data som de redan har läst och är glada.
Det viktiga är att inte skriva och läsa med fillåsning påslaget, det är standard på i windows.
både Linux och windowsprogrammet har jag skrivit i C#. PIC programmet är i C.
Jag hade tänkt använda sockets först men gjorde denna Quick and Dirty lösningen först för att se hur allt funka, nu har det snurrat på i över ett år. Någon gång ska jag konvertera till ett REST API tror jag.

Hoppas det ger nya idéer.
/J
Användarvisningsbild
SeniorLemuren
Inlägg: 8424
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: Skicka data mellan två program via nätverket?

Inlägg av SeniorLemuren »

JimmyAndersson skrev:Kul idé! :)

Det gav en del idéer som kanske skulle gå om jag måste ge upp den nuvarande lösningen.
Hur gjorde du pollningen?

I mitt projekt så kommer det då och då (vi pratar timmars mellanrum) in data
på serieporten på en server som kör Linux.

När det händer så vill jag att övriga datorer (med Windows XP) i nätverket ska får reda på det.
De behöver då även få lite data från servern.

Från det att datan kommer in på servern serieport
och till det att de övriga datorerna får reda på det
så vill jag förstås ha så kort fördröjning som möjligt.
1 sekund är okej. Men inte mer än 3-4 sek fördröjning.

Så i den här tråden sökte jag efter det som ska skicka datan från servern och till klienterna (dvs de övriga datorerna).
Om man skall översätta den lösning jag använde så får du ju först förpacka all data som kommer in från serieporten i en lämplig fil som sedan kopieras över till alla brevlådemappar på de andra diskarna i nätverket.

Hur filerna skall behandlas av mottagaren framgår inte vad jag kan se. Men pollningen är ju ett autostartat program som snurrar i bakgrunden och som kollar om det ramlat in någon fil i brevlådemappen, denna fil flyttas då direkt till en annan mapp där den behandlas på det sätt man önskar.

Det hela handlar alltså bara om att kopiera och flytta filer i nätverket till rätt ställe och behandla dem när de dyker upp. Som sagt, väldigt basic. När det gäller fördröjning är den ju i ditt sammanhang obetydlig. Så snart något dyker upp på servern så kopieras det omgående till alla medlemmar man lagt upp i en medlemslista.

Hur du tar emot seriedata kanske du har löst. Jag vet inte vilken programvara du programmerar med, mitt program skrevs i en tidig version av Delphi (Pascal) Till Delphi finns en färdig komponent att ladda hem fritt för att autopolla serieporten.
Användarvisningsbild
JimmyAndersson
Inlägg: 26578
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Re: Skicka data mellan två program via nätverket?

Inlägg av JimmyAndersson »

Jag har en idé om hur jag ska göra med serieporten, men jag har inte testat det än.
Hoppas jag kommer dit någon gång. :D
Tanken är iallafall att använda serieportens interrupt och ta hand om det i Python.
(Jag gjorde en liknande grej till mitt pannrums-projekt, men då med en I2C-krets istället för serieport.)

Efter dina och Janno's tips så har jag fått en del idéer kring vad jag ska testa som nästa steg.
Det är lite svårt att beskriva just nu, men jag återkommer när jag har pusslat ihop tankarna till något konkret. :)


Janno:
Finns den filen på ett minneskort? Isåfall behöver jag inte längre tänka så mycket på att
min Raspberry Pi skriver till loggfilerna då och då, för det är ingenting mot ditt projekt! :D

Intressant att du också (precis som SeniorLemuren) använder principen med fil(er).



Min enda tveksamhet kring att göra precis som ni är det här med att Windows-datorerna måste polla.
Jag startade just om Firefox för att den blev för seg (efter att ha letat info i några dagar)
och det vore skönt om man kunde undvika ha fler grejer i bakgrunden som går hela tiden.
Men jag funderar på saken. :)

Jag ska även titta en gång till på REST.
janno
Inlägg: 434
Blev medlem: 11 oktober 2009, 07:34:45
Ort: Västerås

Re: Skicka data mellan två program via nätverket?

Inlägg av janno »

Jag har också oroat mig för att SD kortet ska paja (två har pajat hittills, Kingston) så jag har lagt den filen på en extern USB disk. Kvalitén mellan tillverkarna av SD kort verkar vara väldigt varierande, mitt nuvarande SanDisk har dock fungerat oklanderligt (ta i trä).

/J
Användarvisningsbild
JimmyAndersson
Inlägg: 26578
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Re: Skicka data mellan två program via nätverket?

Inlägg av JimmyAndersson »

Ajdå. Mitt kort är ett Kingston 8GB SDHC. :oops:
(Jag har iofs några backup'er av hela kortet och brukar ta backup på de filer jag ändrar.)


Projektet rör sig förresten framåt igen.
Men jag har fortfarande inte löst frågan om interrupt. (Se FTDI-tråden i samma kategori.)


--
edit 18 dec:
Sådär ja. Nu är ena halvan detta klart. Dvs Python-delarna. Nu är bara lite av C#-delen kvar.
Det blev TCP/IP Socket. Inte trådat, men med "select".
Skriv svar