Q&A

  • 소켓통신에서..한개의 서버를 두고 여러개의 클라이언트오 서버가 통신할때.
서버는한대이고서버에서 클라이언트의 메세지를 받습니다.
요청이 들어오면 그요청이 무엇인지...체크하고 다시 클라이언트에 관련된 리턴값을 줘야됩니다.

지금은 1:1로 서로 메세지가 가는건 확인했는데..

클라이언트에서 서버로 메세지를 보내면 해당메세지를 잘받습니다.

그럼 다시 서버에서 클라이언트에 메세지를 보낸다면 .
서버소켓을 클라이언트에 다시 하나 만들어야될까요?
서버에도 클라이언트 소켓을 하나더 두고 해야되나요?

인디로 도전하다가 ..초보라서 도저히 안되서...

조언좀 부탁드립니다.

<!--CodeS-->
서버.
unit server;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ScktComp;

type
  TForm1 = class(TForm)
    ServerSocket: TServerSocket;
    Button1: TButton;
    ListBox: TListBox;
    procedure ServerSocketClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ServerSocketClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
    GotMsg : string;

begin
    GotMsg := Socket.ReceiveText;

    // ShowMessage(gotmsg);
       listbox.Items.Add(Socket.RemoteHost + '(' + Socket.RemoteAddress + ') 에서 ' + FormatDateTime('yyyy"년" mm"월"dd"일 " hh"시" nn"분" ss"초"', Now) + '에 호출하였습니다.');
  
{
if GotMsg = 'w#' then
    begin
      
      
    ShowMessage(Socket.RemoteHost + '(' + Socket.RemoteAddress + ') 에서 ' + FormatDateTime('yyyy"년" mm"월"dd"일 " hh"시" nn"분" ss"초"', Now) + '에 w호출.');

      end

    else if GotMsg = 'd#' then
    begin

      //  ShowWindow(Application.Handle, SW_RESTORE);
      ShowMessage(Socket.RemoteHost + '(' + Socket.RemoteAddress + ') 에서 ' + FormatDateTime('yyyy"년" mm"월"dd"일 " hh"시" nn"분" ss"초"', Now) + '에 d호출.');


    end ;  
}
end;

end.



클라이언트
unit cli;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ScktComp;

type
  Tclient = class(TForm)
    ClientSocket: TClientSocket;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Memo1: TMemo;
    procedure ClientSocketConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ClientSocketError(Sender: TObject; Socket: TCustomWinSocket;
      ErrorEvent: TErrorEvent; var ErrorCode: Integer);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  client: Tclient;
   msg : string;
implementation

{$R *.dfm}

procedure Tclient.ClientSocketConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
   ClientSocket.Socket.SendText(msg);
       ClientSocket.Active := false;
end;

procedure Tclient.ClientSocketError(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
begin
   showmessage('에러');
    ErrorCode:=0;
end;

procedure Tclient.Button1Click(Sender: TObject);
begin
msg := 'w#' ;
ClientSocket.open();
end;

procedure Tclient.Button2Click(Sender: TObject);
begin
  msg := 'd#' ;
ClientSocket.open()
end;

procedure Tclient.Button3Click(Sender: TObject);
begin
       msg := 'gogogogogogogogogogo#' ;
ClientSocket.open()
end;

end.
<!--CodeE-->

클라이언트에서 서버로는 메세지 전송이 되는데..
다시 서버에서 그 해당 클라이언트로 메세지를 다시 보낼라면..
해당 프로그램에 각각 서버 . 클라이언트 소켓을 두개다 둬야될까요?
저번에는 해보니 잘안되서 인디로 일주일동안하다가...다시 기본소켓으로 넘어왔습니다..

그럼 조언좀 부탁드립니다.
1  COMMENTS
  • Profile
    허영일 2006.10.10 00:49
    소켓 프로그래밍이 처음이시군요!

    서버와 다중 클라이언트 연결시 서버는 멀티 쓰레드를 이용하여 각각의 클라이언트 객체마다

    소켓을 생성하도록 개발하셔야 합니다. 1:1의 경우 기존의 소켓을 이미 하나의 클라이언트가

    점유하고 있기 때문에 다른 클라이언트의 접근이 불가합니다.

    일반적으로 멀티 쓰레드를 이용한 소켓 프로그래밍 예제로 채팅 프로그램등이.. 있으니, 한번!

    오픈 소스를 중심으로 확인해 보시기 바랍니다. 감사합니다.