小弟遇到一文件传输的难题,很急,,Socket文件传输。。
服务器端用C++写的接收文件方法,现在客户端用DELPHI写怎么才能把文件成功传到服务器. 
小弟没写过过网络程序,
服务器端就知道IP地址和端口,客户端我用TCLIENTSOCKET传输不上去,但服务器端用DELPHI的SERVERSOCKET就行,现在不知问题出现在哪。。 

解决方案 »

  1.   

    偶也写了个socket的程序,
    用cb5.0写的,
    传文件是读取2进制再发送,
    在服务器端写入就ok了,
    应该不会有兄弟说的情况吧,
    要不你把代码贴出来看看
      

  2.   

    用 WinSocket进行文件传输 跟用什么语言开发没有关系的
    重要的是看看 定义的传输协议是否有问题
      

  3.   

    谢谢大家!!
    服务器端程序我没有啊!服务器端只知道端口,客户端我用TClientSocket控件,
    用的SendText方法,没法传上去啊!请大家帮帮忙啊!
      

  4.   

    SendText只适合文本内容;
    你要传文件要用SENDBUF或者采取流的方式,用SENDSTREAM方法!
    (传输的时候协议方面要和C的相同,协议相同了就没有语言的差别了,socket本身就是走底层,不要怀疑语言的问题,查查你的方法是否和C服务器的相同)具体的方式可以查到相关的资料,网上有很多,下面给你贴一个例子:开始程序:
    写一个最简单的,主要用于讲解方法。
    定义协议:
    Const
    MP_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);
    begin
      ss.Port:=2000;
      ss.Open;
    end;ss.OnClientRead(Sender: TObject;Socket: TCustomWinSocket);
    var
      sTemp:string;
      bufRecv:Pointer;
      iRecvLength:integer;
    begin
      if bReadText then
      begin
        sTemp:=Socket.ReceiveText;
        case sTemp[1] of
          MP_QUERY:
            begin
            //在这里拒绝 
              SaveDialog1.FileName:=Copy(sTemp,2,Length(STemp));
              if SaveDialog1.Execute then
              begin 
                Socket.SendText(MP_ACCEPT);
                fsRecv:=TFileStream.Create(SaveDialog1.FileName,fmCreate);
              end
              else Socket.SendText(MP_REFUSE+’去死’);
            end;
          MP_FILEPROPERTY:
            begin
               //要发送StrToInt(Copy(sTemp,2,Length(sTemp))) 次
               //时间进度显示
              Socket.SendText(MP_NEXTWILLBEDATA);
            end;
          MP_NEXTWILLBEDATA:
            begin
              Socket.SendText(MP_DATA);
              bReadText:=false;
            end;
          MP_END:
            begin
              fsRecv.Free
              bReadText:=true;
            end;
          MP_ABORT:
            begin
              fsRecv.Free; 
              bReadText:=true; 
            end;
          MP_CHAT:
            begin
              //Chat Msg
            end;
        end;{of case}
      end
      else begin
        try
          GetMem(bufRecv,2000);//2000 must >iBYTESEND
          Socket.ReceiveBuf(bufRecv^,iRecvLength);
          fsRecv.WriteBuffer(bufRecv^,iRecvLength);
        finally
          FreeMem(bufRecv,2000);
        end;{of try}
        bReadText:=true;
        Socket.SendText(MP_NEXTWILLBEDATA);
      end;
    end;Client程序:
    放上以下控件:edtIPAddress,OpenDialog1,btnConnect,btnSendFile,
    cs. (TClientSocket)btnConnect.OnClick(Sender:TObject);
    begin
    cs.Address:=edtIPAddress.Text;
    cs.Port:=2000;
    cs.Connect;
    end;btnSendFile.OnClick(Sender:TObject);
    begin
    if OpenDialog1.Execute then
    Begin
    cs.Socket.SendText(MP_QUERY+OpenDialog1.FileName);//FileSize???
    end; 
    end;cs.OnRead(Sender: TObject;Socket: TCustomWinSocket);
    var
      sTemp:string;
      bufSend:pointer;
    begin
      sRecv:=Socket.ReceiveText;
      Case sRecv[1] of
        MP_REFUSE:
          ShowMessage(’Faint,be refused!’);
        MP_ACCEPT:
         begin
           fsSend:=TFileStream.Create(OpenDialog1.FileName,fmOpen);
           //iBYTEPERSEND是个常量,每次发送包的大小。
           Socket.SendText(MP_FILEPROPERTY+Trunc(fsSend.Size/iBYTEPERSEND)+1);
         end;
        MP_NEXTWILLBEDATA:
          begin
            Socket.SendText(MP_NEXTWILLBEDATA);
          end;
        MP_DATA:
          begin
            try
              GetMem(bufSend,iBYTEPERSEND+1);
              if (fsSend.Position+1+iBYTEPERSEND) < fsSend.Size then
              begin
                fsSend.Read(bufSend^,iBYTEPERSEND);
                Socket.SendBuf(bufSend^,iBYTEPERSEND);
                fsSend.Free;
              end//普通的发送,大小为iBYTEPERSEND
              else begin
                fsSend.Read(bufSend^,fsSend.Size-fsSend.Position-1);
                Socket.SendBuf(bufSend^,fsSend.Size-fsSend.Position-1);
              end;//最后一次发送,发送剩余的数据
            finally
              FreeMem(bufSend,iBYTEPERSEND+1);
            end;{of try}
          end;
        MP_ABORT:
          begin
            //被取消了:(
            fsSend.Free;
          end;
    end;{of case}
    end;