以前没有接触过网络编程,照着demo做了一个发觉传送简单字符串可以,但传送流确失败了。主要就是客户端发送请求,服务端收到请求后检索数据,然后传送回客户端处理。但是客户端收不到服务端发回的信息。
请大家指导,或者给出更好的方法。谢谢客户端:
procedure TForm1.Button1Click(Sender: TObject);
var
s: string;
AStream: TStringStream;
begin
server.Active := True;
client1.Connect;
if client1.Connected then
begin
AStream := TStringStream.Create('');
bstream := TStringStream.Create('');
try
xml处理…… xml.SaveToStream(AStream);
client1.OpenWriteBuffer;
client1.WriteStream(AStream);
client1.CloseWriteBuffer; AStream.Size := 0;
client1.ReadStream(AStream); // 到这里就没有响应了
AStream.Seek(0, soFromBeginning);
xml.LoadFromStream(AStream); xml处理……
finally
AStream.Free;
client1.Disconnect;
end;
end;
end;procedure TForm1.ServerExecute(AThread: TIdPeerThread);
var
sRequest: string;
aStream: TStringStream;
RootNode, InfoNode: IXMLNode;
ParmNodes: IXMLNodeList;
begin
with AThread.Connection do
begin
aStream := TStringStream.Create('');
try
ReadStream(aStream);
AStream.Seek(0, soFromBeginning);
xml.LoadFromStream(aStream); xml处理……
if sRequest = 'GET' then
begin
aStream.size := 0;
GetInfo(InfoNode.ChildNodes, aStream);
showmessage(astream.DataString);
OpenWriteBuffer;
WriteStream(aStream);
CloseWriteBuffer;
end;
finally
aStream.Free;
disconnect;
end;
end;
end;
请大家指导,或者给出更好的方法。谢谢客户端:
procedure TForm1.Button1Click(Sender: TObject);
var
s: string;
AStream: TStringStream;
begin
server.Active := True;
client1.Connect;
if client1.Connected then
begin
AStream := TStringStream.Create('');
bstream := TStringStream.Create('');
try
xml处理…… xml.SaveToStream(AStream);
client1.OpenWriteBuffer;
client1.WriteStream(AStream);
client1.CloseWriteBuffer; AStream.Size := 0;
client1.ReadStream(AStream); // 到这里就没有响应了
AStream.Seek(0, soFromBeginning);
xml.LoadFromStream(AStream); xml处理……
finally
AStream.Free;
client1.Disconnect;
end;
end;
end;procedure TForm1.ServerExecute(AThread: TIdPeerThread);
var
sRequest: string;
aStream: TStringStream;
RootNode, InfoNode: IXMLNode;
ParmNodes: IXMLNodeList;
begin
with AThread.Connection do
begin
aStream := TStringStream.Create('');
try
ReadStream(aStream);
AStream.Seek(0, soFromBeginning);
xml.LoadFromStream(aStream); xml处理……
if sRequest = 'GET' then
begin
aStream.size := 0;
GetInfo(InfoNode.ChildNodes, aStream);
showmessage(astream.DataString);
OpenWriteBuffer;
WriteStream(aStream);
CloseWriteBuffer;
end;
finally
aStream.Free;
disconnect;
end;
end;
end;
1:
客户端:
try
begin
OpenWriteBuffer;
WriteStream(OutputStream);
CloseWriteBuffer;
finally
disconnect;
end;服务端:
ReadStream(InputStream,-1,true);2:
客户端:
OpenWriteBuffer;
WriteStream(OutputStream,true,true,outputstream.size);
CloseWriteBuffer;服务端:
ReadStream(InputStream,athread.connection.readinteger,false);
其中athread.connection.readinteger存的是流的字节数大小。这样你就可参接到数据了。
客户端
procedure TForm1.Button1Click(Sender: TObject);
var
s: string;
RootNode, InfoNode, ParmNode: IXMLNode;
begin
client1.Connect;
if client1.Connected then
begin
try
xml.Active := True;
xml.ChildNodes.Clear;
xml.Encoding := 'GB2312';
RootNode := xml.AddChild('xml-root');
InfoNode := RootNode.AddChild('type');
InfoNode.Text := 'get';
InfoNode := RootNode.AddChild('parameter');
ParmNode := InfoNode.AddChild('xm');
ParmNode.Text := Trim(edit1.Text); client1.WriteLn(xml.XML.Text); xml.LoadFromXML(client1.ReadLn);
RootNode := xml.DocumentElement;
ReadInfo(RootNode.ChildNodes);
finally
client1.Disconnect;
end;
end;
end;
服务端:
procedure TForm1.ServerExecute(AThread: TIdPeerThread);
var
sRequest: string;
sReponse: string;
RootNode, InfoNode: IXMLNode;
ParmNodes: IXMLNodeList;
begin
with AThread.Connection do
begin
try
xml.LoadFromXML(ReadLn);
RootNode := xml.DocumentElement;
InfoNode := RootNode.ChildNodes['type'];
sRequest := UpperCase(InfoNode.Text);
InfoNode := RootNode.ChildNodes['parameter'];
if sRequest = 'GET' then
begin
GetInfo(InfoNode.ChildNodes, sReponse);
WriteLn(sReponse);
end;
finally
disconnect;
end;
end;
end;