2012-12-10 1 views
5

서버와 클라이언트의 파일 이름이 완전히 동일하도록 파일 이름이 포함 된 파일을 서버로 보낼 수있는 간단한 방법이 있습니까? 여기 QTCPSocket을 통해 파일 이름과 함께 파일을 보내는 방법은 무엇입니까?

보낸 사람 내 코드 수신기

QString path = QApplication::applicationDirPath()+"/belajardansa.bmp"; 
QFile inputFile(path); 
QByteArray read ; 
inputFile.open(QIODevice::ReadOnly); 
while(1) 
{ 
    read.clear(); 
    read = inputFile.read(32768*8); 
    qDebug() << "Read : " << read.size(); 
    if(read.size()==0) 
     break; 
    qDebug() << "Written : " << socket->write(read); 
    socket->waitForBytesWritten(); 
    read.clear(); 
} 
inputFile.close(); 

입니다
QTcpSocket* socket = static_cast<QTcpSocket*>(sender()); 
QBuffer* buffer = buffers.value(socket); 

QByteArray read = socket->read(socket->bytesAvailable()); 
qDebug() << "Read : " << read.size(); 

QFile file( ???); // what should I put in the bracket??? 
if(!(file.open(QIODevice::Append))) 
{ 
    qDebug("File cannot be opened."); 
    exit(0); 
} 
file.write(read); 
file.close(); 

답변

5
  1. 당신은 파일 내용 및 파일 이름을 나타내는 및 변환됩니다 자신의 데이터 구조를 만들 수 있습니다 QByteArray 및 그 반대로.

  2. 두 가지 요청을 보낼 수 있습니다. 첫째는 파일 이름이고 두 번째는 데이터입니다.

+0

당신의 반응에 감사드립니다. 행크 첫 제안은 나에게 조금 복잡합니다. 나는 C++과 Qt에서 초보자이기 때문에. 데이터 구조를 QByteArray로 변환하는 샘플 코드를 줄 수 있습니까? 두 번째 제안에 대해 소켓 데이터에 파일 이름이나 데이터가 포함되어 있는지 서버에서 인식 할 수 있도록 소켓 데이터를 어떻게 처리해야하는지. –

5

정말 간단한 방법은 없습니다. 자신의 프로토콜을 만들어야합니다. 그러나, 그 프로토콜은 종종 매우 간단한 프로토콜 일 수 있습니다. 파일이 포함 된 QByteArray에서 바이트를 소켓으로 진 INT

  • 쓰기로 QByteArray의 길이를 소켓으로 QString::toUtf8()
  • 쓰기를 사용하여 QByteArray에, 간단한 예를

    1. 변환 QString 파일 이름을 최종 작성에

      이름

    2. 파일의 길이를 이진수로 쓰기
    3. 파일에서 바이트를 쓰려면
    4. 닫기
    5. 읽기 말에

    :

    1. 파일 이름의 읽기 정수 텔링 길이
    2. QString에 QByteArray에서 QByteArray
    3. 변환 파일 이름 바이트 사용하는 것이 읽기 QString::fromUtf8()
    4. 데이터의 길이를 알리는 정수 읽기
    5. 바이트 읽기 및 파일 쓰기 당신은
    6. 닫기 바이트는

    다른 컴퓨터간에 통신 할 경우, 쓰기, 읽기, 당신이 쓰기 전에 네트워크 바이트 순서로 변환해야하고, 다시 읽은 후 바이트 순서를 호스트하는 것을 가지고 때까지. 당신은 또한 "x86 바이트 순서"를 사용하고, 다른 CPU를 가진 데이터를 읽는 누군가가 변환 할 필요가 있다고 정의 할 수도 있습니다. ...

  • +0

    귀하의 반응에 대해 고맙습니다. 귀하의 제안은 시도하는 데 매우 유용하게 보입니다. 그러나 초보자로서 나를 위해 한 가지 문제가있다. 들어오는 소켓 데이터를 어떻게 처리하여 해당 프로토콜의 올바른 단계로 데이터를 넣을 수 있습니까? (우리는 TCP 서면 데이터가 일부 패키지로 전송된다는 것을 알고 있습니다.) –

    +0

    TCP/IP는 스트림 프로토콜이므로 패킷이 아닌 바이트를 쓰고 읽습니다. 또한 모든 바이트의 순서와 전송을 보장합니다. 그래서 당신은 똑같은 순서로 똑같은 바이트를 얻을 것이라는 것을 믿을 수 있습니다 (또는 에러와 단절을 얻습니다). TCP/IP는 패킷 크기를 제공하지 않고 단지 바이트 스트림을 제공하기 때문에 소켓에 ​​자체 "패킷 크기"를 써야하는 이유이기도합니다. – hyde

    +0

    지금 확인해보세요 :) 감사합니다. –

    관련 문제