Sende filer?

Tags:    delphi

Hmm tror jeg fik lukket den anden tråd lidt for hurtigt.. men anyways..

Nu har jeg fået fat i demoen af delphi 2005.. Der er godt nok sket forandringer side D6, men nu har jeg fundet et par componenter, hvor jeg ikke ved hvilket jeg skal bruge.. Jeg skal kunne 2 ting:

Sende filer fra Serveren til clienten
Sende tekst fra server til client, og tilbage igen

Har fundet den sædvanlige TCPServer, en der hedder CMDServer, og en SimpleServer..

ved ikke hvad forskellen er, hvad der er best til hvad, og om man overhovedet kan bruge dem alle..

Mvh...
Allan Nørgaard Kristensen



7 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 1 karma
Sorter efter stemmer Sorter efter dato
Du har kun brug for at sende bytes.

Jeg har engang lavede et chat program til chat over IP (bare for sjov :-P). Til dette benyttede jeg min egen kommunikationsprotokol, der lignede denne:

Serveren "lytter" på en bestemt port, fx 3456.
Klienten tilkobler sig denne port på serveren.

Herefter begynder den egentlige kommunikation. Hver message/besked starter med en "header" på 8 bytes, der indeholder følgende:
Message ID + 7 parametre.

Jeg havde i denne anledning lavet et skema over de forskellige messages. Jeg vil dog kun forklare, hvordan det foregår i princippet (jeg beskriver ikke mine egentlige protokol, men blot eksempler) med 1 klient og 1 server, da det ellers blive lidt tungt/avanceret med flere klienter.

Når klienten tilkoblede sig serveren, blev følgende besked sendt til klienten:
Message ID: SR_CONNECT (Server Response Connect)
1. parameter: serverens navns længde plus klientens tildelte ID (bruges, når der kommunikeres med > 2)

Herefter kunne klienten forvente, at den modtog endu en pakke på n bytes, der svarede til serverens navns længde, og som også indeholdte serverens navn.

Derefter sendte klienten denne besked tilbage til serveren:
Message ID: CR_CONNECT (Client Response Connect)
1. parameter: klientens navns længde

Herefter kunne serveren så også forvente at modtage en pakke på n bytes, der indeholdt klientens navn. Nu kendte både klient og server hinandens navne, så nu skulle de også kunne sende beskeder til hinanden. Dette foregik via denne besked:
Message ID: CHAT
1. parameter: beskedens længde
Som sædvanlig kunne klienten eller serveren (den af dem, der nu modtagede denne besked), så forvente endnu en pakke, der svarede til beskeden på n bytes (n = 1. parameter).

De 4 af de resterende 6 bytes i hver "header" blev brugt til anden information, da dette kræves ved flere klienter. Så kan man måske spørge sig selv, hvorfor jeg så ikke har droppet de sidste 2 bytes. Det har jeg ikke, fordi at TCP pakker alligevel bliver "paddet" til 8 bytes - altså, der bliver tilføjet ekstra bytes, hvis den fylder < 8 bytes. Derudover var løsningen også fremtidssikret, hvis jeg behøvede flere paramtre i fremtiden.

Håber at det gav anledning til lidt ny viden, men også nye spørgsmål ;-)

Et godt råd; hvis du har tænkt dig at lavet en lidt mere udvidet protokol, så jeg vil helt klart foreslå dig at skitsere/designe den først, så du ikke får brug for at ændre den midt i forløbet - det kan nemlig godt blive ret besværligt med de fleste systemer.
Jeg havde i hvert fald megen glæde af mit dokument med protokollen indtegnet med paramtre osv. klar til programmeringen.

1101110100010110000101000001

Killers don't end up in jail - they end up on a high-score!

[Redigeret d. 15/05-05 23:18:54 af Nicolai Lyster Fersner]



