OSDN Git Service

httpserver.exeはライブラリにパスを追加してください。コンポーネントが必要です。
[server-demo/server_demo.git] / Unit3.pas
1 unit Unit3;
2
3 interface
4
5 uses
6   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
7   System.Classes, Vcl.Graphics,
8   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, IdUDPServer, IdGlobal, IdSocketHandle,
9   IdBaseComponent, IdComponent, IdUDPBase, Vcl.StdCtrls, IdContext,
10   IdCustomTCPServer, IdTCPServer, IdTCPConnection, IdTCPClient, Vcl.ExtCtrls;
11
12 type
13   TMode = (cmServer, cmFindingServer, cmClient);
14
15   TForm3 = class(TForm)
16     IdUDPServer1: TIdUDPServer;
17     IdTCPServer1: TIdTCPServer;
18     IdTCPClient1: TIdTCPClient;
19     Timer1: TTimer;
20     ListBox1: TListBox;
21     Panel1: TPanel;
22     Panel2: TPanel;
23     Edit1: TEdit;
24     Button1: TButton;
25     Label1: TLabel;
26     Button2: TButton;
27     procedure IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
28       const AData: TIdBytes; ABinding: TIdSocketHandle);
29     procedure Button1Click(Sender: TObject);
30     procedure IdTCPServer1Execute(AContext: TIdContext);
31     procedure FormDestroy(Sender: TObject);
32     procedure Timer1Timer(Sender: TObject);
33     procedure Button2Click(Sender: TObject);
34   private
35     { Private \90é\8c¾ }
36   public
37     { Public \90é\8c¾ }
38     mode: TMode;
39     procedure broadcastMessage(str: string);
40   end;
41
42 var
43   Form3: TForm3;
44
45 implementation
46
47 {$R *.dfm}
48
49 procedure TForm3.broadcastMessage(str: string);
50 var
51   i: integer;
52   s: TIdContext;
53 begin
54   with IdTCPServer1.Contexts.LockList do
55     for i := 0 to Count-1 do
56     begin
57       s:=Items[i];
58       s.Connection.IOHandler.Write(str);
59     end;
60   IdTCPServer1.Contexts.UnlockList;
61 end;
62
63 procedure TForm3.Button1Click(Sender: TObject);
64 begin
65   if mode = TMode.cmClient then
66     IdTCPClient1.IOHandler.Write(Edit1.Text)
67   else
68     broadcastMessage(Edit1.Text);
69 //  ListBox1.Items.Insert(0, Edit1.Text);
70 end;
71
72 procedure TForm3.Button2Click(Sender: TObject);
73 begin
74   IdUDPServer1.Broadcast('\83T\81[\83o\81[\82 \82é\81H', IdUDPServer1.DefaultPort);
75   mode := TMode.cmFindingServer;
76 end;
77
78 procedure TForm3.FormDestroy(Sender: TObject);
79 begin
80   IdUDPServer1.Active := false;
81   IdTCPServer1.Active := false;
82 end;
83
84 procedure TForm3.IdTCPServer1Execute(AContext: TIdContext);
85 var
86   s: string;
87 begin
88   s := AContext.Connection.IOHandler.ReadLn(#13#10);
89   ListBox1.Items.Insert(0, s);
90   broadcastMessage(s);
91 end;
92
93 procedure TForm3.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
94   const AData: TIdBytes; ABinding: TIdSocketHandle);
95 var
96   s: string;
97   ip: string;
98 begin
99   s := string(AData);
100   ip := ABinding.PeerIP;
101   if s = '\83T\81[\83o\81[\82 \82é\81H' then
102   begin
103     mode := TMode.cmServer;
104     s := '\8e\84\82Í\83T\81[\83o\81[';
105     IdUDPServer1.Send(ip, IdUDPServer1.DefaultPort, s);
106   end
107   else if s = '\8e\84\82Í\83T\81[\83o\81[' then
108   begin
109     mode := TMode.cmClient;
110     IdTCPClient1.Host := ip;
111     IdTCPClient1.Connect;
112   end;
113 end;
114
115 procedure TForm3.Timer1Timer(Sender: TObject);
116 begin
117   Timer1.Enabled := false;
118   if mode <> TMode.cmFindingServer then
119   begin
120     Label1.Caption := '\90Ú\91±';
121     Exit;
122   end
123   else
124     Label1.Caption := '\90Ú\91±\82µ\82Ä\82¢\82Ü\82¹\82ñ';
125   mode := TMode.cmServer;
126   IdTCPServer1.Active := true;
127 end;
128
129 end.