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

Вниз

Разделение данных в TclientSocket...   Найти похожие ветки 

 
dimich1978 ©   (2003-01-21 10:36) [0]

Пишу
clientsocket1.Socket.SendText(table1.fields[0].asstring);
clientsocket1.Socket.SendText(table1.fields[1].asstring);
clientsocket1.Socket.SendText(table1.fields[2].asstring);
clientsocket1.Socket.SendText(table1.fields[3].asstring);
clientsocket1.Socket.SendText("end");

затем передаю данные серверу в мемо, он их принимает все в кучу, но если я ставлю задержку sleep(100), то все работает нормально.
И можно ли данные разделить без использования слипа?
Расскажите кто как данные посланные клиентом разделяет на сервере?
За все ответы заранее благодарен ВСЕМ.


 
Петров Денис ©   (2003-01-21 11:04) [1]

А что на сервере (код OnClientRead, пожалуйста)?


 
GreatMaster   (2003-01-21 11:07) [2]

Можно слать через разделитель
это_первая_строка_конец
это_вторая_строка_конец
Copy...Pos("конец")...


 
Anatoly Podgoretsky ©   (2003-01-21 11:11) [3]

Как ты думаешь, что является разделителями строк?


 
dimich1978 ©   (2003-01-21 11:11) [4]

в коде сервера
s:=socket.receiveText;
memo1.lines.add(s);


 
Петров Денис ©   (2003-01-21 11:14) [5]

Понятно, почему строки принимаются не по порядку без sleep - ведь ты не контролируешь процесс записи данных в буфер сокета при асинхронном обмене.
Выход: усложни протокол обмена и, если это не критично, клиентский сокет сделай blocked.


 
dimich1978 ©   (2003-01-21 11:15) [6]

#13#10


 
GreatMaster   (2003-01-21 11:26) [7]

А как ты думаешь какие символы мягко скажем не всегда используют в table1.fields[n].asstring? А если и использовали то можно это запретить


 
Verg ©   (2003-01-21 14:03) [8]

Отсылать данные лучше всего SendBuf, а не SendText, т.к SendText не возвращает результата отправки, который может быть и SOCKET_ERROR/WSAEWOULDBLOCK (это в сущности не ошибка, а типа аналог "помедленней, пжалста, я записсыаю"). И конечно надо синхронизироваться с событием OnWrite:


TBridge=class
.....
Pending : string;
.....
end;
function TBridge.SendData(var Buffer; Size : integer):integer;
var Bptr : pChar;
Sends : integer;
S : string;
begin
BPtr := pchar(@Buffer);
Result:=1; Sends:=0;
if Pending="" then
begin
while (Result>0) and (Sends<Size) do
begin
result:=ClientSocket1.Socket.SendBuf((Bptr+Sends)^,Size-Sends);
if Result>=0 then inc(Sends,Result);
end;
if Result=SOCKET_ERROR then
begin
if WSAGetLastError=WSAEWOULDBLOCK then
SetString(Pending, Bptr+Sends, Size-Sends);
end else begin result:=Sends; Pending:=""; end;
end else
begin
SetString(S, Bptr, Size);
Pending:=Pending+S;
Result:=0;
end;
end;

procedure TBridge.ClientSocket1Write(Sender: TObject;
Socket: TCustomWinSocket);
var S : string;
begin
if Pending<>"" then
begin
S:=Pending;
Pending:="";
SendData(Pchar(@S[1])^, length(S));
end;
end;


 
mrcat ©   (2003-01-22 00:39) [9]

dimich1978 © (21.01.03 10:36)
...
он их принимает все в кучу
...


а как он должен их "принимать"?

И можно ли данные разделить без использования слипа?

НУЖНО!



 
mrcat ©   (2003-01-22 00:42) [10]

dimich1978 © (21.01.03 11:15)
...
#13#10
...


Это есть разделитель? Если прийдется передавать текст, содержащий "эти" символы?

Что делать будете?



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

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

Наверх




Память: 0.49 MB
Время: 0.019 c
3-29716
Klim Samgin
2003-02-18 12:54
2003.03.10
ADO + Paradox


6-29980
dimich1978
2003-01-21 10:36
2003.03.10
Разделение данных в TclientSocket...


7-30159
DDS
2003-01-06 12:51
2003.03.10
Как узнать в какой порт подключена видеокарта?


3-29721
VIB
2003-02-18 16:01
2003.03.10
Блокировка записи.


1-29947
Ozone
2003-02-27 11:39
2003.03.10
3 вопроса по Word<->Delphi7