[求救]ServerSocket的事件處理 |
答題得分者是:darnell
|
geniustom
版主 發表:100 回覆:303 積分:260 註冊:2003-01-03 發送簡訊給我 |
小弟寫了一隻程式..想以建立一個執行緒的方式在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 發送簡訊給我 |
|
geniustom
版主 發表:100 回覆:303 積分:260 註冊:2003-01-03 發送簡訊給我 |
我想的的問題可能出在這裡...改成
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 發送簡訊給我 |
引言: 感謝大大的回應..小弟使用 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 發送簡訊給我 |
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 發送簡訊給我 |
引言:不客氣拉...分享才是進步的原動力... 在這裡可以學到很多喔...站長跟各位板主也都很厲害呢... 我也很高興可以替你解決問題
編輯記錄
darnell 重新編輯於 2008-10-19 00:47:16, 註解 無‧
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |