2013-06-28 2 views
0

Это кодированиеПожалуйста, помогите, как отправлять изображения с клиента на сервер?

procedure TForm1.IdTCPServerExecute(AThread: TIdPeerThread); 
var 
    InputString: string; 
    ACommand: string[1]; 
    AFileName: string; 
    ATempFileName: string; 
    AFileStream: TFileStream; 
begin 
    InputString := UpperCase(AThread.Connection.ReadLn); 
    ACommand := Copy(InputString, 1, 1); 
    AFileName := FPicFilePath + Copy(InputString, 2, 5) + '.jpg'; 

    if ACommand = 'R' then begin 
    AFileStream := TFileStream.Create(AFileName, fmOpenRead + fmShareDenyNone); 

    try 
     AThread.Connection.WriteStream(AFileStream, true, true); 
    finally 
     AFileStream.Free; 
    end; 
    end else if ACommand = 'S' then begin 
    ATempFileName := FPicFilePath + 'TEMP.jpg'; 

    if FileExists(ATempFileName) then 
     DeleteFile(ATempFileName); 

    AFileStream := TFileStream.Create(ATempFileName, fmCreate); 

    try 
     AThread.Connection.ReadStream(AFileStream, -1, false); 
     //RenameFile(ATempFileName, AFileName); 
    finally 
     AFileStream.Free; 
    end; 
    end; 

    AThread.Connection.Disconnect; 
end; 

мой сервер И это мой клиент кодирование

procedure TForm1.SendImageToServer(ASendCmd: string); 
var 
    AFileStream: TFileStream; 
begin 
    MessageDlg('Sending ' + ASendCmd + ' :' + FSendFileName, mtInformation, [mbOK], 0); 
    Screen.Cursor := crHourGlass; 

    with IdTCPClient do begin 
    if Connected then Disconnect; 
    Host := '127.0.0.1'; 
    Port := 2108; 

    AFileStream := TFileStream.Create(FSendFileName, fmOpenRead); 

    try 
     try 
     Connect; 
     try 
      WriteLn(ASendCmd); 
      WriteStream(AFileStream, true, false); 
     finally 
      Disconnect; 
     end; 
     finally 
     AFileStream.Free; 
     end; 
    except 
    end; 
    end; 

    Screen.Cursor := crDefault; 
end; 

Я могу успешно получить изображения с сервера, но когда я должен был послать новый образ обратно на сервер, я просто был пустой TEMP.jpg.

Пожалуйста, помогите. Спасибо.

Delphi 5, Indy 9

+0

Я подозреваю, что вы должны отправить длину файла заранее. Процитируйте ваш файл справки indy9 о 'AThread.Connection.ReadStream' –

+0

Я думаю, что только клиент должен вызывать метод' Disconnect'. Зачем использовать 'Disconnect' как сервер, так и клиентскую сторону? – AndreaBoc

+0

@ Arioch'The: OP устанавливает параметр «AWriteByteCount» WriteStream() в true на стороне сервера, поэтому он отправляет длину файла заранее, но он не делает то же самое на стороне клиента, хотя сервер ожидает этого. –

ответ

0

При передаче файла от клиента к серверу, клиент не говорит WriteStream() отправить размер потока, но сервер говорит ReadStream() ожидать размер потока, чтобы прибыть, поэтому у вас есть несоответствие.

При отправке файла с сервера клиенту сервер сообщает WriteStream() для отправки размера потока, а клиент сообщает ReadStream(), чтобы ожидать, что размер потока будет получен, поэтому нет никакого несоответствия.

 Смежные вопросы

  • Нет связанных вопросов^_^