请教:有关IdTCPServer和IdTCPClient如何处理和发送带参数的命令?

luxuewei5214 2005-06-30 03:28:33
在IdTCPServer中有属性CommandHandlers,可以处理IdTCPClient发来的命令,但IdTCPClient如何发送带参数的命令,IdTCPServer如何处理带参数的命令呢?查了好多资料没有结果,只好来请教大虾们了。
...全文
223 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
luxuewei5214 2005-07-08
  • 打赏
  • 举报
回复
都好几天了,我看是没什么结果了,算了,大家也辛苦了,揭帖喽!
「已注销」 2005-07-07
  • 打赏
  • 举报
回复
2,服务器端代码
a.frmMain.pas
--------------
unit frmMain;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPServer, ComCtrls,
IdSocketHandle;

type
TClientInfo = class
name: string;
constructor create(AName: string); overload;
end;
TForm1 = class(TForm)
IdTCPServer1: TIdTCPServer;
ListBox1: TListBox;
Label1: TLabel;
Label2: TLabel;
txtIp: TEdit;
Label3: TLabel;
txtPort: TEdit;
btRun: TButton;
btStop: TButton;
StatusBar1: TStatusBar;
procedure btRunClick(Sender: TObject);
procedure btStopClick(Sender: TObject);
procedure IdTCPServer1Connect(AThread: TIdPeerThread);
procedure IdTCPServer1Disconnect(AThread: TIdPeerThread);
procedure IdTCPServer1Execute(AThread: TIdPeerThread);
procedure IdTCPServer1dateCommand(ASender: TIdCommand);
procedure IdTCPServer1NoCommandHandler(ASender: TIdTCPServer;
const AData: String; AThread: TIdPeerThread);
private
{ Private declarations }
Clients: TList;
public
{ Public declarations }
Constructor Create(AOwner: TComponent); override;
destructor destroy; override;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btRunClick(Sender: TObject);
var
sh: TIdSocketHandle;
begin
sh := IdTCPServer1.Bindings.Add;
sh.IP := txtIp.Text;
sh.Port := strToInt(txtPort.Text);
try
IdTCPServer1.Active := true;
txtIp.Enabled := false;
txtPort.Enabled := false;
StatusBar1.SimpleText := '·þÎñÒÑÆô¶¯';
btStop.Enabled := true;
btRun.Enabled := false;
except
IdTCPServer1.Bindings.Clear;
ShowMessage('·þÎñÆô¶¯Ê§°Ü');
end;
end;

procedure TForm1.btStopClick(Sender: TObject);
var
i: integer;
begin
{ for i := 0 to Clients.Count-1 do
begin
if Assigned(Clients[i]) and (TIdPeerThread(Clients[i]).Connection.Connected) then
begin
TIdPeerThread(Clients[i]).Connection.WriteLn('good bye');
end;
end;}
try
IdTCPServer1.Active := false;
except

end;
IdTCPServer1.Bindings.Clear;
txtIp.Enabled := true;
txtPort.Enabled := true;
StatusBar1.SimpleText := '·þÎñÒÑÍ£Ö¹';
btRun.Enabled := true;
btStop.Enabled := false;
end;

{ TClientInfo }

constructor TClientInfo.create(AName: string);
begin
inherited Create;
Name := AName;
end;

constructor TForm1.Create(AOwner: TComponent);
begin
inherited;
Clients := TList.Create;
end;

destructor TForm1.destroy;
var
i: integer;
begin
for i := 0 to Clients.Count -1 do
begin
if Assigned(Clients[i]) then
TClientInfo(Clients[i]).Free;
end;
Clients.Free;
inherited;
end;

procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);
begin
AThread.Data := TClientInfo.create('noname');
Clients.Add(Pointer(AThread));
end;

procedure TForm1.IdTCPServer1Disconnect(AThread: TIdPeerThread);
var
i: integer;
begin
for i := 0 to listBox1.Count-1 do
begin
if TClientInfo(AThread.Data).name = listBox1.Items[i] then
listBox1.Items.Delete(i);
end;
Clients.Remove(AThread);

end;

procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
begin
{var
str: string;
begin
if TClientInfo(AThread.Data).name = 'noname' then
(AThread.Data as TClientInfo).name := AThread.Connection.ReadLn()
else begin
str := AThread.Connection.ReadLn();

end;}
end;

