why when i give each client its own DataAvaialbe i hav eno problems at all what is the diffrence ? and should i do that with all other events ?
في الأحد، 12 أغسطس 2018 في 7:48 م تمت كتابة ما يلي بواسطة عاشقه كبريائي < madamma...@gmail.com>: > I will do the logging I am just a bit confused because this is my first > time to use ics , > > Is there any clear demo to run tcp server in threaded manner ? The demos > in the source confused me too much is there any updated demo to better serv > tcp with threading as you suggested ? > > On Sat, Aug 11, 2018, 1:01 PM عاشقه كبريائي <madamma...@gmail.com> wrote: > >> i have created a tcp server using Twsocket but after 40 clients connected >> the server stopped from listing >> >> i dont use any VCL inside the server i just do some database query and >> send some data to all connected clients >> >> >> i dont know what i am doing wrong >> >> here is my server code >> >> >> unit Mainserv; >> >> interface >> >> uses >> Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, >> System.Classes, Vcl.Graphics, >> Vcl.Controls, Vcl.Forms, Vcl.Dialogs, IdGlobal, Vcl.StdCtrls, >> Vcl.ExtCtrls, >> Vcl.Imaging.GIFImg, Vcl.Imaging.pngimage, JPEG, System.DateUtils, >> OverbyteIcsWndControl, OverbyteIcsWSocket, OverbyteIcsWSocketS; >> >> >> const >> Sep = '~'; >> >> type >> TConnection = class(TWSocketClient) >> private >> procedure ISALIVE; >> >> >> >> >> >> >> public >> cName: String; >> cpassword : string; >> IP: String; >> Connected: TDateTime; >> Cuserid: string; >> CisLoggedin : string; >> CANENETR : string; >> status : integer; >> ForceDC : String; >> >> procedure broadcastleft(const usernameleft: string); >> procedure SendCommandWithParams(const Command: String); >> procedure HandleLogin; >> procedure broadcastjoin; >> procedure broadcastmsg(const msgtxt: String); >> procedure SendClientsList; >> >> >> >> >> >> >> end; >> >> >> type >> TForm3 = class(TForm) >> Panel1: TPanel; >> Edit1: TEdit; >> Button1: TButton; >> Button2: TButton; >> servertcp: TWSocketServer; >> procedure FormDestroy(Sender: TObject); >> procedure Button1Click(Sender: TObject); >> procedure Button2Click(Sender: TObject); >> procedure servertcpBgException(Sender: TObject; E: Exception; >> var CanClose: Boolean); >> procedure servertcpClientConnect(Sender: TObject; Client: >> TWSocketClient; >> Error: Word); >> procedure servertcpClientDisconnect(Sender: TObject; Client: >> TWSocketClient; >> Error: Word); >> procedure servertcpDataAvailable(Sender: TObject; ErrCode: Word); >> >> private >> >> procedure UpdateBindings; >> { Private declarations } >> public >> { Public declarations } >> end; >> >> var >> Form3: TForm3; >> >> implementation >> uses crypto, mysql_qry, constant; >> >> {$R *.dfm} >> >> { TConnection } >> >> >> >> procedure TForm3.Button1Click(Sender: TObject); >> begin >> >> >> UpdateBindings; >> >> >> servertcp.ClientClass := TConnection; >> LastUniqueID := 100; >> end; >> >> procedure TForm3.Button2Click(Sender: TObject); >> begin >> servertcp.Close; >> end; >> >> procedure TForm3.FormDestroy(Sender: TObject); >> begin >> servertcp.Close; >> end; >> >> >> >> >> >> >> >> >> >> procedure TConnection.ISALIVE; >> var >> I: integer; >> uclient: TConnection; >> begin >> >> if self.CnotAllowed = 'YES' then >> begin >> exit; >> end; >> >> >> >> self.Connected := Now; >> >> >> >> for i := 0 to TWSocketServer(Server).ClientCount -1 do >> begin >> uclient := TConnection(TWSocketServer(Server).Client[i]); >> if (sametext(uclient.Chatname, self.Chatname)) >> And (uclient.ForceDC = 'NO') >> And (SecondsBetween(Now, uclient.Connected) >= 75) then >> begin >> uclient.ForceDC := 'YES'; >> uclient.Close; >> >> end; >> end; >> >> >> end; >> >> >> >> procedure TForm3.servertcpDataAvailable(Sender: TObject; ErrCode: Word); >> var >> CCLIENT: TConnection; >> Command: String; >> cmdhandle : string; >> Startercommand : String; >> Params: array [1 .. 200] of String; >> ParamsCount, P: integer; >> ReceiveParams: BOOLEAN; >> I: integer; >> DECODES : String; >> >> begin >> >> CCLIENT := Sender as TConnection; >> >> >> >> >> >> Startercommand := CCLIENT.ReceiveStrW(CP_UTF8); >> >> Command := Startercommand; >> >> >> >> >> if Command = '' then >> begin >> exit; >> end; >> >> Command := replace(Command,#13,''); >> Command := replace(Command,#10,''); >> >> >> >> ReceiveParams := False; >> >> >> //Command Type >> >> if Command[1] = '1' then // none crypted >> begin >> Command := Copy(Command, 2, MaxInt); >> ReceiveParams := true; >> end else >> if Command[1] = '2' then // crypted >> begin >> Command := Copy(Command, 2, MaxInt); >> Command := Decryptstrs(Command); >> ReceiveParams := true; >> end; >> >> >> >> >> if ReceiveParams = true then // params is incomming >> begin >> DECODES := Command; >> >> ParamsCount := 0; >> while (DECODES <> '') and (ParamsCount < 200) do >> begin >> Inc(ParamsCount); >> P := Pos(Sep, DECODES); >> if P = 0 then >> Params[ParamsCount] := DECODES >> else >> begin >> Params[ParamsCount] := Copy(DECODES, 1, P - 1); >> Delete(DECODES, 1, P); >> end; >> end; >> end; >> >> cmdhandle := Params[1]; >> >> >> >> >> >> if cmdhandle = '' then >> begin >> Exit; >> end; >> >> >> >> if cmdhandle = 'LGN' then >> begin >> if Paramscount <> 3 then >> begin >> exit; >> end; >> CCLIENT.cName := Params[2]; >> CCLIENT.cpassword := Params[3]; >> CCLIENT.HandleLogin; >> end else >> >> >> >> if cmdhandle = 'msg' then >> begin >> if Paramscount <> 2 then >> begin >> exit; >> end; >> >> CCLIENT.broadcastmsg(Params[2]); >> >> >> end else >> >> >> >> >> >> >> if cmdhandle = 'ISALIVE' then >> begin >> >> CCLIENT.ISALIVE; >> >> >> end else >> >> >> >> if cmdhandle = 'GETLIST' then >> begin >> if Paramscount <> 1 then >> begin >> exit; >> end; >> >> CCLIENT.SendClientsList; >> >> end; >> >> >> >> >> >> >> >> >> >> >> >> end; >> >> >> procedure TForm3.servertcpBgException(Sender: TObject; E: Exception; >> var CanClose: Boolean); >> begin >> CanClose := True; >> end; >> >> procedure TForm3.servertcpClientConnect(Sender: TObject; Client: >> TWSocketClient; >> Error: Word); >> var >> CLIENTCONN: TConnection; >> begin >> CLIENTCONN := Client as TConnection; >> >> CLIENTCONN.LineMode := TRUE; >> CLIENTCONN.LineEdit := TRUE; >> CLIENTCONN.LineLimit := Maxint; { Do not accept long lines } >> CLIENTCONN.LineEnd := #10; >> CLIENTCONN.OnDataAvailable := servertcpDataAvailable; >> CLIENTCONN.Banner := ''; >> CLIENTCONN.IP := Client.GetPeerAddr; >> CLIENTCONN.Connected := Now; >> CLIENTCONN.CisLoggedin := 'NO'; >> >> end; >> >> procedure TForm3.servertcpClientDisconnect(Sender: TObject; >> Client: TWSocketClient; Error: Word); >> var >> CLIENTCONN: TConnection; >> begin >> CLIENTCONN := Client as TConnection; >> CLIENTCONN.ForceDC := 'YES'; >> >> >> if CLIENTCONN.CisLoggedin = 'YES' then >> begin >> CLIENTCONN.CisLoggedin := 'NO'; >> >> CLIENTCONN.broadcastleft(CLIENTCONN.cName); >> end; >> >> end; >> >> procedure TConnection.SendCommandWithParams(const Command : String); >> begin >> >> self.SendStr('1'+Command + #10, CP_UTF8); >> >> end; >> >> >> >> procedure TConnection.HandleLogin; >> var >> I: integer; >> cclient: TConnection; >> begin >> >> if Checkbanusrindatabase(self.Cname) = True then >> begin >> Self.Cnotallowed := 'YES'; >> self.SendCommandWithParams('REJECT&'); >> exit; >> end; >> >> >> for i := 0 to TWSocketServer(Server).ClientCount -1 do >> begin >> cclient := TConnection(TWSocketServer(Server).Client[i]); >> >> if (sametext(cclient.cName, self.cName)) >> And (cclient.CisLoggedin = 'YES') then >> begin >> self.CANENETR := 'NO'; >> break; >> end; >> >> end; >> >> >> if self.CANENETR = 'NO' then >> begin >> self.SendCommandWithParams('invalidin&'); >> exit; >> end; >> >> >> self.cname := replace(self.cname,' ',''); >> self.cname := replace(self.cname,#32,''); >> >> if self.cName.Length < 3 then >> begin >> self.SendCommandWithParams('invalidnn&'); >> exit; >> end; >> >> self.SendCommandWithParams('Logged&' + self.cName + Sep); >> self.broadcastjoin; >> end; >> >> >> >> >> >> >> procedure TConnection.broadcastmsg(const msgtxt: String); >> var >> I: integer; >> Connection: TConnection; >> begin >> >> >> if self.CisLoggedin <> 'YES' then >> begin >> Exit; >> end; >> >> >> for i := 0 to TWSocketServer(Server).ClientCount -1 do >> begin >> connection := TConnection(TWSocketServer(Server).Client[i]); >> >> >> if (Connection.CisLoggedin = 'YES') then >> begin >> >> Connection.SendCommandWithParams('msg&' + msgtxt + Sep); >> >> end; >> >> >> >> >> end; >> >> >> >> >> >> end; >> >> >> >> procedure TConnection.broadcastjoin; >> var >> I: integer; >> Connection: TConnection; >> begin >> >> >> if self.CisLoggedin <> 'YES' then >> begin >> Exit; >> end; >> >> >> >> >> for i := 0 to TWSocketServer(Server).ClientCount -1 do >> begin >> connection := TConnection(TWSocketServer(Server).Client[i]); >> >> >> if (Connection.CisLoggedin = 'YES') then >> begin >> >> Connection.SendCommandWithParams('JOIN&' + self.cName + Sep); >> >> end; >> >> >> >> >> end; >> >> >> >> >> >> end; >> >> >> >> >> >> >> >> procedure TConnection.broadcastleft(Const usernameleft, useridleft, >> usrroomid, usrchatname : string); >> var >> I: integer; >> Connection: TConnection; >> begin >> >> for i := 0 to TWSocketServer(Server).ClientCount -1 do >> begin >> connection := TConnection(TWSocketServer(Server).Client[i]); >> >> >> if (Connection.CisLoggedin = 'YES') then >> begin >> >> Connection.SendCommandWithParams('LEFT&' + usernameleft + Sep + >> useridleft + sep); >> >> end; >> >> >> >> >> end; >> >> >> >> >> >> end; >> >> >> >> procedure TForm3.UpdateBindings; >> begin >> >> servertcp.Close; >> servertcp.Addr := '0.0.0.0'; >> servertcp.Port := edit1.Text; >> servertcp.Listen; >> end; >> >> >> >> >> function SortChannelConnections(List: TStringList; Index1, Index2: >> integer): integer; >> var >> Conn1, Conn2: TConnection; >> begin >> Conn1 := TConnection(List.Objects[Index1]); >> Conn2 := TConnection(List.Objects[Index2]); >> >> if (Conn1.status) > (Conn2.status) then >> Result:=1; >> if (Conn1.status) < (Conn2.status) then >> Result:=-1; >> if (Conn1.status) = (Conn2.status) then >> Result:=0; >> >> end; >> >> >> >> >> procedure TConnection.SendClientsList; >> var >> I: integer; >> P : integer; >> ClientlistStringL: TStringList; >> USRCLIENTS: TConnection; >> usrlsttext : string; >> begin >> >> >> if self.CisLoggedin <> 'YES' then >> begin >> Exit; >> end; >> >> >> if self.CnotAllowed = 'YES' then >> begin >> exit; >> end; >> >> >> >> >> >> ClientlistStringL := TStringList.Create; >> try >> >> for i := 0 to TWSocketServer(Server).ClientCount -1 do >> begin >> USRCLIENTS := TConnection(TWSocketServer(Server).Client[i]); >> >> >> if (USRCLIENTS.CisLoggedin = 'YES') then >> begin >> ClientlistStringL.AddObject(USRCLIENTS.cName + Sep, USRCLIENTS); >> end; >> >> end; >> >> >> ClientlistStringL.CustomSort(SortChannelConnections); >> >> for p := 0 to ClientlistStringL.Count - 1 do >> begin >> >> >> usrlsttext := ClientlistStringL.Strings[p]; >> usrlsttext := replace(usrlsttext,#13,''); >> usrlsttext := replace(usrlsttext,#10,''); >> usrlsttext := replace(usrlsttext,#$A,''); >> usrlsttext := replace(usrlsttext,#$D,''); >> usrlsttext := trim(usrlsttext); >> usrlsttext := 'GETLIST&'+usrlsttext; >> >> self.SendCommandWithParams(usrlsttext); >> >> end; >> >> >> finally >> FreeAndNil(ClientlistStringL); >> end; >> >> >> >> self.SendCommandWithParams('LREADY&'); >> >> >> >> end; >> >> >> >> >> end. >> > -- To unsubscribe or change your settings for TWSocket mailing list please goto http://lists.elists.org/cgi-bin/mailman/listinfo/twsocket Visit our website at http://www.overbyte.be