客户端 private { Private declarations } FThread: TThread; public { Public declarations } iFileHandle:integer; i: integer; host,port,qm:string; sFile:TFileStream; F : Textfile; str,nbzy_bh:string; end; TReadThread = class(TThread) private FClient: TIdTCPClient; FMessage,nbzy_qm: string; FForm: TFormLjf2; procedure UpdateForm; protected procedure Execute; override; public constructor Create(AForm: TFormLjf2; qm: string; AClient: TIdTCPClient); end; var FormLjf2: TFormLjf2; implementation uses ljf999; {$R *.dfm} procedure TFormLjf2.FormShow(Sender: TObject); var i,j:Integer; begin //得到要发送的客户端IP i:=pos(')',Self.Caption); //查找分隔符 host:=copy(Self.Caption,i+1,Length(Self.Caption)-i); //连接到服务器 IdTCPClient2.Host:=FormLjf999.host; IdTCPClient2.Port:=StrToInt(FormLjf999.port); //得到用户编号 str:=Self.Caption; i:=pos('(',str); j:=pos(')',str); nbzy_bh:=copy(str,i+1,j-(i+1)); qm:=copy(str,1,i-1);; Memo1.SetFocus; //这里是线程,2个参数,一个是窗口,一个是接收信息的IdTCPClient 2017-1-5 FThread := TReadThread.Create(Self, qm, IdTCPClient2); end; procedure TFormLjf2.SpeedButton1Click(Sender: TObject); var Tid: DWord; begin if Memo1.Text='' then begin ShowMessage('请输入内容'); Memo1.SetFocus; Exit; end; if not IdTCPClient2.Connected then begin ShowMessage('连接未建立。'); exit; end; IdTCPClient2.WriteLn(host+'-'+Memo1.Text); Memo2.Lines.Add('我 '+DateTimeToStr(Now)+ #13#10 +' '+Memo1.Text); PostMessage(Memo2.Handle, WM_VSCROLL, SB_BOTTOM, 0); Memo1.Text:=''; //Backspace键 keybd_event(8,0,0,0); keybd_event(8,0,KEYEVENTF_KEYUP,0); end; procedure TFormLjf2.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin OutputDebugString('notify thead to quit.'); FThread.Terminate; OutputDebugString('wait thead finish.'); //FThread.WaitFor; OutputDebugString(PChar('thread finished.')); if IdTCPClient2.Connected then begin IdTCPClient2.Disconnect; end; end; procedure TFormLjf2.FormClose(Sender: TObject; var Action: TCloseAction); begin //Action := caFree; Self.Free; end; { TReadThread } constructor TReadThread.Create(AForm: TFormLjf2; qm: string; AClient: TIdTCPClient); begin FClient := AClient; FForm := AForm; nbzy_qm := qm; FreeOnTerminate := True; inherited Create(False); end; procedure TReadThread.Execute; begin inherited; while not Terminated do begin if Terminated then begin Break; end; if not FClient.Connected then begin try FClient.Connect(100); except end; if not FClient.Connected then begin Sleep(100); continue; end; end; FMessage := FClient.ReadLn(#$D, 1); if Length(FMessage) > 0 then Synchronize(UpdateForm); end; if FClient.Connected then FClient.Disconnect; end; procedure TReadThread.UpdateForm; begin FForm.Memo2.Lines.Add(nbzy_qm+' '+DateTimeToStr(Now)); FForm.Memo2.Lines.Add(' '+FMessage); end; end. 服务端接收并转发 procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread); var rbyte:array[0..4096] of byte; sFile:TFileStream; cmd,FileSize:integer; str,FileName:string; iFileHandle:integer; iFileLen,cnt:integer; buf:array[0..4096] of byte; ip,fileqm,sendStr:string; i,j:integer; sm:TStringStream; msize:Integer; begin //while AThread.Connection.Connected do //注意这里 with AThread.Connection do begin Try str:=AThread.Connection.ReadLn; //接收文件大小及文件名 if POS('|',str)>0 then begin // end else begin i:=pos('-',str); //查找分隔符 ip:=copy(str,1,i-1); //提取文件名 sendStr:=copy(str,i+1,Length(str)-i); IdTCPServer1.Threads.UnlockList; with IdTCPServer1.Threads.LockList do begin try for i:=0 to Count - 1 do begin try AThread := Items[i]; if AThread.Connection.Socket.Binding.PeerIP = ip then begin AThread.Connection.WriteLn(sendStr);//这里是服务端发送给客户端的 end; except AThread.Stop; end; end; finally IdTCPServer1.Threads.UnlockList; end; end; end; Finally //Athread.Connection.Disconnect; //AThread.Connection.WriteBuffer('错误',SizeOf('错误'),True); end; end; end; procedure TForm1.IdTCPServer1Disconnect(AThread: TIdPeerThread);//客户端退出触发 IdTCPServer1Disconnect begin Memo1.Lines.Add(AThread.Connection.Socket.Binding.PeerIP+' 已退出'); try IdTCPServer1.Threads.LockList.Remove(Athread); finally IdTCPServer1.Threads.UnlockList(); end; //AThread.Connection.Disconnect; end; procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread); var strSql,qm,bh,str:string; i:Integer; begin Memo1.Lines.Add(qm+' '+AThread.Connection.Socket.Binding.PeerIP+' 已连接'); end; procedure TForm1.FormDestroy(Sender: TObject); begin IdTCPServer1.Active:=False; Application.Terminate; end; procedure TForm1.IdTCPServer1Exception(AThread: TIdPeerThread; AException: Exception); begin Memo1.Lines.Add('客户端'+inttostr(athread.handle)+'异常断开'); del(AThread); if AThread.Connection.Connected then AThread.Connection.Disconnect; end; ———————————————— 版权声明:本文为CSDN博主「luojianfeng」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/luojianfeng/article/details/54097231 |
|