서버는한대이고서버에서 클라이언트의 메세지를 받습니다.
요청이 들어오면 그요청이 무엇인지...체크하고 다시 클라이언트에 관련된 리턴값을 줘야됩니다.
지금은 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:1의 경우 기존의 소켓을 이미 하나의 클라이언트가
점유하고 있기 때문에 다른 클라이언트의 접근이 불가합니다.
일반적으로 멀티 쓰레드를 이용한 소켓 프로그래밍 예제로 채팅 프로그램등이.. 있으니, 한번!
오픈 소스를 중심으로 확인해 보시기 바랍니다. 감사합니다.