Вверх ↑
Ответов: 2200
Рейтинг: 673
#1: 2016-12-06 02:24:21 ЛС | профиль | цитата
Saturn36rus, смотрите unit1.pas в процедуре WSocket1DataAvailable.
Вот вам небольшой набросок:
схема

Add(MainForm,4378101,245,63)
{
Width=935
Height=600
Position=1
link(onCreate,16482401:doOpen,[])
}
Add(Edit,16355833,756,672)
{
Left=5
Top=25
Width=145
Ctl3D=1
Text="15s24vpoo2"
Alignment=2
}
Add(Memo,7124130,539,84)
{
@Hint=#31:Это последние полученные данные|
Left=5
Top=65
Width=225
Height=125
Ctl3D=1
ScrollBars=2
AddHint(-84,-32,194,13,@Hint)
}
Add(TCP_Client,16482401,301,77)
{
Port=6667
IP="95.172.133.164"
link(onRead,6527222:doEvent1,[])
}
Add(Charset,5432023,378,84)
{
Type=7
link(onCharset,1804923:doReplace,[])
}
Add(FormatStr,4120375,756,728)
{
Mask=":ru IDENT 152 -1 4030 1 2 :GALA\r\nRECOVER %1\r\nPHONE 360 640 1 2 :MPP_v.8.0.12\r\n"
link(onFString,3352258:doWork,[])
link(Str1,16355833:Text,[])
}
Add(Replace,1804923,427,84)
{
SubStr=" "
DestStr="\r\n"
link(onReplace,2130206:doEvent1,[(481,90)(481,83)])
}
Add(Hub,6527222,350,77)
{
OutCount=3
link(onEvent1,7124130:doClear,[(469,83)(469,97)])
link(onEvent2,5432023:doCharset,[])
link(onEvent3,5559791:doRead,[(373,97)(373,790)])
}
Add(Memo,8633362,658,77)
{
@Hint=#30:Это лог всех полученных данных|
Left=250
Top=65
Width=285
Height=360
Ctl3D=1
AddType=1
ScrollBars=2
AddHint(-74,-55,181,13,@Hint)
}
Add(Hub,2130206,504,77)
{
link(onEvent1,8633362:doAdd,[])
link(onEvent2,7124130:doAdd,[])
}
Add(ArrayRW,5559791,399,784)
{
@Hint=#20:Читаем первую строку|
Index=Integer(0)
link(onRead,8821029:doCase,[])
link(Array,6333921:getVar,[])
AddHint(-95,44,131,13,@Hint)
AddHint(10,-22,21,13,Index)
}
Add(Case,3396458,602,567)
{
Value=String(HAAAPSI)
link(onNextCase,1321523:doCase,[(660,573)(660,453)(597,453)(597,363)])
link(onTrue,6457300:doEvent1,[])
AddHint(-107,3,71,13,Value)
}
Add(Case,1321523,616,357)
{
Value=String(REGISTER)
link(onTrue,6423993:doEvent1,[])
AddHint(-124,7,80,13,Value)
}
Add(Case,8821029,616,784)
{
Value=String(PING)
link(onNextCase,3396458:doCase,[(660,790)(660,755)(597,755)(597,573)])
link(onTrue,2700626:doData,[])
AddHint(-93,12,51,13,Value)
}
Add(DoData,2700626,686,791)
{
Data=String(PONG)
link(onEventData,11907089:doWork,[])
AddHint(-13,-22,56,13,Data)
}
Add(FormatStr,9206063,742,385)
{
DataCount=4
Mask="USER\r\n%1\r\n%2\r\n%3\r\n%4"
link(onFString,10753192:doAdd,[])
link(Str1,11136958:Item,[])
link(Str2,7645903:Item,[(755,320)(790,320)])
link(Str3,5983206:Value,[(762,345)(930,345)])
link(Str4,9087631:Var,[])
}
Add(ArrayRW,11136958,742,196)
{
Index=Integer(1)
link(Array,14378459:getVar,[])
AddHint(14,-18,21,13,Index)
}
Add(Hub,6423993,693,364)
{
OutCount=5
link(onEvent1,11136958:doRead,[(716,370)(716,202)])
link(onEvent2,7645903:doRead,[(726,377)(726,230)])
link(onEvent3,11549066:doRead,[(734,384)(734,286)])
link(onEvent4,9206063:doString,[])
link(onEvent5,3953283:doReplace,[(721,398)(721,454)])
}
Add(ArrayRW,7645903,784,224)
{
Index=Integer(2)
link(Array,3768665:getVar,[])
AddHint(8,-18,21,13,Index)
}
Add(Memo,10753192,847,385)
{
Left=5
Top=205
Width=225
Height=205
}
Add(Hub,6457300,658,574)
{
link(onEvent1,13881349:doRead,[])
link(onEvent2,4120375:doString,[(714,587)(714,734)])
}
Add(ArrayRW,13881349,742,574)
{
Index=Integer(1)
link(onRead,1605529:doWork,[])
link(Array,6190941:getVar,[])
AddHint(10,-19,21,13,Index)
}
Add(Memory,13036011,896,574)
{
}
Add(Check,1605529,791,574)
{
Check=1
Caption="Сделать ХЭШ!"
link(onEvent,13036011:doValue,[])
}
Add(Memory,5983206,924,280)
{
}
Add(ArrayRW,11549066,826,280)
{
Index=Integer(3)
link(onRead,7542950:doCharset,[])
link(Array,5436636:getVar,[])
AddHint(9,-20,21,13,Index)
}
Add(LineBreak,3686119,896,623)
{
Caption="ХЭШ"
Type=1
link(Data,13036011:Value,[])
Primary=[9087631,-133,-266]
}
Add(LineBreakEx,4802288,553,147)
{
Caption="data"
Type=3
link(_Data,7124130:Array,[])
}
Add(LineBreakEx,6333921,399,742)
{
Caption="data"
Type=2
}
Add(LineBreakEx,14378459,742,161)
{
Caption="data"
Type=2
}
Add(LineBreakEx,11907089,735,791)
{
Caption="send"
}
Add(LineBreakEx,3352258,805,728)
{
Caption="send"
}
Add(LineBreakEx,13179498,238,105)
{
Caption="send"
Type=1
link(OnEvent,16482401:doSend,[(291,111)(291,97)])
}
Add(LineBreakEx,10934201,917,448)
{
Caption="send"
}
Add(LineBreakEx,3768665,784,189)
{
Caption="data"
Type=2
}
Add(LineBreakEx,5436636,826,245)
{
Caption="data"
Type=2
}
Add(LineBreakEx,6190941,742,539)
{
Caption="data"
Type=2
}
Add(Charset,7542950,875,280)
{
Type=6
link(onCharset,5983206:doValue,[])
}
Add(Replace,3953283,847,448)
{
SubStr="\r\n"
DestStr=" "
link(Str,10753192:Text,[])
}
Смысл вкратце такой:
После получения данных из порта проверяете первую строку.
По ней и формируешь данные.
К примеру если первая строка "PING" то нужно отправить "PONG".
А когда первая строка "REGISTER" нужно отправить строку:
WSocket1.Sendline('USER '+TS[1]+' '+TS[2]+' '+Nick+' '+hash);

