1 //Use IdContext,IdGlobal这两个单元
2 //不能使用string类型,在分存分配时会出错的。
3
4 unit Unit1;
5
6 interface
7
8 uses
9 System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
10 FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.ScrollBox,
11 FMX.Memo, FMX.Controls.Presentation, FMX.StdCtrls, IdTCPConnection,
12 IdTCPClient, IdBaseComponent, IdComponent, IdCustomTCPServer, IdTCPServer,
13 IdContext, IdIOHandler, Data.DBByteBuffer, IdGlobal, FMX.Edit, FMX.Objects;
14
15 //常量区
16 const
17 ServerPort = 1239;
18
19 //基础数据类型
20
21 //方案一:手机不支持这种的
22 //type
23 // TUser = record
24 // UserName,UserID:String[20];
25 // IP:String[16];
26 // Port:Integer;
27 // Msg:String[100];
28 // Arr:Array[1..9] of String[20];
29 // flag:Boolean;
30 // Cmd:String[20];
31 //end;
32
33 //方案二:手机PC都支持
34 type
35 TUser = record
36 UserName, UserID:String;
37 IP: String;
38 Port: Integer;
39 Msg: String;
40 Arr: Array[1..9] of String;
41 flag: Boolean;
42 Cmd: String;
43 end;
44
45
46 //方案三:记录指针
47 TSMSHead = packed record
48 SequenceID: Integer;
49 CommandID: Integer;
50 TotalLength: Integer;
51 end;
52 PSMSHead = ^TSMSHead;
53
54 TSMSCOnnect= packed record
55 Head: TSMSHead;
56 UID: array[0..19] of char;
57 PWD: array[0..19] of char;
58 Version: Byte;
59 end;
60 PSMSCOnnect= ^TSMSConnect;
61
62
63
64 type
65 TForm1 = class(TForm)
66 IdTCPServer1: TIdTCPServer;
67 IdTCPClient1: TIdTCPClient;
68 Button1: TButton;
69 Button2: TButton;
70 Button3: TButton;
71 Button4: TButton;
72 Memo1: TMemo;
73 Label1: TLabel;
74 Button5: TButton;
75 Button6: TButton;
76 Edit1: TEdit;
77 Label3: TLabel;
78 Image1: TImage;
79 procedure Button3Click(Sender: TObject);
80 procedure IdTCPServer1Connect(AContext: TIdContext);
81 procedure Button4Click(Sender: TObject);
82 procedure Button5Click(Sender: TObject);
83 procedure Button6Click(Sender: TObject);
84 procedure IdTCPServer1Execute(AContext: TIdContext);
85 procedure Button1Click(Sender: TObject);
86 procedure Button2Click(Sender: TObject);
87 private
88 { Private declarations }
89 public
90 { Public declarations }
91 FileSize: Int64;//发送文件时用到,保存文件大小。
92 end;
93
94 var
95 Form1: TForm1;
96
97 implementation
98
99 {$R *.fmx}
100 {$R *.SmXhdpiPh.fmx ANDROID}
101 {$R *.NmXhdpiPh.fmx ANDROID}
102
103 //连接服务器
104 procedure TForm1.Button3Click(Sender: TObject);
105 begin
106 IdTCPClient1.Host:= Edit1.Text; //服务器的IP
107 IdTCPClient1.Port:= ServerPort; //服务器的端口
108 IdTCPClient1.Connect; //连接服务器
109 //必须连接成功后才可以,放前面会报错
110 IdTCPClient1.IOHandler.DefStringEncoding := IndyTextEncoding_UTF8(); //中文处理
111 end;
112
113 //连接提示
114 procedure TForm1.IdTCPServer1Connect(AContext: TIdContext);
115 begin
116 AContext.Connection.IOHandler.DefStringEncoding := IndyTextEncoding_UTF8(); //中文处理
117 Memo1.Lines.Add('有用户连接');
118 Memo1.Lines.Add('');
119 end;
120
121 //记录类型(TIdBytes)
122 procedure TForm1.Button4Click(Sender: TObject);
123 var
124 User: TUser;
125 sby: TIdBytes;
126 begin
127 with user do
128 begin
129 UserName := 'Wyatt';
130 UserID := '7895421';
131 Ip:= '192.168.1.188';
132 Port := 9999;
133 Msg := 'ABC';
134 cmd := 'Quit';
135 end;
136 sBy := RawTOBytes(user, sizeof(user));
137 IdTCPClient1.IOHandler.Write(sBy);
138 end;
139
140 //记录类型(TMemoryStream)
141 procedure TForm1.Button5Click(Sender: TObject);
142 var
143 User: TUser;
144 Mon: TMemoryStream;
145 begin
146 with user do
147 begin
148 UserName := 'Wyatt';
149 UserID := '85171659';
150 Ip := '192.168.1.188';
151 Port := 9999;
152 Msg := '4567';
153 cmd := 'Quit';
154 end;
155 Mon := TMemoryStream.Create;
156 try
157 Mon.WriteBuffer(user, sizeof(user));
158 IdTCPClient1.IOHandler.Write(Mon);
159 finally
160 Mon.Free;
161 end;
162 end;
163
164 //记录指针(TIdBytes)
165 procedure TForm1.Button1Click(Sender: TObject);
166 var
167 pkt: TSMSConnect;
168 buf: TIdBytes;
169 begin
170 // 填写pkt
171 pkt.Head.SequenceID := 1000;
172 pkt.Head.CommandID := 119;
173 StrLCopy(pkt.UID, 'I love you 你好', SizeOf(pkt.UID));
174 // ...
175 // 准备缓冲区数据
176 SetLength(buf, SizeOf(TSMSConnect));
177 Move(pkt, buf[0], SizeOf(TSMSConnect));
178 IdTCPClient1.Socket.Write(buf);
179 end;
180
181 //发送文件(TFileStream)
182 procedure TForm1.Button2Click(Sender: TObject);
183 var
184 oTmpStream: TFileStream;
185 begin
186 Try
187 oTmpStream := TFileStream.Create('E:\123.jpg', fmOpenRead);
188 oTmpStream.Position := 0;
189 FileSize := oTmpStream.Size;
190 IdTCPClient1.IOHandler.Write(oTmpStream);
191 oTmpStream.Free;
192 except
193 //
194 end;
195 end;
196
197 //Byte方法(未实现)
198 procedure TForm1.Button6Click(Sender: TObject);
199 const
200 data: array[0..32] of Byte = (23, 32, 3, 1, 23, 25, 0, 8, 0, 86, 49, 46, 48, 46, 48, 46, 48, 4, 0, 57, 48, 50, 53, 5, 0, 77, 65, 67, 80, 67, 1, 12, 15);
201 var
202 ReqBuf, RespBuf: TIdBytes;
203 I: Integer;
204 begin
205 SetLength(ReqBuf, 33);
206 for I := 0 to Length(ReqBuf) - 1 do
207 begin
208 ReqBuf[I] := data[I];
209 end;
210 try
211 IdTCPClient1.IOHandler.Write(ReqBuf);
212 except
213 on e: Exception do
214 begin
215 ShowMessage('发送' + e.Message);
216 Exit;
217 end;
218 end;
219 end;
220
221 //发送字符串(string)
222 procedure TForm1.Button7Click(Sender: TObject);
223 begin
224 //发送文本
225 IdTCPClient1.IOHandler.writeln(Memo1.Text);
226 end;
227
228 procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
229 //接收string字符串
230 var
231 TempStr: string;
232 begin
233 //服务器接收
234 TempStr := AContext.Connection.IOHandler.ReadLn;
235 Memo1.Lines.Add(TempStr);
236
237 ////接收文件流
238 //var
239 // omStream: TMemoryStream;
240 //begin
241 // omStream := TMemoryStream.Create;
242 // AContext.Connection.IOHandler.ReadStream(omStream, FileSize);
243 // omStream.SaveToFile('E:\01.jpg');
244 // omStream.Free;
245
246 //接收记录类型(TIdBytes)
247 //var
248 // user: TUser;
249 // buf: TidBytes;
250 //begin
251 // Acontext.Connection.IOHandler.ReadBytes(buf, sizeof(user));
252 // BytesToRaw(buf, user, sizeof(user));
253 // with user, memo1.Lines do
254 // begin
255 // Add(userName);
256 // add(userID);
257 // add(ip);
258 // add(inttostr(port));
259 // add(Msg);
260 // add(cmd);
261 // add('');
262 // end;
263
264 //接收记录类型(TMemoryStream)
265 //var
266 // user: TUser;
267 // Mon: TMemoryStream;
268 //begin
269 // Mon := TMemoryStream.Create;
270 // try
271 // AContext.Connection.IOHandler.ReadStream(Mon);
272 // Mon.ReadBuffer(user, Sizeof(user)); //Indy 10必须将记录类型转换为TidBytes类型才能发送
273 // with user, memo1.Lines do
274 // begin
275 // Add(userName);
276 // add(userID);
277 // add(ip);
278 // add(inttostr(port));
279 // add(Msg);
280 // add(cmd);
281 // add('');
282 // end;
283 // finally
284 // Mon.Free;
285 // end;
286
287 //接收记录指针(TIdBytes)
288 //var
289 // pkt: PSMSConnect;
290 // buf: TIdBytes;
291 //begin
292 // SetLength(buf, SizeOf(TSMSConnect));
293 // AContext.Connection.Socket.ReadBytes(buf, SizeOf(TSMSConnect), False);
294 // pkt := PSMSConnect(@buf[0]);
295 // Assert(pkt.Head.SequenceID = 1000);
296 // Memo1.Lines.Add(pkt.UID);
297 // Memo1.Lines.Add('');
298 end;
299
300 end.