線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2757
推到 Plurk!
推到 Facebook!

每個client如何接收server訊息

答題得分者是:暗黑破壞神
paste
一般會員


發表:13
回覆:19
積分:6
註冊:2005-04-27

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-06-28 04:21:57 IP:59.120.xxx.xxx 未訂閱
請問各位大大: 小弟找1個範例:要由server傳送到每個client,但範例內client只能傳送訊息,卻無法接收server訊息. 請問要哪裡要改? *************** server ***************** unit server1; interface uses Classes, QControls, QStdCtrls, QExtCtrls, QButtons, QForms, Sockets; type TForm1 = class(TForm) memo1: TMemo; TcpClient1: TTcpClient; TcpServer1: TTcpServer; Memo2: TMemo; Label1: TLabel; Label2: TLabel; Label3: TLabel; edit1: TEdit; edit2: TEdit; edit3: TEdit; button1: TButton; memo3: TMemo; button2: TButton; Label4: TLabel; procedure button2Click(Sender: TObject); procedure TcpServer1Accept(sender: TObject; ClientSocket: TCustomIpClient); procedure button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; // you must create your own thread to synch // writing to a gui component TClientDataThread = class(TThread) private public ListBuffer :TStringList; TargetList :TStrings; procedure synchAddDataToControl; constructor Create(CreateSuspended: Boolean); procedure Execute; override; procedure Terminate; end; var Form1: TForm1; //DataThread: TClientDataThread; implementation {$R *.xfm} //------------- 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.button1Click(Sender: TObject); var okk : boolean; begin TcpServer1.Close; TcpServer1.LocalPort := edit3.Text; TcpServer1.Active := True; okk:= TcpServer1.Active; case okk of true: Label4.Caption:='true'; false: Label4.Caption:='false'; end; end; procedure TForm1.button2Click(Sender: TObject); var I: Integer; begin TcpClient1.RemoteHost := edit1.Text; TcpClient1.RemotePort := edit2.Text; try if TcpClient1.Connect then for I := 0 to memo3.Lines.Count - 1 do TcpClient1.Sendln(memo3.Lines[I]); finally TcpClient1.Disconnect; end; end; procedure TForm1.TcpServer1Accept(sender: TObject; ClientSocket: TCustomIpClient); var s: string; DataThread: TClientDataThread; begin // create thread DataThread:= TClientDataThread.Create(true); // set the TagetList to the gui list that you // with to synch with. DataThread.TargetList := memo1.lines; // Load the Threads ListBuffer DataThread.ListBuffer.Add('*** Connection Accepted ***'); DataThread.ListBuffer.Add('Remote Host: ' ClientSocket.LookupHostName(ClientSocket.RemoteHost) ' (' ClientSocket.RemoteHost ')'); DataThread.ListBuffer.Add('===== Begin message ====='); s := ClientSocket.Receiveln; while s <> '' do begin DataThread.ListBuffer.Add(s); s := ClientSocket.Receiveln; end; DataThread.ListBuffer.Add('===== End of message ====='); // Call Resume which will execute and synch the // ListBuffer with the TargetList DataThread.Resume; end; end. *************** client ***************** unit client1; interface uses Classes, QControls, QStdCtrls, QExtCtrls, QButtons, QForms, Sockets; type TForm1 = class(TForm) Memo1: TMemo; TcpClient1: TTcpClient; Memo3: TMemo; Button2: TButton; Label1: TLabel; Label2: TLabel; Label3: TLabel; edit1: TEdit; edit2: TEdit; edit3: TEdit; Button1: TButton; Label4: TLabel; Edit4: TEdit; SpeedButton1: TSpeedButton; procedure Button2Click(Sender: TObject); procedure TcpServer1Accept(sender: TObject; ClientSocket: TCustomIpClient); procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure SpeedButton1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; // you must create your own thread to synch // writing to a gui component TClientDataThread = class(TThread) private public ListBuffer :TStringList; TargetList :TStrings; procedure synchAddDataToControl; constructor Create(CreateSuspended: Boolean); procedure Execute; override; procedure Terminate; end; var Form1: TForm1; DataThread: TClientDataThread; implementation {$R *.xfm} //------------- 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.Button2Click(Sender: TObject); var I: Integer; txt1:string; begin TcpClient1.RemoteHost := edit1.Text; TcpClient1.RemotePort := edit2.Text; try txt1:=Edit4.Text; if (TcpClient1.Connect) then for I := 0 to Memo3.Lines.Count-1 do txt1:=Memo3.Lines[I]; txt1:=Edit4.Text ': ' txt1; TcpClient1.Sendln(txt1); Memo3.Lines.Clear; finally TcpClient1.Disconnect; end; end; procedure TForm1.FormCreate(Sender: TObject); begin TcpClient1.Disconnect; TcpClient1.LocalPort := edit3.Text; TcpClient1.RemoteHost := edit1.Text; TcpClient1.RemotePort := Edit2.Text TcpClient1.Active:=true; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin TcpClient1.Destroying; end; ********** end *************** 謝謝!
chris_shieh
高階會員


發表:46
回覆:308
積分:240
註冊:2004-04-26

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-06-28 15:08:26 IP:61.63.xxx.xxx 未訂閱
client/server只是相對觀念 要讓你的client 能夠接收訊息 則你的client也要有server的接收訊息功能(listening, receive msg) @瞭解越多.懂得越少@
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-06-28 17:05:13 IP:59.104.xxx.xxx 未訂閱
看看你的 client 元件有沒有 onxxx 的事件啊。 通常在 client 端 read 就是由 server -> client write 就是 client -> server 修正一下 chris_shieh 所說的。 如果你的 client 只要跟特定的 server 通訊。 那你只要由 clinet 連到 server 之後。 利用這個連線。就可以做收發了。 不必做 listen.....etc 的動作
paste
一般會員


發表:13
回覆:19
積分:6
註冊:2005-04-27

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-06-28 20:05:18 IP:59.120.xxx.xxx 未訂閱
請問大大們: 有使用TTcpServer及TTcpClient的範例嗎? 我一直找不到. 謝謝!
chris_shieh
高階會員


發表:46
回覆:308
積分:240
註冊:2004-04-26

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-06-30 16:36:22 IP:203.70.xxx.xxx 未訂閱
建議你看看這個範例 ..Borland\Delphi7\Demos\Indy\UDPClientServer @瞭解越多.懂得越少@
paste
一般會員


發表:13
回覆:19
積分:6
註冊:2005-04-27

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-06-30 23:46:27 IP:59.120.xxx.xxx 未訂閱
引言: 建議你看看這個範例 ..Borland\Delphi7\Demos\Indy\UDPClientServer @瞭解越多.懂得越少@
chris_shieh 大大您好: 我記的udp的封包比較不穩定,較可能流失, 是否有tcp的範例. 謝謝!
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-07-01 10:26:52 IP:59.104.xxx.xxx 未訂閱
不要偷懶了啦。 方向給你。就要自己走啦。 除了已經做過的人以外。 誰有那麼多時間幫你寫程式? http://www.mcu51.com/list.asp?id=1588 想想別人怎麼學,我們有這麼用心嗎? 憂心啊~~~~~~
mirage
初階會員


發表:40
回覆:101
積分:28
註冊:2004-01-05

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-07-01 10:56:50 IP:59.120.xxx.xxx 未訂閱
發表人 - mirage 於 2005/07/01 11:01:08
系統時間:2024-05-19 5:52:15
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!