Delphi's komponenter kun er wrappere for WinSock2, der er en del af Win32 API'et. Så du kan faktisk lige så godt benytte WinSock, men det siger sig selv, at det derfor også blive lidt mere besværligt (dog ikke særligt meget, hvis du i forvejen er vant til Win32 API'ets struktur).
Ville bare lige informere dig om denne fjerde valgmulighed, der kan gøre alt det, som komponenterne kan gøre, og formentlig også mere, da komponenterne næsten altid er mere eller mindre begrænsede på nogle områder. Jeg har dog ikke lige undersøgt de nævnte, men da det ene til dels hedder TCP, så formoder jeg, at det kun kan kommunikere via TCP - WinSock2 kan skifte mellem både med TCP og UDP relativt nemt.

Her er lidt mere information:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/windows_sockets_start_page_2.asp

1101110100010110000101000001

Killers don't end up in jail - they end up on a high-score!

[Redigeret d. 14/05-05 22:25:39 af Nicolai Lyster Fersner]




http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/windows_sockets_start_page_2.asp

Der står: Windows Sockets 2 is designed for use by C/C++ programmers.

Hilsen Mathias




http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/windows_sockets_start_page_2.asp

Der står: Windows Sockets 2 is designed for use by C/C++ programmers.

Hilsen Mathias


Jep, men da du skal bruge det for at kommunikere med Windows, så er det også tilgængeligt for Delphi ;-)
Du kan ikke lave vinduer, netværkskommunikation osv. uden Win32 API'et, så Delphi's komponenter må jo bruge det i en eller anden udstrækning.

I øvrigt så benyttede jeg selv ren Win32 API i stedet for Delphi's komponenter (netop til bl.a. vinduer og netværkskommunikation via WinSock2), så det er skam helt og aldeles muligt ;-)

Alle deres eksempler er også i C/C++, men da klasserne og funktionerne i Win32 API'et hedder det samme i C/C++ og Delphi, så burde det være relativt nemt for dig at benytte både referencerne og eksemplerne - jeg forstod det i hvert fald til fulde, selv om jeg dengang næsten intet kendskab til C/C++ havde.

1101110100010110000101000001

Killers don't end up in jail - they end up on a high-score!

[Redigeret d. 15/05-05 09:22:46 af Nicolai Lyster Fersner]




http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/windows_sockets_start_page_2.asp

Der står: Windows Sockets 2 is designed for use by C/C++ programmers.

Hilsen Mathias


Jep, men da du skal bruge det for at kommunikere med Windows, så er det også tilgængeligt for Delphi ;-)
Du kan ikke lave vinduer, netværkskommunikation osv. uden Win32 API'et, så Delphi's komponenter må jo bruge det i en eller anden udstrækning.

I øvrigt så benyttede jeg selv ren Win32 API i stedet for Delphi's komponenter (netop til bl.a. vinduer og netværkskommunikation via WinSock2), så det er skam helt og aldeles muligt ;-)

Alle deres eksempler er også i C/C++, men da klasserne og funktionerne i Win32 API'et hedder det samme i C/C++ og Delphi, så burde det være relativt nemt for dig at benytte både referencerne og eksemplerne - jeg forstod det i hvert fald til fulde, selv om jeg dengang næsten intet kendskab til C/C++ havde.

1101110100010110000101000001

Killers don't end up in jail - they end up on a high-score!

[Redigeret d. 15/05-05 09:22:46 af Nicolai Lyster Fersner]

Ok:)

Hilsen Mathias



Har kigget lidt på det, men da jeg ikke forstår ret meget C, og C's søskende tror jeg det bliver lidt for indviklet.

Er samtidig kommet til at se at der ikke er de samme funktioner i de indy-komponenter der følger med delphi 2005. Selv en simpel IdTCPServer kan jeg ikke engang finde ud af at sende en message med længere.

Har kigget lidt på IdUDPServer, da det er den eneste jeg har fundet, hvor der er en "sende" kommando, men den kan kun sende strings, og bytes.

Nogen der ved hvad jeg gør galt? Jeg mener, det kan da ikke passe at komponenterne er blevet værdiløse.


Mvh...
Allan Nørgaard Kristensen



Tror at Indy er fucket up for borland da de har sendt det med deres 2005 version. Det virker overhovedet ikke. Er gået tilbage til at bruge D6 igen, og NU kører det bare håber jeg.


Mvh...
Allan Nørgaard Kristensen



t