Klient / Server - problem

0

Siema.
Jest mały problem.
Mam komputer (server) na ktorym jest baza danych *.dbf. Baza wczytywana jest przez program MojProgram-Server.
Z innego komputera lacze sie z programem MojProgram-Server poprzez MojProgram-Client i pobieram wybrane rekordy. Wszystko dziala na socketach- Receive/Sent.

Tylko takie rozwiazanie jest dla jednego klienta poniewaz. Nie wiem jak wykonac to dla wiekszej ilosci komputerow-Clientow.

Czy ktos moglby mi poradzic jakies konkretne rozwiazanie albo podac ratujacy mnie kod?

Prosze o pomoc i z gory dziekuje.

0

niech kazdy klient kopiuje sobie z serwera ten plik

0

ze wzgledow bezpieczenstwa pobierany ma byc tylko potrzebny rekord

takie rozwiazanie odpada, ale dzieki za pomoc.

0

hmm nie wiem zbytnio o co ci chodzi... przeciez ServerSocket moze przyjmowac wiecej niz jedno polaczenie.

0

Chodzi o to ze przez jeden port lacza sie z serverem dwa clienty. Informacje ktore server dostaje trafiaja np. do Edit1. Przy odbiorze server sprawdza co to za zapytanie, odsyla informacje tylko ze nie wie do ktorego z klientow... :(

0

Niech każdemu kieltowi ktury się podłącza bedzie przypożadkowywany ID i zapisywany wraz z zapytaniem. Gdy serwer zwruci wyniki zapytania, to sprawdza ID i odszuka go w połączeniach i wyśle wyniki :)

0

:-) To jest mysl. Tylko jakbys mogl napisac mi jeszcze jak tego dokonac.. bo szczerze mowiac nie wiem [stuk]
(licze na jakis kod pomocniczy).

0

Przy przyjmowaniu jakis danych w procedurze eventa masz zmienna socket, ktora mowi, od kogo te dane dostales. Wiec mozesz albo zrobic przeszukiwanie danych w tej procedurze, albo odeslac ten socket do tej innej procedury, potem, zeby odeslac odwolujesz sie do tej zmiennej, np Socket.SendText;

0

Sory ze jestem taki wredny i tyle pisze... wybaczcie :-|

Rozumiem Twoj tok rozumowania Wolverine ale zupelnie nie wiem jak dokonac tego o czym piszesz. Wspomóż mnie kodem :-)

ps.
w tej chwili funkcja wysylajaca do clienta wyglada tak:
serversocket1.Socket.Connections[0].sendtext(do_wyslania);

0

Zrob sobia liste z danymi :

 Zapytanie:String;
 Socket:TCustomWinSocket;

I jak bedzie się łączył, to sobie stworzysz new object do listy i tam wrzucisz to co trzeba. A jak bedzie coś dostawało z bazy danych, to niech szuka sobie tego na liście i jak znajdzie, to niech sprawdzi czy przypadkiem ten socket jest jeszcze aktywny (if ServerSocket.Connections.IndexOf(Socket)<>-1) i wtedy masz juz gdzie wysyłać. poza tym nie operuj zabardzo na sendtext, tylko stworz sobie jakiś własny datagram i bedzie spoko :)

0

