A라는 PC에서 '어떤 행위'(DB에 INSERT)가 발생하면 B,C,D,E,F..... 등 n개의 PC에 '어떤 행위'가 발생했다는 메세지를 날리고 싶습니다.
소켓쪽을 살펴봤는데...1:1 밖에 안되는것 같아서...
아주 간단하게 기본적인것만 써서 해봤는데....영....답이 안나오네요
통신쪽은 쌩 초짜라서....... 어떤식으로 작성해야하나요?
사용버젼은 3.0 입니다 -_- 회사가...가난해요...ㅎㅎ
멀티 쓰레드를 사용하라고 하시는데...그쪽도 잘모르고.....아래 코드같이 하는경우에도 멀티 쓰레드를 쓰면
1:n으로 가능한건가요?
------------아래는 서버코드입니다.-------------
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ScktComp, StdCtrls, ExtCtrls, ComCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
ClientSocket: TClientSocket;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure ClientSocketError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure ClientSocketConnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
if ClientSocket.Active then ClientSocket.Active := False;
ClientSocket.Host := '클라이언트IP주소'; //<---------------------한개만 사용가능한것같음.
ClientSocket.Active := True;
end;
procedure TForm1.ClientSocketError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
ErrorCode := 0;
end;
procedure TForm1.ClientSocketConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
label1.Caption := 'Connected';
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
ClientSocket.Socket.SendText('가나다라마바사'); // <------------------ 보내줄 메세지
ClientSocket.Socket.Close;
label1.Caption := 'Disconnect!!';
end;
end.
------------아래는 클라이언트코드입니다.-------------
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ScktComp, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
ServerSocket: TServerSocket;
procedure ServerSocketClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocketClientRead(Sender: TObject;
Socket: TCustomWinSocket);
procedure Button1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.ServerSocketClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
ServerSocket.Active := False;
end;
procedure TForm1.ServerSocketClientRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
Memo1.Lines.Add(Socket.ReceiveText);
ServerSocket.Close;
ServerSocket.Open;
ServerSocket.Active := True;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ServerSocket.Close;
Close;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:= caFree;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ServerSocket.Active := true;
end;
end.
먼저 서버코드와 클라이언트 코드가 서로 바뀐것 같네요. ^^ ;
그래고 내용을 보니 클라이언트는 그렇다고 치고, 서버에서 메시지만 받고 여러 클라이언트들에게
보내주는 내용이 없네요. 그리고 클라이언트에서 한번 받았다고 서버를 Close 했다가 다시 Open
해서는 안되요..
서버는 Listening 포트를 열고 기다리다가 클라이언트가 접속을 요청해 오면, 쓰레드를 하나 만들어서
쓰레드에서 메시지를 수신하고, 님께서 하시고자하는 것은 이 쓰레드에서 메시지를 받으면, 현재 서버에
접속중인 클라이언트들에게 하나씩 다 Write 또는 Send 해 주셔야 해요.
Indy TCP Server와 Client를 사용해 보세요. 그리고 Indy 데모에 채팅 부분을 보시고 응용하시는게
좋을것 같네요..
그리고 말씀하신 내용을 보면 Application Server 처리 형태도 괜찮을 것 같은데, 한번 고려해 보심이
어떨까 싶네요..
그럼.....