全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1747
推到 Plurk!
推到 Facebook!

[求救]ServerSocket的事件處理

答題得分者是:darnell
geniustom
版主


發表:100
回覆:303
積分:260
註冊:2003-01-03

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-08-28 07:05:59 IP:219.68.xxx.xxx 未訂閱
小弟寫了一隻程式..想以建立一個執行緒的方式在CONSOLE底下建立一個ServerSocket..我有試過連線確定沒問題了..可是事件處理不管怎麼改..就是一點反應也沒有..想請教各位先進..如何才能讓我建立的事件能夠正常動作呢?以下是我的程式碼: //------------------------------專案檔--------------------------------- program Project2; {$APPTYPE CONSOLE} uses Windows, Messages, SysUtils, Variants,Classes,ScktComp,Unit1 in 'Unit1.pas'; var start:TRun; begin start.main; while start.Server<>nil do sleep(100); //為了防止程式結束,等到釋放掉才結束 end. //------------------------------單元檔--------------------------------- unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, ScktComp; type TRun = class(TThread) private procedure Server_OnClientRead(Sender: TObject;Socket: TCustomWinSocket); procedure Server_OnClientError(Sender: TObject; Socket: TCustomWinSocket;ErrorEvent: TErrorEvent; var ErrorCode: Integer); procedure Server_OnClientConnect(Sender: TObject;Socket: TCustomWinSocket); procedure Server_OnClientDisconnect(Sender: TObject;Socket: TCustomWinSocket); public Server:TServerSocket; procedure main; end; implementation procedure TRun.main(); begin writeln('socket初始化...'); Server:=TServerSocket.Create(Server); Server.ServerType:=stNonBlocking; Server.Port:=7114; Server.OnClientRead:=Server_OnClientRead; Server.OnClientError:=Server_OnClientError; Server.OnClientConnect:=Server_OnClientConnect; Server.OnClientDisconnect:=Server_OnClientDisconnect; Server.Active:=true; writeln('連接埠開啟..聽候連線中...'); end; procedure TRun.Server_OnClientRead(Sender: TObject;Socket: TCustomWinSocket); var packet:string; begin packet:=Socket.ReceiveText; writeln('Client傳送資料,資料為:' packet); Socket.SendText(packet); //測試封包回傳有沒有問題 end; procedure TRun.Server_OnClientConnect(Sender: TObject;Socket: TCustomWinSocket); begin writeln('Client連入,IP來自:' Socket.RemoteHost); Socket.SendText('conneted!!'); end; procedure TRun.Server_OnClientDisconnect(Sender: TObject;Socket: TCustomWinSocket); begin writeln('Client斷線,IP來自:' Socket.RemoteHost); end; procedure TRun.Server_OnClientError(Sender: TObject; Socket: TCustomWinSocket;ErrorEvent: TErrorEvent; var ErrorCode: Integer); begin writeln('Client端發生錯誤,錯誤碼為:' inttostr(ErrorCode)); ErrorCode:=0; Server.Close; self.main; end; end. 以上就是我所有的原始碼..麻煩各位先進指點迷津..感激不盡!!
darnell
版主


發表:25
回覆:103
積分:145
註冊:2003-03-04

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-08-30 08:01:24 IP:61.216.xxx.xxx 未訂閱
引言: while start.Server<>nil do sleep(100); //為了防止程式結束,等到釋放掉才結束 end.
我想的的問題可能出在這裡...改成 while start.Server<>nil do Application.ProcessMessages; end. ===發揮人的無限潛能=== ==思想的極至就是虛無==
geniustom
版主


發表:100
回覆:303
積分:260
註冊:2003-01-03

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-08-30 08:18:29 IP:219.68.xxx.xxx 未訂閱
我想的的問題可能出在這裡...改成 while start.Server<>nil do Application.ProcessMessages; end. ------------------------------------------------ 感謝大大的回應..小弟使用 sleep(100) 的原因是因為不想將FORMS uses進去 要使用Application..必須先uses FORMS 因為一 uses FORMS..執行檔的容量就暴增至300多K.. 我這隻程式的目的是作出一個最小程式容量..可以通訊...這樣就好了 再請問大大..有沒有不需USES FORMS的方法或是其他的解決方案呢??
darnell
版主


發表:25
回覆:103
積分:145
註冊:2003-03-04

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-08-30 08:53:34 IP:61.216.xxx.xxx 未訂閱
引言: 感謝大大的回應..小弟使用 sleep(100) 的原因是因為不想將FORMS uses進去 要使用Application..必須先uses FORMS 因為一 uses FORMS..執行檔的容量就暴增至300多K.. 我這隻程式的目的是作出一個最小程式容量..可以通訊...這樣就好了 再請問大大..有沒有不需USES FORMS的方法或是其他的解決方案呢??
如果你只要執行檔小,只要使用runtime packegs就可以了,不過要使用的時候還要附加依各.bpl的檔案一起發佈,不過我看你的意思好像是總共要很小... 那這時你就得用這各方法...因為console並沒有訊息佇列...無法接收訊息... 只好手動自己處理...
 
//建立計時器回呼函式
procedure TimeProc(Window:HWND; message,idEvent:UINT; dwTime:DWORD);stdcall
begin
......//觸發時所要做的事情
end;    procedure NoWin_Timer;
var TimerID:Integer; Msg:TMsg;
begin
   TimerID:=SetTimer(0,0,1000,@TimerProc);//1000為1000ms觸發一次的意思
   //取得訊息,收到MW_QUIT跳離
   while GetMessage(Msg,0,0,0) do
      DispatchMessage(Msg);//分派Message       KillTimer(0,TimerID);
end;
===發揮人的無限潛能=== ==思想的極至就是虛無==
geniustom
版主


發表:100
回覆:303
積分:260
註冊:2003-01-03

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-08-30 12:10:27 IP:219.68.xxx.xxx 未訂閱
darnell大大..真是感謝您在兩邊都幫我解決難題..多虧您的協助..問題已經圓滿解決了..且符合我的要求.....我把原本的 <>< class="code"> while start.Server<>nil do sleep(100); 改成
while start.Server<>nil do
   while GetMessage(Msg,0,0,0) do
      DispatchMessage(Msg);
原來只要這樣子就可以接收來自WINDOWS的訊息了..這樣小弟之前遇到的瓶頸都解開了.. darnell大大..為了感謝您的幫忙..兩邊的答題得分就送給大大了..< > 也希望大家看到這篇文章也能有所收穫< >
darnell
版主


發表:25
回覆:103
積分:145
註冊:2003-03-04

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-08-31 14:00:57 IP:61.216.xxx.xxx 未訂閱
引言:
darnell大大..真是感謝您在兩邊都幫我解決難題..多虧您的協助..問題已經圓滿解決了..且符合我的要求
...
原來只要這樣子就可以接收來自WINDOWS的訊息了..這樣小弟之前遇到的瓶頸都解開了..darnell大大..為了感謝您的幫忙..兩邊的答題得分就送給大大了..也希望大家看到這篇文章也能有所收穫
不客氣拉...分享才是進步的原動力...
在這裡可以學到很多喔...站長跟各位板主也都很厲害呢...
我也很高興可以替你解決問題
編輯記錄
darnell 重新編輯於 2008-10-19 00:47:16, 註解 無‧
系統時間:2024-05-18 23:39:13
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!