2013-02-28 2 views
0

현재 TCP를 통해 하나의 테스트 mp3 파일을 제공하는 C# 서버를 설정했습니다. 스트림이하여 TcpClient 클래스에서 수신C# 서버에서 Android로 스트리밍 MP3

public void btngo_click(View v) 
{ 
    final TcpClient client = new TcpClient(); 

    new Thread(new Runnable(){ 
     @Override 
     public void run() { 
      final MediaPlayer mediaPlayer = new MediaPlayer(); 
      client.GetStream(); 
      runOnUiThread(new Runnable(){ 
       public void run() 
       { 
        int length = client.GetLength(); 
        if(length > 0) 
        { 
         byte[] result = client.GetResult(); 
         try { 
          // create temp file that will hold byte array 
          File tempMp3 = File.createTempFile("test", "mp3", getCacheDir()); 
          tempMp3.deleteOnExit(); 
          FileOutputStream fos = new FileOutputStream(tempMp3); 
          fos.write(result); 
          fos.close(); 


          mediaPlayer.reset(); 

          FileInputStream fis = new FileInputStream(tempMp3); 
          mediaPlayer.setDataSource(fis.getFD()); 

          mediaPlayer.prepare(); 
          mediaPlayer.start(); 
         } catch (IOException ex) { 
          String s = ex.toString(); 
          ex.printStackTrace(); 
         } 

        } 
       } 
      }); 

     } 
    }).start(); 

} 

: 나는 버튼 클릭에 서버를 호출을 만드는 중이라서 설정 내 테스트 안드로이드에서

public void RunStreamer() 
    { 
     log.MakeLog("Starting streamer"); 
     Run = true; 
     //Need to look into how to thread this to not block the main window 
     TcpListener listen = new TcpListener(localAddr, _port); 
     listen.Start(); //startlistening to client requests 

      //blocks until a client request comes in 
     for (; ;) 
     { 
      Socket socket = listen.AcceptSocket(); 
      if (socket.Connected) 
      { 

       SendFileToClient(socket); 
       socket.Disconnect(false); 
      } 
     } 

    } 

    void SendFileToClient(Socket socket) 
    { 
     log.MakeLog("Connection made"); 
     NetworkStream netStream = new NetworkStream(socket); 
     StreamWriter writer = new StreamWriter(netStream); 
     //Todo - set specfified file - this file just for test 
     FileStream filestream = File.Open(@"C:\MusicTest\Test.mp3", FileMode.Open, FileAccess.Read, FileShare.Read); 
     filestream.CopyTo(netStream); 
     netStream.Flush(); 
     netStream.Close(); 


    } 

을 다음과 같이 파일을 전송하는 코드는

public class TcpClient { 

public final static String SERVER_ADDRESS = "127.0.0.1"; 
public final static int SERVER_PORT = 65000; 
public String TotalResult; 
public int Length; 
byte[] result = new byte[21000000]; 


public TcpClient() 
{ 



} 

public int GetLength() 
{ 
    return Length; 

} 

public byte[] GetResult() 
{ 

    return result; 

} 

public void GetStream() 
{ 
    try 
    { 

     final Socket socket = new Socket("192.0.0.5", 85000); 
     final InputStream input = new BufferedInputStream(socket.getInputStream()); 
     ByteArrayOutputStream buffer = new ByteArrayOutputStream(); 

     int nread; 


     while((nread = input.read(result, 0, result.length)) != -1) 
     { 

      buffer.write(result, 0, nread); 
     } 
     buffer.flush(); 

     //input.read(result); 
     Length = result.length; 


     input.close(); 
     socket.close(); 

    } catch (UnknownHostException e) { 
     String exc = e.getMessage(); 
     e.printStackTrace(); 
    } catch (IOException e) { 
     String exc2 = e.getMessage(); 
     e.printStackTrace(); 
    } 

} 

} 여기에 모든 코드에 대한 사과와

내 문제는 다음과 같이한다입니다 .

스트림을 수신합니다. 임시 MP3 파일이 생성되고 미디어 플레이어가 시작됩니다. 그런 다음 테스트 MP3 파일 (전체 노래)의 짧은 발췌 부분 만 가져옵니다. 그것은 또한 조금 뛰어 오른다. 길이가 같지 않고 연주되는 곡의 섹션이 매번 다릅니다.

어떻게 전체 파일을 순서대로 재생하여 노래를 완전히 재생할 수 있습니까?

나는 이것에 대해 주위를 둘러 보았고 클라이언트 컴퓨터에 어떤 파일 크기를 의심해야하는지 생각한 다음 모든 데이터가 수신 될 때까지 루프를 수행해야한다고 생각했습니다. 그것은 올바른 해결책입니다.

내가 잘못 가고있는 부분이나 해결할 수있는 부분에 대한 정보는 크게 감사하겠습니다 !!

+0

Wi-Fi를 통한 것이라고 가정합니다. – MyCodeSucks

+0

예 wi-fi 이상입니다. 동일한 결과를 바탕으로 데스크톱과 휴대 전화의 에뮬레이터에서 테스트를 마쳤습니다. – Luthervd

답변

0

이것에 대한 답변을 얻지 못했습니다. 두 가지가 잘못되었습니다. 먼저 스트림의 크기를 스트림에 int 크기 헤더로 포함하지 않았습니다. 작은 파일의 경우에는 문제가되지 않지만 파일 크기가 커지면 전체 스트림을 수신해야합니다.

이것은 차례로 다른 문제를 제기했습니다. 내가 byte [] 형식으로 보내는 int는 Java에서 올바른 값을 반환하지 않았습니다. Java는 sbytes -128 ~ 127 범위를 바이트와 반대로 사용합니다. 그런 다음 int로 변환 할 수있는 약간의 코드가 필요했습니다. 독자가 바이트 [] 버퍼를 예상 한 스트림의 실제 크기로 전달하는 방법을 지시 할 수 있습니다. MP3 파일이 수신되고 정상적으로 재생됩니다.

관련 문제