Эту строку можно представить как список из 5 строк:


USER
Содержимое второй строки
Содержимое третьей строки
Ник (он берется из четвертой строки и меняем кодировку (в коде это Nick:=(UTF8DECODE(TS[3]));)
А в пятой последней строке должен быть ХЭШ. Данные нужно взять из второй строки, когда получены данные с заголовком HAAAPSI(в коде это hash:=Hash152.CreateHash(TS[1]);)


Этот список строк переделываете в строку, где каждая строка разделена пробелом.

В коде на дельфине в список строк
TS := TStringList.Create;

Заносятся полученные данные (строка):
TS.DelimitedText := Wsocket1.ReceiveStr;

И это строка разбивается на строки списка где разделителем строк является пробел:
TS.Delimiter := ' ';


Вот такое:
else
if TS[0] = 'FO' then
Begin
Label2.Caption:='Друзей онлайн: '+TS[1];
End
можно понимать как:
Если первая строка (с индексом 0) равна "F0"
В Надпись вывести полученное количество друзей онлайн, данные взять из второй строки (индекс 1)
Полученные данные будут иметь как миним такой вид: "F0 12"

Смотрите набросок, думаю разберетесь (ХЭШ не подключал).
карма: 11

0
Редактировалось 3 раз(а), последний 2016-12-06 11:33:18