Sockety

0

mam client i server, w kliencie umieszczam procedure np:

for i := 0 to 10 do
  ClientSocket1.Socket.SendText('Text nr ' + IntToStr(i);

w serwerze cos w rodzaju:

Memo1.Lines.Add(Socket.RecevieText);

w wyniku dostaje cos takiego (linie memo):

Text nr 1
Text nr 2ext nr 3Text nr 4 itd

co mam zrobic, zeby serwer otrzymywal osobne pakiety?

0

mam client i server, w kliencie umieszczam procedure np:

for i := 0 to 10 do
  ClientSocket1.Socket.SendText('Text nr ' + IntToStr(i);

w serwerze cos w rodzaju:

Memo1.Lines.Add(Socket.RecevieText);

w wyniku dostaje cos takiego (linie memo):

Text nr 1
Text nr 2ext nr 3Text nr 4 itd

co mam zrobic, zeby serwer otrzymywal osobne pakiety?

Wydaje mi się że wiadomości są wysyłanie zbyt szybko. spróbUj dodać przerwe np. Sleep(100).

Ew. rozdzielaj je:
[code]
for i := 0 to 10 do
SendText('Text nr ' + IntToStr(i) + #13#10)[/code]

0

wyszlo na 200, ale pytanko, czy nie bedzie roznicy na jakim kompie/polaczeniu sie to uruchoomi?

a co do rozdzielenia, to dobry pomysl ale tez male pytanko: czy on mi nie utnie pakietu? tzn w jednym przyjdzie np 10,5 komedy a w nastepnym nastepne pol?

0

wyszlo na 200, ale pytanko, czy nie bedzie roznicy na jakim kompie/polaczeniu sie to uruchoomi?

a co do rozdzielenia, to dobry pomysl ale tez male pytanko: czy on mi nie utnie pakietu? tzn w jednym przyjdzie np 10,5 komedy a w nastepnym nastepne pol?

Będzie różnica, im lepszy komputer tym szybsza pętla (to chyba oczywiste). O ile na moim złomie nigdy nie musialem uzywać sleep(), o tyle ty na swoim musiałeś :)

0

hmm fatalnie... a co z tym dzieleniem, moze sie zdarzyc taka sytuacja? 1/2 komedy w jednym pakiecie kolejne 1/2 w drugim?

PS: mam clerona 500 :D

0

Też miałem ten problem i rozwiązałem go w sposób bardziej uniwersalny i szybszy w działaniu. A mianowicie wszystkie komendy kończyłem jakimś znaczkiem, którego normalnie nie ma (jaki to ma być znaczek to zależy od rodzaju przesyłanych danych) i potem jak natrafiłem na "blabla@bnlabnla@bna"
i w następnym pakiecie "lna@"
(W przykładzie rozdziela znaczek @ - ogólnie raczej mało praktyczne, ale będzie ten znaczek widać)
i to dzieliłem na kolejne komendy, czy partie danych, jak by to tam tego nie nazywać:
blabla
bnlabnla
bnalna
Ogólnie dodaję każdy pakiet do jakiejś zmiennej i w niej wyszukuję znaku @.
Jak znajdę, to wszystko, co było do tego znaku kopiuję do "komendy" i kasuję wraz z tym znaczkiem i robię co miałem robić z "komendą". Następnie powtarzam operację itd. Mam nadzieję, że wiesz o co mi chodzi. Pozdrówka.

0

Jeśli chcesz wysłać zawartość pola Memo to uzyj lepiej metody SendStream(srumien) na klienci:

strumien:TMemoryStream;
Memo1.Lines.SaveToStream(strumien);
ClientSocket1.SendStrem(strumien);

a na serwerze odbierz to i zaladuj do Memo :

while int<>-1 do
int:=ServerSocket1.Socket.ReceiveBuf(strumien);

Memo2.Lines.LoadFromStream(strumien);

0

tak wiem o co chodzi, ale czy te pakiety sie czasemnei rozdziela np:

wysylam text1@text2@text3@ (@ jako dzielnik)

i tera pytanie czy nie bedzie takiej sytuacji, ze z drugiej strony dojdzie:

text1@te

i powiedzmy w nastepnym pakiecie:

xt2@text3@

chodzi mi czy taka sytuacja jest mozliwa? Jaka jest max wielkosc pakietu?

0

proponuje rozwiazac to w ten sposob:

for i := 0 to 10 do
zmienna := zmienna+'Text nr ' + IntToStr(i) + '|';

ClientSocket1.Socket.SendText(zmienna);

| - znak rozdzielajacy

pozniej wystarczy ze serwer rozdzieli otrzymany string wg znaku |
tu masz dokladny opis jak to zrobic
http://4programmers.net/view_faq.html?id=233

jesli chodzi o wielkosc pakietu to niewiem jaka ona jest ale przesylalem dosyc dlugie ciagi znakow i nic dziwnego sie nie dzialo, wiec mysle ze smialo mozna to rozwiazac w przedstawiony wyzej sposob.

pozdrawiam

0

wysylam text1@text2@text3@ (@ jako dzielnik)

i tera pytanie czy nie bedzie takiej sytuacji, ze z drugiej strony dojdzie:

text1@te

i powiedzmy w nastepnym pakiecie:

xt2@text3@

Nie, nie będzie takiej sytuacji.
A wysyłając w ten sposób:

  Socket.SendTExt('text1');
  Socket.SendTExt('text2');

Dojdzie albo najpierw 'text1', a potem 'text2', albo razem 'text1text2'. Innej możliwości nie ma.
A do rozdzielania stringa proponuje użyć znaków, którch nie da się normalnie wklepać kalwiaturą np. o numerach 1-10.

0

no to [browar] !!! Dzieki!

1 użytkowników online, w tym zalogowanych: 0, gości: 1