Ok, brzmi rozsadnie, tylko gdzie mialbym to deklarowac i w ogole jak :-( ?

Jestem jeszcze za slaby w te klocki by moc do tego dojsc samemu ;-(

Napiszcie mi nie tyle kod ile to co musze zrobic od A-Z zeby to chodzilo.

prooosze :-)

0

Hm... Tak sobie właściwie patrze, że nie musisz przeiceż nic kombinować. W jednej procedurce daj wszystko do odczytywania (OnClientRead) I tam sobie pobierz wartość zapytania. Wykonaj je na danej bazie danych. Zatrzymaj procedure na chwile, żeby poczekać aż bedą wyniki o ile się sama nie zatrzyma i pÓźniej wyślij wyniki przez Socket.Send... i zamknj połączenie Socket.Close;

0

W serverze mam tak:

procedure TForm1.ServerSocket1Accept(Sender: TObject;
  Socket: TCustomWinSocket);
    begin
       Edit5.Text:=Socket.RemoteAddress;
    end;

pytanie jak wyslac z servera txt znajac RemoteAddress [???]

moje aktualne wysylanie to:

serversocket1.Socket.Connections[0].sendtext(do_wyslania);
0
procedure TMainForm.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  //Tu ewentualnie jakis debug, czy cos innego
  ProcessCmd(Socket.ReceiveText);
end;

procedure TMainForm.ProcessCmd(Cmd: String; Socket: TCustomWinSocket);
begin
  //Tutaj robisz co miales zrobic, zadanie masz w Cmd...
  //I na koniec:
  Socket.SendStr('Twoja odpowiedz');
end;

Oczywiscie to sprawdzanie bazy, czy co tam chcesz sprawdzac, mozesz zrobic juz w ClientRead, ale tak bedzie raczej bardziej czytelne.

jak wyslac z servera txt znajac RemoteAddress

Zly pomysl, coraz wiecej ludzi laczy sie przez NAT'a, i jak polaczy sie wiecej osob z tej samej sieci to polaczenia ci sie pomieszaja.

0

jak polaczy sie wiecej osob z tej samej sieci to polaczenia ci sie pomieszaja.

No to super :-( , a co zrobic, albo jak zrobic zeby polaczenia sie nie pomieszaly? Chodzi o to ze 2 clienty pytaja server o dwa rozne rekordy z bazy danych i teraz server musi wyslas je do odpowiednich klientow. Wysylanie rekordow po kolei jest kiepskie bo docelowo bedzie obslugiwanych ok 50osob na raz...

0

Przeciez dalem ci kod, o co jescze chodzi?

0

Stworzylem taki kod ktory umieszcza info o klientach w listbox.

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var i:integer;
begin
Listbox1.Items.Clear;
For i:=0 to serversocket1.Socket.ActiveConnections -1 do
Listbox1.Items.add(serversocket1.Socket.Connections[i].remoteAddress +' '+
serversocket1.Socket.Connections[i].Remotehost +' '+'Port ='+Inttostr(serversocket1.Socket.connections[i].remoteport));
end;

Jak teraz sprawdzic (przeszukac list box) ktory to klient napisal do servera i odpowiedziec wlasnie jemu? [???]

0

Bez urazy, ale czy ty naprawde nierozumiesz?

procedure TMainForm.ServerSocket1ClientRead(Sender: TObject;
   Socket: TCustomWinSocket);
var
  Cmd: String;
  i: Integer;
begin 
  Cmd := Socket.RecieveText; //wow, ktos do mnie cos napisal
  for i := 0 to Baza.count -1 do  //Szukam jakiegos rekordu, ktory chce wyslac do tego goscia, ktory napisal mi tekst, ktory przypisalem do zmiennej Cmd
    if Baza[i][0] = Cmd then  //Yay znalazlem, tera wysle to temu gosciowi
      Socket.SendStr('Dane o ktore prosiles...' + Baza[i][1]);
end;

Jak nic z tego nie wyniesiesz to sie poddaje. [glowa]

0

Oto moj wykorzystany dzieki pomocy kod Client Read:

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
   Cmd: string;
   i: Integer;
begin 
   Cmd := ServerSocket1.Socket.ReceiveText; //wow, ktos do mnie cos napisal
   {
   for i := 0 to Baza.count -1 do   //Szukam jakiegos rekordu, ktory chce wyslac do tego goscia, ktory napisal mi tekst, ktory przypisalem do zmiennej Cmd
      if Baza[i][0] = Cmd then   //Yay znalazlem, tera wysle to temu gosciowi
    }
    Socket.SendText('dziala');

end;

zmienilem

Socket.SendStr('Dane o ktore prosiles...' + Baza[i][1]);

na

Socket.SendText('dziala');

podczas proby wyslania czegos z kilenta do servera wysakuje blad:

Windows socket error. żadanie wyslania lub odebrania danych zostalo zablokowane, poniewaz gniazdo nie jest podlaczone i (podczas wysylania przez gniazdo datagramu przy uzyciu wywolania "wyslij do") nie podano adresu (10057), on API 'recv'

Asynchronous socket error 10053

(ustawione porty na 100% mam otwarte i aktywne)

0

Juz mam :-)

Rozwiazalem to i wyjasnilem!! [hurra]

Wielkie dizeki za cierpliwosc!! [browar]

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