代码部分如下:
服务器端:
server UNIT:
procedure TFrmTcpServer.ServerExecute(AThread: TIdPeerThread);
var
CommBlock, NewCommBlock: TRecMsg;
RecThread: TIdPeerThread;//线程池
InputStream,ResStream:TStringStream;
i: Integer;
s,q:string;
begin
if not AThread.Terminated and AThread.Connection.Connected then
begin
这里用读BUFFER的形式,然后返回给客户端没有问题
// AThread.Connection.ReadBuffer(CommBlock,SizeOf(CommBlock));
//NewCommBlock := CommBlock;
//AThread.Connection.writebuffer(NewCommBlock, SizeOf(NewCommBlock), True);
InputStream:=TStringStream.Create(''); 以数据流的形式传
AThread.Connection.ReadStream(InputStream,AThread.Connection.ReadInteger,false);
s:=InputStream.DataString;
memo1.Lines.Add(s);
FreeAndNil(InputStream);
q:='OK';
ResStream:=TStringStream.Create(q);
AThread.Connection.OpenWriteBuffer;
AThread.Connection.WriteStream(ResStream);
AThread.Connection.CloseWriteBuffer;
FreeAndNil(ResStream);
end;
end;
服务器端可以支持多线程的,只是我这里将代码简化了。服务器端程序应该没有问题,只是以数据流的格式通讯的时候,客户端收不到,不知道要触发哪个事件。客户端:
在客户端有个线程的定义如下:
TClientHandleThread = class(TThread)
private
CB: TSendMsg;
ResStream:TStringStream;
s:string;
procedure HandleInput; protected
procedure Execute; override; end;procedure TClientHandleThread.HandleInput;
begin
s:=ResStream.DataString;
FrmClient.IncomingMessages.Lines.Add ('返回值为:'+s);
//FrmClient.IncomingMessages.Lines.Add ('返回值为:'+IntToStr(CB.sStateRet));
end;procedure TClientHandleThread.Execute;
begin
while not Terminated do
begin
if not FrmClient.Client.Connected then
Terminate
else
try
//FrmClient.Client.ReadBuffer(CB, SizeOf (CB));
以读BUFFER的形式读服务器端返回的数据,没有问题
FrmClient.Client.ReadStream(ResStream,-1,false);
读数据流的形式程序报错
Synchronize(HandleInput);
except
end;
end;
end;procedure TFrmClient.ButtonSendClick(Sender: TObject);
var
NewSendMsg:TSendMsg;
OutputStream:TStringStream;
s:string;
begin
{
NewSendMsg.lHdSize:=SizeOf(TSendMsg);
NewSendMsg.lTotalSize:=200;
NewSendMsg.hxdId:=123456;
NewSendMsg.sChannel:=1;
NewSendMsg.sStateRet:=0;
NewSendMsg.usFid:=10;
NewSendMsg.szFName:='Test';
NewSendMsg.nReserved1:=100;
Client.WriteBuffer (NewSendMsg, SizeOf (NewSendMsg), true);
这个是以写BUFFER的形式,没有问题,大家不用看,只是给大家一个参考。呵呵
}
s:='Test';
OutputStream := TStringStream.Create(s);
Client.OpenWriteBuffer;
Client.WriteStream(OutputStream,true,true,outputstream.size);
Client.CloseWriteBuffer;
FreeAndNil(OutputStream);
写数据流到服务器端没有问题,只是不知道客户端怎么读服务器端返回的值。
end;
另外说下,用BUFFER的形式,客户端是通过TClientHandleThread.Execute 过程来触发的。希望有人帮满解决下子,呵呵!
服务器端:
server UNIT:
procedure TFrmTcpServer.ServerExecute(AThread: TIdPeerThread);
var
CommBlock, NewCommBlock: TRecMsg;
RecThread: TIdPeerThread;//线程池
InputStream,ResStream:TStringStream;
i: Integer;
s,q:string;
begin
if not AThread.Terminated and AThread.Connection.Connected then
begin
这里用读BUFFER的形式,然后返回给客户端没有问题
// AThread.Connection.ReadBuffer(CommBlock,SizeOf(CommBlock));
//NewCommBlock := CommBlock;
//AThread.Connection.writebuffer(NewCommBlock, SizeOf(NewCommBlock), True);
InputStream:=TStringStream.Create(''); 以数据流的形式传
AThread.Connection.ReadStream(InputStream,AThread.Connection.ReadInteger,false);
s:=InputStream.DataString;
memo1.Lines.Add(s);
FreeAndNil(InputStream);
q:='OK';
ResStream:=TStringStream.Create(q);
AThread.Connection.OpenWriteBuffer;
AThread.Connection.WriteStream(ResStream);
AThread.Connection.CloseWriteBuffer;
FreeAndNil(ResStream);
end;
end;
服务器端可以支持多线程的,只是我这里将代码简化了。服务器端程序应该没有问题,只是以数据流的格式通讯的时候,客户端收不到,不知道要触发哪个事件。客户端:
在客户端有个线程的定义如下:
TClientHandleThread = class(TThread)
private
CB: TSendMsg;
ResStream:TStringStream;
s:string;
procedure HandleInput; protected
procedure Execute; override; end;procedure TClientHandleThread.HandleInput;
begin
s:=ResStream.DataString;
FrmClient.IncomingMessages.Lines.Add ('返回值为:'+s);
//FrmClient.IncomingMessages.Lines.Add ('返回值为:'+IntToStr(CB.sStateRet));
end;procedure TClientHandleThread.Execute;
begin
while not Terminated do
begin
if not FrmClient.Client.Connected then
Terminate
else
try
//FrmClient.Client.ReadBuffer(CB, SizeOf (CB));
以读BUFFER的形式读服务器端返回的数据,没有问题
FrmClient.Client.ReadStream(ResStream,-1,false);
读数据流的形式程序报错
Synchronize(HandleInput);
except
end;
end;
end;procedure TFrmClient.ButtonSendClick(Sender: TObject);
var
NewSendMsg:TSendMsg;
OutputStream:TStringStream;
s:string;
begin
{
NewSendMsg.lHdSize:=SizeOf(TSendMsg);
NewSendMsg.lTotalSize:=200;
NewSendMsg.hxdId:=123456;
NewSendMsg.sChannel:=1;
NewSendMsg.sStateRet:=0;
NewSendMsg.usFid:=10;
NewSendMsg.szFName:='Test';
NewSendMsg.nReserved1:=100;
Client.WriteBuffer (NewSendMsg, SizeOf (NewSendMsg), true);
这个是以写BUFFER的形式,没有问题,大家不用看,只是给大家一个参考。呵呵
}
s:='Test';
OutputStream := TStringStream.Create(s);
Client.OpenWriteBuffer;
Client.WriteStream(OutputStream,true,true,outputstream.size);
Client.CloseWriteBuffer;
FreeAndNil(OutputStream);
写数据流到服务器端没有问题,只是不知道客户端怎么读服务器端返回的值。
end;
另外说下,用BUFFER的形式,客户端是通过TClientHandleThread.Execute 过程来触发的。希望有人帮满解决下子,呵呵!
解决方案 »
- [游戏]渔人之利,大家活跃一下
- DATASET 加 dbgrid 编写程序时,如何知道客户修改了哪一行数据?并对这行数据的修改后的数值进行核对,如果错误则不保存,如果正确,就保
- 交叉表修改问题。高分
- 在线等!请问怎样才可以做成那样的窗体啊?
- 哪位高手给解释一下?我真是搞不明白它们的区别
- 找mp3控件的源码难吗????
- 打印证书(不同字体,不同字号)的操作应如何进行?
- 关于clientsocket和serversocket的传送数据问题
- 一个困扰了我很久的问题,关于用BDE连SQL SERVER,请大侠请教?
- 有本事的进来拿分!!!!!!(这里难道没有高手吗?)
- 请问 f:=StrtoFloat(inttostr(m));哪错了,为什么编译不过去呀.
- 如何获得可执行文件的公司名,或相关属性
另外说下,用BUFFER的形式,客户端是通过TClientHandleThread.Execute 过程来触发的。希望有人帮满解决下子,呵呵!
改成:
用BUFFER的形式,客户端(读取服务器端返回的数据)是通过TClientHandleThread.Execute 过程来触发的。希望有人帮满解决下子,呵呵!
写漏了几个字不好意思,如果大家不是很明白我说的意思,我再补充