2016-03-20 9 views
0

C#でのPCサーバでは、コードは、以下のTCP IPのAndroidクライアント(電話)と私はC#で記述されたPCサーバに自分の携帯電話から大きなファイルを送信したい

クライアント側です。

File sdFile=new File(mRcordFilePath); 

    byte[] mybytearray = new byte[(int) sdFile.length()]; 
    FileInputStream fis = null; 
    try { 
     fis = new FileInputStream(sdFile); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 
    BufferedInputStream bis = new BufferedInputStream(fis); 
    DataInputStream dis = new DataInputStream(bis); 
    OutputStream os; 

    try { 

     os = socket.getOutputStream(); 
     DataOutputStream dos = new DataOutputStream(os); 
     String name=sdFile.getName(); 
     dos.writeUTF(name); 
     dos.writeLong(mybytearray.length); 
     int read; 
     while((read = dis.read(mybytearray)) != -1) { 
      dos.write(mybytearray, 0, read); 
     } 

     Toast.makeText(getApplicationContext(), 
       "Veri Gönderildi !", Toast.LENGTH_SHORT).show(); 
    } catch (UnknownHostException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

サーバー側。

サーバの一部。

  int fileNameLen = 1; 
      String content = String.Empty; 
      StateObject state = (StateObject)ar.AsyncState; 
      Socket handler = state.workSocket; 
      int bytesRead = handler.EndReceive(ar); 
      if (bytesRead > 0) 
      { 

       if (flag == 0) 
       { 
        fileNameLen = BitConverter.ToInt32(state.buffer, 0); 
        string fileName = Encoding.UTF8.GetString(state.buffer, 4, fileNameLen); 
        receivedPath = @"C:\Users\Hankishan\Desktop\kayıtlar\" + fileName; 
       flag++; 
      } 
      if (flag >= 1) 
      { 
       BinaryWriter writer = new BinaryWriter(File.Open(receivedPath, FileMode.Append)); 
       if (flag == 1) 
       { 
        writer.Write(state.buffer, 4 + fileNameLen, bytesRead - (4 + fileNameLen)); 
        flag++; 
       } 
       else 
       writer.Write(state.buffer, 0, bytesRead); 
       writer.Close(); 
       handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, 
       new AsyncCallback(ReadCallback), state); 
      } 

     } 
     else 
     { 
      Invoke(new MyDelegate(LabelWriter)); 
     } 

(インスタンス123.wav用)ファイルを受信しながら、私はこのコード、 を実行する場合、この列に誤りがあります。

string fileName = Encoding.UTF8.GetString(state.buffer, 4, fileNameLen); 

コードを次のように変更します。

fileNameLen = state.buffer[1]; 
string fileName = Encoding.UTF8.GetString(state.buffer, 2, fileNameLen); 

はokです。しかし、この時点で受信したファイルが破損している、PCで再生されていない、 私は何ができますか?何が問題ですか?

答えて

0

私はこの問題を解決しました。コードはここにあります。

公共ボイドReadCallback(たIAsyncResultのAR)

{

  int fileNameLen = 1; 
      String content = String.Empty; 
      StateObject state = (StateObject)ar.AsyncState; 



      Socket handler = state.workSocket; 
      int bytesRead = handler.EndReceive(ar); 

      if (bytesRead > 0) 
      { 
       if (flag == 0) 
       { 
        fileNameLen = state.buffer[1]; 
        //fileNameLen = BitConverter.ToInt32(state.buffer, 0); 
        string fileName = Encoding.UTF8.GetString(state.buffer, 2, fileNameLen); 
        receivedPath = @"C:\Users\Hankishan\Desktop\kayitlar\" + fileName; 
       flag++; 
      } 
      if (flag >= 1) 
      { 
       BinaryWriter writer = new BinaryWriter(File.Open(receivedPath, FileMode.Append)); 
       if (flag == 1) 
       { 

        writer.Write(state.buffer, 2 + fileNameLen, bytesRead - (2 + fileNameLen)); 
        flag++; 
       } 
       else 
       { 
        if (flag == 2) 
        { 
         for (int i = 0; i < state.buffer.Length; i++) 
         { 
          if (i + 8 == 1023) 
           break; 
          state.buffer[i] = state.buffer[i + 8]; 
         } 
         writer.Write(state.buffer, 0, bytesRead); 
         flag++; 
        }else 
         writer.Write(state.buffer, 0, bytesRead); 
       } 
       writer.Close(); 
       handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, 
       new AsyncCallback(ReadCallback), state); 
      } 

     } 
     else 
     { 
      Invoke(new MyDelegate(LabelWriter)); 
     } 

     } 
関連する問題