Delphi tcp通信,想知道下面这段代码是那一个版本的,我在10.1 和 2010试了都不行

baidu_36063547 2016-12-22 11:59:00
unit Client_Unit;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, IdBaseComponent,
IdComponent, IdTCPConnection, IdTCPClient;

type
Tfrm_client = class(TForm)
btn_connect: TButton;
mmoInput: TMemo;
mmoOutput: TMemo;
edt_IP: TEdit;
edt_port: TEdit;
idtcpclnt1: TIdTCPClient;
btn_rest: TButton;
procedure btn_connectClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure btn_restClick(Sender: TObject);
private
{ Private declarations }
function SendStream(const AIdTCPClient: TIdTCPClient; const Aip: string;
const Aport:integer; var AsendStream,ARecvStream: string): integer;
procedure initipport;
public
{ Public declarations }
end;

var
frm_client: Tfrm_client;

implementation

{$R *.dfm}
procedure Tfrm_client.btn_connectClick(Sender: TObject);
var
msSend, msRecv:string;
amp: TStream;
iRet:integer;
a:STring;
ia:String;
begin
msSend := mmoinput.Text; //发送文本框中的内容  

//计算XML包文的长度,并按照协议保持六位数  
ia := IntToStr(Length(msSend));
if Length(ia) = 5 then ia := ia + ' '
else if Length(ia) = 4 then ia := ia+'  '
else if Length(ia) = 3 then ia := ia+'   '
else if Length(ia) = 2 then ia := ia+'    '
else if Length(ia) = 1 then ia := ia+'     '
else if Length(ia) > 6 then ia := leftstr(ia, 6); //10.1版本 leftstr用不了吗?

mssend := ia + edt_IP.Text + '006 ' +mssend; //按通信协议拼接需要通过socket发送的内容  
iRet := SendStream(IdTCPClnt1, trim(edt_IP.Text), strtoint(trim(edt_port.Text)),msSend,msRecv); //调用socket通信函数  

mmoOutput.Text:='';
mmoOutput.Lines.Add(msRecv); //把服务器返回的内容显示出来  
end;

procedure Tfrm_client.btn_restClick(Sender: TObject);
begin
initipport;
end;

procedure Tfrm_client.FormShow(Sender: TObject);
begin
initipport;
end;

procedure Tfrm_client.initipport;
begin
edt_IP.Text := '127.0.0.1';
edt_port.Text := '1111';
end;

function Tfrm_client.SendStream(const AIdTCPClient: TIdTCPClient; const Aip: string;
const Aport:integer; var AsendStream,ARecvStream: string): integer;
begin
result:=-1;
if AIdTCPClient = nil then exit;
if not AIdTCPClient.Connected then
begin
try
AIdTCPClient.Host := Aip;
AIdTCPClient.Port := Aport;
AIdTCPClient.Connect(200); //TCP建立连接 这里报错改下面可以
//AIdTCPClient.ConnectTimeout := 200   
except
result:=-2;
AIdTCPClient.Disconnect;
exit;
end;
end;
try
//下面这句也报错
aidtcpclient.Write(AsendStream); //直接把准备好发送的内容,写入缓冲区即可  
except
result:=-3;
AIdTCPClient.Disconnect;
exit;
end;
try
//接收 
//下面这句也报错 
ARecvStream:=aidtcpclient.CurrentReadBuffer(); //把服务器端返回的内容接收到。此处是直接把接收缓冲区的内容全部收完,没有按通信协议进行指定接收  
result:=1;
except
result:=-4;
AIdTCPClient.Disconnect;
exit;
end;
end;
end.

这段代码在网上找的,用的TIdTCPClient,在2010和xe10.1都有几处错误
谁有最基础的网络通信代码能告知一下吗
...全文
570 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
mdejtod 2016-12-23
  • 打赏
  • 举报