procedure TForm1.IdTCPServer1dateCommand(ASender: TIdCommand);
var
format: string;
begin
format := 'yyyyÄêmmÔÂddÈÕ';
if ASender.Params.Count >0 then
format := ASender.Params[0];
ASender.Thread.Connection.WriteLn(FormatDateTime(format, Now));
end;

procedure TForm1.IdTCPServer1NoCommandHandler(ASender: TIdTCPServer;
const AData: String; AThread: TIdPeerThread);
begin
if TClientInfo(AThread.Data).name = 'noname' then
begin
TClientInfo(AThread.Data).name := AData;
ListBox1.Items.Add(AData);
end
else begin
AThread.Connection.WriteLn('ÎÞЧµÄÃüÁî');
end;
end;

end.

「已注销」 2005-07-07
  • 打赏
  • 举报
回复
b.frmMain.dfm
-------------------
object Form2: TForm2
Left = 192
Top = 134
Width = 696
Height = 480
Caption = 'Form2'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object Label1: TLabel
Left = 448
Top = 24
Width = 60
Height = 13
Caption = #25105#30340#21517#23383#65306
end
object Label2: TLabel
Left = 48
Top = 280
Width = 58
Height = 13
Caption = #26381#21153#22120'IP'#65306
end
object Label3: TLabel
Left = 24
Top = 320
Width = 72
Height = 13
Caption = #26381#21153#22120#31471#21475#65306
end
object Label4: TLabel
Left = 8
Top = 16
Width = 36
Height = 13
Caption = #21629#20196#65306
end
object Label5: TLabel
Left = 96
Top = 16
Width = 36
Height = 13
Caption = #21442#25968#65306
end
object txtCmd: TEdit
Left = 40
Top = 16
Width = 49
Height = 21
TabOrder = 0
Text = '/date'
end
object Button1: TButton
Left = 240
Top = 16
Width = 75
Height = 25
Caption = #21457#36865
TabOrder = 2
OnClick = Button1Click
end
object txtName: TEdit
Left = 512
Top = 21
Width = 121
Height = 21
TabOrder = 3
Text = 'fangys'
end
object txtIp: TEdit
Left = 112
Top = 277
Width = 121
Height = 21
TabOrder = 5
Text = '127.0.0.1'
end
object txtPort: TEdit
Left = 112
Top = 317
Width = 121
Height = 21
TabOrder = 7
Text = '9099'
end
object btConn: TButton
Left = 280
Top = 280
Width = 75
Height = 25
Caption = #36830#25509
TabOrder = 6
OnClick = btConnClick
end
object btBreak: TButton
Left = 280
Top = 320
Width = 75
Height = 25
Caption = #26029#24320
Enabled = False
TabOrder = 8
OnClick = btBreakClick
end
object StatusBar1: TStatusBar
Left = 0
Top = 434
Width = 688
Height = 19
Panels = <>
SimpleText = #26410#36830#25509
end
object Memo1: TMemo
Left = 16
Top = 64
Width = 233
Height = 121
Lines.Strings = (
'Memo1')
TabOrder = 4
end
object txtParam: TEdit
Left = 128
Top = 16
Width = 105
Height = 21
TabOrder = 1
Text = 'mm'#26376'dd'#26085'yyyy'#24180
end
object IdTCPClient1: TIdTCPClient
MaxLineAction = maException
ReadTimeout = 0
OnConnected = IdTCPClient1Connected
Port = 0
Left = 32
Top = 392
end
end

「已注销」 2005-07-07
  • 打赏
  • 举报
回复
我把源码贴上来,测试通过的。你把它拷到Delphi里去编译运行一下。
1,tcp客户端
a,frm.pas
-----------
unit frmMain;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
IdTCPClient, ComCtrls;

