Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2015.09.10;
Скачать: CL | DM;

Вниз

Проблема при передачи tcpserver tcpclient   Найти похожие ветки 

 
Иван   (2010-06-13 19:27) [0]

Здравствуйте! Извините что отнимаю время. Хотелось бы услышать совет. У меня задача написать программу для тестирования знаний. Я выбрал модель клиент-сервер. И выбрал компоненты TcpServer и TcpClient. Пользуюсь ими впервые. Возникли сложности с принятием данных с сервера. Суть такая. На сервере имеется возможность создания тестов. При запуске клиента юзер вводит свое имя и конектится к серверу, при конекте клиент передает имя компа на сервер, затем сервер передает клиенту список имеющихся тестов либо файлы всех тестов. После чего клиент подгружает выбранный тест, проходит его и отсылает данные на сервер. Звучит просто...
Подскажите пожалуйста как это проще и лучше организовать, оптимальнее. Клиентов будет не больше 30. Вообще возникли трудности с приемом данных с сервера.

сервер
procedure TForm1.TcpServer1Accept(Sender: TObject;
 ClientSocket: TCustomIpClient);
 var
 s: string;
begin
{Здесь сервер принимает клиента}
 Clients.Items.Add(clientsocket.Receiveln());
 s:=TestListBox.Items.GetText;
 clientsocket.Sendln(s,#$D#$A)
end;


клиент

procedure TForm1.StartClick(Sender: TObject);
var
 s: string;
begin
   tcpclient1.RemoteHost:=IporNameHost.Text;
   tcpclient1.Open;
   s:=TcpClient1.LocalHostName;
   Form1.TcpClient1.Sendln(s,#$D#$A);
   form2.TestsListBox.Items.Add(tcpclient1.Receiveln());
   form2.ShowModal();
end;


И как вообще передать файл?
Очень благодарен за внимание. И заранее спасибо за ответы и советы!


 
Slym ©   (2010-06-15 08:26) [1]

Иван   (13.06.10 19:27)
И как вообще передать файл

ПРОТОКОЛ, ПРОТОКОЛ и еще раз ПРОТОКОЛ!
выбери из имеющихся или сам придумай протокол
запрос LOGIN, UserName<CR><LF>
ответ  OK, TestFile<CR><LF>
Запрос GET, TestFile<CR><LF>
ОТВЕТ  ОК, TestFileLength<CR><LF>
TestFileSource


Зачем серверу передавать имя компа? может имя пользователя?


 
djagernaut ©   (2010-06-19 18:23) [2]

Здравствуйте! Переделал код. При коннекте клиент посылает имя пользователя и имя компа, далее сервер передает клиенту список имеющихся тестов, ( до сюда все работает) потом пользователь выбирает тест и клиент должен передать имя теста на сервер, сервер загружает тест и передает его клиенту. Вот не получается передать имя теста серверу...
Код:
Сервер

//мой поток
 TClientDataThread = class(TThread)
 private
 public
   ListBuffer :TStringList;
   TargetList :TStrings;
   procedure synchAddDataToControl;
   constructor Create(CreateSuspended: Boolean);
   procedure Execute; override;
   procedure Terminate;
 end;

//------------- TClientDataThread impl -----------------------------------------
constructor TClientDataThread.Create(CreateSuspended: Boolean);
begin
 inherited Create(CreateSuspended);
 FreeOnTerminate := true;
 ListBuffer := TStringList.Create;
end;

procedure TClientDataThread.Terminate;
begin
 ListBuffer.Free;
 inherited;
end;

procedure TClientDataThread.Execute;
begin
 Synchronize(synchAddDataToControl);
end;

procedure TClientDataThread.synchAddDataToControl;
begin
TargetList.AddStrings(ListBuffer);
end;
//------------- end TClientDataThread impl -------------------------------------

procedure TForm1.TcpServer1Accept(Sender: TObject;
 ClientSocket: TCustomIpClient);
 var
 s: string;
 DataThread: TClientDataThread;
 i: integer;
begin
{Здесь сервер принимает клиента}
 /// create thread
 DataThread:= TClientDataThread.Create(true);
 // set the TagetList to the gui list that you
 // with to synch with.
 DataThread.TargetList := Clients.Items;

 // Load the Threads ListBuffer
 
 s := ClientSocket.Receiveln;
 DataThread.ListBuffer.Add(s+" - "+ClientSocket.LookupHostName(ClientSocket.RemoteHost) +
  " (" + ClientSocket.RemoteHost + ")");
 // Call Resume which will execute and synch the
 // ListBuffer with the TargetList
 DataThread.Resume;

                 for I := 0 to testlistbox.Items.Count - 1 do
                 clientsocket.Sendln(testlistbox.items[I]);
end;

Клиент
procedure TForm1.StartClick(Sender: TObject);
var
 s: string;
 DataThread: TClientDataThread;
begin
   tcpclient1.RemoteHost:=IporNameHost.Text;
   tcpclient1.Open;
   TcpClient1.Sendln(Group.Text+"/"+Name.Text);
   // create thread
 DataThread:= TClientDataThread.Create(true);
 // set the TagetList to the gui list that you
 // with to synch with.
 DataThread.TargetList := form2.TestsListBox.Items;
    s := tcpclient1.Receiveln;
 while s <> "" do
 begin
   DataThread.ListBuffer.Add(s);
   s := tcpclient1.Receiveln;
 end;
 // Call Resume which will execute and synch the
 // ListBuffer with the TargetList
 DataThread.Resume;
   form2.ShowModal();
end;

procedure TForm2.StartTestClick(Sender: TObject);
var
s: string;
DataThread: TClientDataThread;
begin
   
   if    testslistbox.ItemIndex<>-1 then
   begin
     s:=testslistbox.Items[testslistbox.ItemIndex];
     form1.TcpClient1.Sendln(s);  //ТУТ не могу передать и получить на сервере
   end
   else exit;
   form3.Caption:=s;
   form3.ShowModal();
end;



 
Slym ©   (2010-06-21 06:38) [3]

1. писец... потоки тут зочем? если TcpServer в ThreadBlocking режиме -то потоки уже для тебя оформлены, если нет то нафик они нужны
про клиента молчу: отдельный поток там возможен, но не на данном этапе эволюции...
2. э 2 кнопки и 1 соединение - грабли (вторую кнопку жмем через час и вуаля - ЕРРОР)! 2 кнопки 2 соединения - твое! но придется приделать некий Session уникальный для "Логического" соединения нескольких последовательных физических подключений


 
Slym ©   (2010-06-21 06:42) [4]

на вскидку твою задумку проще обернуть в HTTP при помощи TIdHttpServer, а клиент в виде браузера или свое приложение с TIdHttp



Страницы: 1 вся ветка

Текущий архив: 2015.09.10;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.037 c
2-1392391651
dehkanin
2014-02-14 19:27
2015.09.10
Почему выплывает исключение?


15-1414578228
qpash
2014-10-29 14:23
2015.09.10
Скриншот произвольной области


15-1411754150
Jeer
2014-09-26 21:55
2015.09.10
О детях, внуках и что мы им..


4-1271835404
снежок
2010-04-21 11:36
2015.09.10
Панель задач Windows 7 превьюшки


15-1416691802
Юрий
2014-11-23 00:30
2015.09.10
С днем рождения ! 23 ноября 2014 воскресенье