回复
// 发送内存流 try AIdTCPClient.IOHandler.WriteBufferOpen; AIdTCPClient.IOHandler.Write(FMemoryStream,FMemoryStream.Size); AIdTCPClient.IOHandler.WriteBufferclose; except end; //发送字节 TTCPHeader是一个packed 结构体,包括标识和各种数据 procedure TCPDataToBytes(pdata: TTCPHeader; var ibytes: TBytes); begin ibytes := nil; SetLength(ibytes,SizeOf(TTCPHeader)); CopyMemory(@ibytes[0],@pdata,SizeOf(pdata)); end; procedure TPlayGame.OnStopGame(Sender: TObject); var tcpdata : TTCPHeader; itime : TSystemTime; ibytes : TIdBytes; begin FillChar(tcpdata,SizeOf(TTCPHeader),0); tcpdata.TCPCommand := tcStopGameres; tcpdata.ClientID := GClient.ClientId; lstrcpy(tcpdata.Name,PChar(GClient.name)); lstrcpy(tcpdata.GlassesId,PChar(GClient.id)); TCPDataToBytes(tcpdata,ibytes); IdTCPClient.IOHandler.Write(ibytes,SizeOf(TTCPHeader)); ibytes := nil; end; //接收: IdTCPClient.IOHandler.ReadBytes(ibytes,SizeOf(FTCPData),False);
santiaodahan 2016-12-23
  • 打赏
  • 举报
回复
引用 5 楼 santiaodahan 的回复:
下载indy10 Demo,在Demo Base里有Client和Sever的示例源码。
在Demo Base\Client和Demo Base\Server下。
santiaodahan 2016-12-23
  • 打赏
  • 举报
回复
下载indy10 Demo,在Demo Base里有Client和Sever的示例源码。
mdejtod 2016-12-23
  • 打赏
  • 举报
回复
//程序启动时,绑定端口 procedure TfrmMain.BindingServer; var Binding: TIdSocketHandle; begin Binding := IdTCPServer.Bindings.Add; Binding.IP := GStack.LocalAddress; Binding.Port := 6060; IdTCPServer.Active := True; end;
mdejtod 2016-12-23
  • 打赏
  • 举报
回复
procedure TfrmMain.IdTCPServerExecute(AContext: TIdContext); var ibytes: TBytes; tcpdata: TTCPHeader; AGlasses: TGlasses; idx: Integer; playInfo: PPlayInfo; childnode: IXMLNode; pvolume : PSingle; begin if AContext.Connection.IOHandler.ClosedGracefully then Exit; if AContext.Connection.Connected then begin AGlasses := Pointer(AContext.Data); SetLength(ibytes, SizeOf(TTCPHeader)); AContext.Connection.IOHandler.ReadBytes(ibytes, SizeOf(TTCPHeader), False); BytesToTcpData(tcpdata, ibytes); case tcpdata.TCPCommand of tcUpdateClient://连接后客户端发送本机信息,更新客户端列表 begin AGlasses := UpdateClient(tcpdata.GlassesId, AContext, tcpdata); SendMessage(Handle, WM_UPDATEGLASSESLIST, 0, LongWord(AGlasses)); end; tcDisconnect: begin AContext.Connection.Disconnect; end; tcSendDesktop: begin end; tcStopScreenSPYRes: begin end; tcPlayGameRes: //创建倒计时线程,统计播放时间 begin tcStopGameres: //客户端通知停止播放 begin end; tcGetVolume : begin end; tcSetVolume : begin end; end; ibytes := nil; end; end;
baidu_36063547 2016-12-23
  • 打赏
  • 举报
回复
引用 1 楼 mdejtod 的回复:
// 发送内存流 try AIdTCPClient.IOHandler.WriteBufferOpen; AIdTCPClient.IOHandler.Write(FMemoryStream,FMemoryStream.Size); AIdTCPClient.IOHandler.WriteBufferclose; except end; //发送字节 TTCPHeader是一个packed 结构体,包括标识和各种数据 procedure TCPDataToBytes(pdata: TTCPHeader; var ibytes: TBytes); begin ibytes := nil; SetLength(ibytes,SizeOf(TTCPHeader)); CopyMemory(@ibytes[0],@pdata,SizeOf(pdata)); end; procedure TPlayGame.OnStopGame(Sender: TObject); var tcpdata : TTCPHeader; itime : TSystemTime; ibytes : TIdBytes; begin FillChar(tcpdata,SizeOf(TTCPHeader),0); tcpdata.TCPCommand := tcStopGameres; tcpdata.ClientID := GClient.ClientId; lstrcpy(tcpdata.Name,PChar(GClient.name)); lstrcpy(tcpdata.GlassesId,PChar(GClient.id)); TCPDataToBytes(tcpdata,ibytes); IdTCPClient.IOHandler.Write(ibytes,SizeOf(TTCPHeader)); ibytes := nil; end; //接收: IdTCPClient.IOHandler.ReadBytes(ibytes,SizeOf(FTCPData),False);
服务端简单的也帮我来一段哇

1,593

社区成员

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

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