局域网文件传输代码,文件传输的网上的一段代码???

文件传输的网上的一段代码??? - 故障解答 - 电脑教程网

文件传输的网上的一段代码???

日期:2007-03-03   荐:
文件传输的网上的一段代码???网上的一段代码,有点小问题,谁有调试好的啊,急啊如何可以的话,发到我的油箱,在下感激不尽.调试了半天实在无能为力. >>>>[email protected]谢谢!!!开始程序:写一个最简单的,主要用于讲解方法。定义协议:ConstMP_QUERY =’1’;MP_REFUSE =’2’;MP_ACCEPT =’3’;MP_NEXTWILLBEDATA=’4’;MP_DATA =’5’;MP_ABORT =’6’; MP_OVER =’7’;MP_CHAT =’8’;协议简介:首先由Client发送MP_QUERY,Server接受到后发送MP_ACCEPT或MP_FEFUESE;Client接受到MP_ACCEPT发送MP_FILEPROPERTY,Server接受到后发送MP_NEXTWILLBEDATA;Client接受到发送MP_NEXTWILLBEDATA,Server接受到后发送MP_DATA;Client接受到MP_DATA,发送数据,Server接受数据,并发送MP_NEXTWILLBEDATA;循环,直到Client发送MP_OVER;中间可以互相发送MP_CHAT String; Server程序:放上以下控件:SaveDialog1,btnStartServer,ss,(TServerSocket)btnStartServer.OnClick(Sender:TObject);beginss.Port:=2000;ss.Open;end;ss.OnClientRead(Sender: TObject;Socket: TCustomWinSocket);varsTemp:string;bufRecv:Pointer;iRecvLength:integer;beginif bReadText thenbeginsTemp:=Socket.ReceiveText;case sTemp[1] ofMP_QUERY:begin//在这里拒绝 SaveDialog1.FileName:=Copy(sTemp,2,Length(STemp));if SaveDialog1.Execute thenbegin Socket.SendText(MP_ACCEPT);fsRecv:=TFileStream.Create(SaveDialog1.FileName,fmCreate);endelse Socket.SendText(MP_REFUSE ’去死’);end;MP_FILEPROPERTY:begin//要发送StrToInt(Copy(sTemp,2,Length(sTemp))) 次//时间进度显示。。。Socket.SendText(MP_NEXTWILLBEDATA);end;MP_NEXTWILLBEDATA:beginSocket.SendText(MP_DATA);bReadText:=false;end;MP_END:beginfsRecv.FreebReadText:=true;end;MP_ABORT:beginfsRecv.Free; bReadText:=true; end;MP_CHAT:begin//Chat Msgend;end;{of case}endelse begintryGetMem(bufRecv,2000);//2000 must >iBYTESENDSocket.ReceiveBuf(bufRecv^,iRecvLength);fsRecv.WriteBuffer(bufRecv^,iRecvLength);finallyFreeMem(bufRecv,2000);end;{of try}bReadText:=true;Socket.SendText(MP_NEXTWILLBEDATA);end;end;Client程序:放上以下控件:edtIPAddress,OpenDialog1,btnConnect,btnSendFile,cs. (TClientSocket)btnConnect.OnClick(Sender:TObject);begincs.Address:=edtIPAddress.Text;cs.Port:=2000;cs.Connect;end;btnSendFile.OnClick(Sender:TObject);beginif OpenDialog1.Execute thenBegincs.Socket.SendText(MP_QUERY OpenDialog1.FileName);//FileSize???end; end;cs.OnRead(Sender: TObject;Socket: TCustomWinSocket);varsTemp:string;bufSend:pointer;beginsRecv:=Socket.ReceiveText;Case sRecv[1] ofMP_REFUSE:ShowMessage(’Faint,be refused!’);MP_ACCEPT:beginfsSend:=TFileStream.Create(OpenDialog1.FileName,fmOpen);//iBYTEPERSEND是个常量,每次发送包的大?gt;>?br>Socket.SendText(MP_FILEPROPERTY Trunc(fsSend.Size/iBYTEPERSEND) 1);end;MP_NEXTWILLBEDATA:beginSocket.SendText(MP_NEXTWILLBEDATA);end;MP_DATA:begintryGetMem(bufSend,iBYTEPERSEND 1);if (fsSend.Position 1 iBYTEPERSEND) < fsSend.Size thenbeginfsSend.Read(bufSend^,iBYTEPERSEND);Socket.SendBuf(bufSend^,iBYTEPERSEND);fsSend.Free;end//普通的发送,大小为iBYTEPERSENDelse beginfsSend.Read(bufSend^,fsSend.Size-fsSend.Position-1);Socket.SendBuf(bufSend^,fsSend.Size-fsSend.Position-1);end;//最后一次发送,发送剩余的数据finallyFreeMem(bufSend,iBYTEPERSEND 1);end;{of try}end;MP_ABORT:begin//被取消了:(fsSend.Free;end;end;{of case}end;整理程序:>>>>加入错误判断,优化程序,把Server和Client联合在一起,加入剩余时间进度显示,做成能一次传多个文件,加入聊天功能,就成了一个很好的点对点传文件的程序在线等,好象是接受文件那出错了。begin try ShowMessage('接收文件数据'); GetMem(bufRecv,2000);//2000 must >iBYTESEND Socket.ReceiveBuf(bufRecv^,iRecvLength); fsRecv.WriteBuffer(bufRecv^,iRecvLength); //fsRecv是TFileStream类型 //这样能把几次数据都写到那个文件里吗? finally FreeMem(bufRecv,2000);
标签: