client socket과 server socket를 exe를 통해서 쏘면 잘 받는데.
(각각 exe를 만들어서 실행해보았습니다.)
그런데..server socket쪽의 exe를 띄워놓고 COM으로 client쪽을 만들어서 asp를 실행하면 동작을 안해요. 왜그렇죠?
고수님들 부탁드려요!
Client쪽의 코딩은 다음과 같습니다.
----------------------------------------------------------------------------
unit Usendmsg2;
interface
uses
ComObj, ActiveX, Psendmsg2_TLB, StdVcl,ScktComp;
type
Tsendmsg2 = class(TAutoObject, Isendmsg2)
clients: TClientSocket;
protected
function Msendmsg2(const msg: WideString): WideString; safecall;
{ Protected declarations }
end;
implementation
uses ComServ;
function Tsendmsg2.Msendmsg2(const msg: WideString): WideString;
var aaa: string;
begin
clients := TClientSocket.Create(nil);
clients.Address := '211.117.100.142';
clients.port := 5432;
clients.Active := true;
clients.Socket.SendText(msg);
aaa := clients.socket.ReceiveText;
result := msg+aaa;
clients.Active := false;
end;
initialization
TAutoObjectFactory.Create(ComServer, Tsendmsg2, Class_sendmsg2,
ciMultiInstance, tmApartment);
end.
---------------------------------------------------------------------
server쪽의 코딩은 다음과 같습니다.
---------------------------------------------------------------------
unit Usockettest4;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ScktComp, StdCtrls;
type
TForm1 = class(TForm)
ServerSocket1: TServerSocket;
Edit1: TEdit;
procedure ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
edit1.text := socket.ReceiveText+'보냈슴';
socket.SendText(edit1.text);
ServerSocket1.Active := false;
ServerSocket1.Active := true;
end;
end.
----------------------------------------------------------------------------
fastnet의 소켓은 이벤트를 순차적으로 처리하지 않아서 애먹었던 기억이 있습니다..
예를 들어..
with TClientSocket.Create(self) do
begin
active := true;
sendtext('이바바바');
end;
이렇게 코딩을 했는데 접속이 이루어지기도 전에 메세지를 날려서 에러가 나곤했던 기억이
나는군요.(그 후로 인디를 사용했던거 같습니다. ㅡ.ㅡ;;;)
시간이 좀 널럴하면 테스트도 해서 올려드리겠지만 워낙 정신이 없어서리...죄송합니다.
예전엔 이런 코드로 대충 해결했던거 같군요..
var
I : Integer;
begin
active := true;
while (clientsocket.connected = flase) or (I < 100000) do
begin
application.Processmessage;
Inc(I); //접속이 실패할 경우 무한루프에 빠지는걸 방지
end;
if clientsocket.connected = true then
sendtext('이바바바');
end;
코드는 델파이에서 작업하지 않았으므로 버그가 있을 수 있습니다.
그리고 ASP컴퍼넌트 처럼 죽으면 아주 피곤한 것들은 반드시 try ~ except 로 묶는걸 권장하고 싶군요.
당부드리고 싶은 한마디. 그냥 인디쓰시죠..^^;
즐프하세여~ ^-^
sizzling wrote:
> client socket과 server socket를 exe를 통해서 쏘면 잘 받는데.
> (각각 exe를 만들어서 실행해보았습니다.)
> 그런데..server socket쪽의 exe를 띄워놓고 COM으로 client쪽을 만들어서 asp를 실행하면 동작을 안해요. 왜그렇죠?
> 고수님들 부탁드려요!
>
> Client쪽의 코딩은 다음과 같습니다.
> ----------------------------------------------------------------------------
> unit Usendmsg2;
>
> interface
>
> uses
> ComObj, ActiveX, Psendmsg2_TLB, StdVcl,ScktComp;
>
> type
> Tsendmsg2 = class(TAutoObject, Isendmsg2)
> clients: TClientSocket;
> protected
> function Msendmsg2(const msg: WideString): WideString; safecall;
> { Protected declarations }
> end;
>
>
> implementation
>
> uses ComServ;
>
> function Tsendmsg2.Msendmsg2(const msg: WideString): WideString;
> var aaa: string;
> begin
> clients := TClientSocket.Create(nil);
> clients.Address := '211.117.100.142';
> clients.port := 5432;
> clients.Active := true;
> clients.Socket.SendText(msg);
> aaa := clients.socket.ReceiveText;
> result := msg+aaa;
> clients.Active := false;
> end;
>
> initialization
> TAutoObjectFactory.Create(ComServer, Tsendmsg2, Class_sendmsg2,
> ciMultiInstance, tmApartment);
> end.
> ---------------------------------------------------------------------
> server쪽의 코딩은 다음과 같습니다.
> ---------------------------------------------------------------------
> unit Usockettest4;
>
> interface
>
> uses
> Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
> ScktComp, StdCtrls;
>
> type
> TForm1 = class(TForm)
> ServerSocket1: TServerSocket;
> Edit1: TEdit;
> procedure ServerSocket1ClientRead(Sender: TObject;
> Socket: TCustomWinSocket);
> private
> { Private declarations }
> public
> { Public declarations }
> end;
>
> var
> Form1: TForm1;
>
> implementation
>
> {$R *.DFM}
>
> procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
> Socket: TCustomWinSocket);
> begin
> edit1.text := socket.ReceiveText+'보냈슴';
> socket.SendText(edit1.text);
> ServerSocket1.Active := false;
> ServerSocket1.Active := true;
> end;
>
> end.
> ----------------------------------------------------------------------------