type
TForm2 = class(TForm)
IdTCPClient1: TIdTCPClient;
txtCmd: TEdit;
Button1: TButton;
txtName: TEdit;
Label1: TLabel;
txtIp: TEdit;
Label2: TLabel;
txtPort: TEdit;
Label3: TLabel;
btConn: TButton;
btBreak: TButton;
StatusBar1: TStatusBar;
Memo1: TMemo;
Label4: TLabel;
Label5: TLabel;
txtParam: TEdit;
procedure btConnClick(Sender: TObject);
procedure btBreakClick(Sender: TObject);
procedure IdTCPClient1Connected(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.btConnClick(Sender: TObject);
begin
IdTCPClient1.Host := txtIp.Text;
IdTCPClient1.Port := StrToInt(txtPort.Text);
IdTCPClient1.Connect;
StatusBar1.SimpleText := 'ÒÑÓë·þÎñÆ÷Á¬½Ó';
btConn.Enabled := false;
txtIp.Enabled := false;
txtPort.Enabled := false;
btBreak.Enabled := true;
end;

procedure TForm2.btBreakClick(Sender: TObject);
begin
IdTCPClient1.Disconnect;
StatusBar1.SimpleText := 'δÁ¬½Ó';
btConn.Enabled := true;
btBreak.Enabled := false;
txtIp.Enabled := true;
txtPort.Enabled := true;
end;

procedure TForm2.IdTCPClient1Connected(Sender: TObject);
var
str: string;
begin
IdTCPClient1.WriteLn(trim(txtName.Text));

end;

procedure TForm2.Button1Click(Sender: TObject);
var
str: string;
begin
if not IdTCPClient1.Connected then
begin
showmessage('δÁ¬½Ó·þÎñÆ÷');
exit;
end;
IdTCPClient1.Writeln(trim(txtCmd.Text)+trim(txtParam.Text));
str := IdTCPClient1.ReadLn();
Memo1.Lines.Add(str);
if str = 'good bye' then
btBreak.Click;
end;

end.

vinsonshen 2005-07-04
  • 打赏
  • 举报
回复
up
luxuewei5214 2005-07-04
  • 打赏
  • 举报
回复
关于线程的的问题我已解决,使用临界区方法即可。第一个问题还没解决,demo里也没有使用带参的例子啊
constantine 2005-07-04
  • 打赏
  • 举报
回复
我只是用来播放mp3音频,只是希望多个线程发出命令后,mediaplayer能按顺序播放就可以了。
何必用多个呢,写一个播放列表,根据命令添加对应的文件到后面,mp播完一首,就播下一首就行了
在通知事件中写操作就可以了
如果用Twindowsmediaplayer 控件,更简单,直接写当前播放流表就行了,如果不用循环,基本就做
流表添加更删除就行了,播放控制的可以不用,因为他会自动播下一首,如果要循环就在
播放状态改变的事件中在调用play 函数就ok了
luxuewei5214 2005-07-04
  • 打赏
  • 举报
回复
我只是用来播放mp3音频,只是希望多个线程发出命令后,mediaplayer能按顺序播放就可以了。
cnmaxu 2005-07-02
  • 打赏
  • 举报
回复
你的第二个问题有用到线程同步么?
如果有的话那就要注意了,因为播放媒体文件是很费CPU资源的,
尤其是画面质量特别好的情况,如果这个时候你再两个线程去播放,
而且还有同步方法的法,恐怕CPU承受不住吧。
cnmaxu 2005-07-02
  • 打赏
  • 举报
回复
本来是想建议楼主自己也字符串传递,自己定义协议自己解析,但看来不行,
呵呵,楼主是想省点事儿,那就没有办法了, CommandHandlers 还真是没有用过,
~关注~
luxuewei5214 2005-07-01
  • 打赏
  • 举报
回复
我顶!看能不能顶到答案呢。
cjf1009 2005-07-01
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/topic/3772/3772273.xml?temp=.4501764

不知你说的是不是这个意思
luxuewei5214 2005-07-01
  • 打赏
  • 举报
回复
就是想用属性CommandHandlers,能传参数就不用自己来判断了啊
imho888 2005-07-01
  • 打赏
  • 举报
回复
自己设置参数结构(协议),也就是数据结构,在server端读取结构数据进行处理就行了。
lovend 2005-06-30
  • 打赏
  • 举报
回复
帮你顶
constantine 2005-06-30
  • 打赏
  • 举报
回复
你那样做不太行吧,一个控件怎么可能播两个文件,如果要先后何必用2个线程处理
constantine 2005-06-30
  • 打赏
  • 举报
回复
不懂,什么参数命令,学习
luxuewei5214 2005-06-30
  • 打赏
  • 举报
回复
另外,当两个线程同时调用一个MediaPlayer控件时,播放声音(n个文件)不连续是为什么?只有先调用的断断续续播完,下一个才能连续播完。

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