마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드가 서버가 되고 PC가 클라이언트가 되어서 파일을 전송해야 되요

0 추천

안드로이드가 서버가 되고 PC가 클라이언트가 되는데요..

안드로이드 앱에는 플레이, 정지 버튼 두개가 있고 아래쪽에 서피스 뷰로 동영상을 보여주는데

플레이를 클릭하면 동영상이 재생되면서 PC쪽으로 재생중인 동영상이 전송 되요.

그래서 앱을 만들고 있는데 TCP연결은 된거 같은데 파일 전송이 안되네요... 

아래 소스 보고 잘못된 부분 지적 좀 해주세요.

<<Android Server>>

package com.example.testmedia;

import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

import android.annotation.TargetApi;
import android.app.Activity;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnVideoSizeChangedListener;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity implements SurfaceHolder.Callback {
	private SurfaceView mPreview;
	private SurfaceHolder mHolder;
	MediaPlayer mPlayer;
	Button mPlayBtn;
	String videoName= null;


	protected void onCreate(Bundle savedInstanceState) {    	
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		mPreview = (SurfaceView) findViewById(R.id.surface);
		mHolder = mPreview.getHolder();
		mHolder.addCallback(this);               
		mPlayBtn = (Button) findViewById(R.id.play);
		
	}

	public void mOnClick(View v) {
		switch(v.getId()) {
		case R.id.play:
			if(mPlayer.isPlaying() == false) {
				mPlayer.start();
				mPlayBtn.setText("Pause");	
				videoName = "testvideo";
				new MyTask().execute();
			}else {
				mPlayer.pause();
				mPlayBtn.setText("Play");
			}
			break;
		case R.id.stop:
			mPlayer.stop();
			try {
				mPlayer.prepare();
			} catch (Exception e) {;}
			break;
		}
	}


	@Override
	public boolean onCreateOptionsMenu(Menu menu) {

		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// Handle action bar item clicks here. The action bar will
		// automatically handle clicks on the Home/Up button, so long
		// as you specify a parent activity in AndroidManifest.xml.
		int id = item.getItemId();
		if (id == R.id.action_settings) {
			return true;
		}
		return super.onOptionsItemSelected(item);
	}


	@Override
	public void surfaceCreated(SurfaceHolder holder) {
		if (mPlayer == null) {
			mPlayer = new MediaPlayer();			
		}else {
			mPlayer.reset();
		}
		try {
			String sd = Environment.getExternalStorageDirectory().getAbsolutePath();
			mPlayer.setDataSource(sd + "/testvideo.mp4");
			mPlayer.setDisplay(holder);
			mPlayer.prepare();
			mPlayer.setOnCompletionListener(mComplete);
			mPlayer.setOnVideoSizeChangedListener(mSizeChange);			
		}catch(Exception e) {
			Toast.makeText(MainActivity.this, "error : " + e.getMessage(), Toast.LENGTH_LONG).show();
		}

	}

	MediaPlayer.OnCompletionListener mComplete = new MediaPlayer.OnCompletionListener() {		
		@Override
		public void onCompletion(MediaPlayer mp) {
			mPlayBtn.setText("Play");			
		}
	};

	MediaPlayer.OnVideoSizeChangedListener mSizeChange = new OnVideoSizeChangedListener() {
		public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {			
		}
	};


	@Override
	public void surfaceChanged(SurfaceHolder holder, int format, int width,
			int height) {
		// TODO Auto-generated method stub
	}


	@Override
	public void surfaceDestroyed(SurfaceHolder holder) {
		// TODO Auto-generated method stub
	}

	protected void onDestroy() {
		super.onDestroy();
		if(mPlayer != null) {
			mPlayer.release();
		}
	}

	private class MyTask extends AsyncTask<Void, Void, Void> {
		@Override
		protected Void doInBackground(Void... params) {
			ServerSocket serverSocket = null;
			Socket socket = null;	
			try {
				serverSocket = new ServerSocket(7777);
				while(true) {
					socket = serverSocket.accept();
					PrintWriter out = new PrintWriter(new BufferedWriter(new
							OutputStreamWriter(socket.getOutputStream())), true);
					out.println(videoName);
					
					out.flush();

					DataInputStream dis = new DataInputStream(new
							FileInputStream(new File("/mnt/sdcard/"+videoName+".mp4")));
					DataOutputStream dos = new
							DataOutputStream(socket.getOutputStream());
					byte[] buf = new byte[4096];
					while(dis.read(buf)>0)
					{
						dos.write(buf);
						dos.flush();
					}
					videoName = null;
					dos.close();

				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			return null;
		}
	}
}

 

 

<<PC Client>>

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;


public class Client extends Thread{
	private static final String serverIP = "192.168.56.101";
	private static final int serverPort = 7777;
	Socket socket;
	int count = 0;

	public Client () {
		try {
			InetAddress serverAddr = InetAddress.getByName(serverIP);
			socket = new Socket(serverAddr, serverPort);
			System.out.println(socket.isConnected());
			start();


		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public void run() {
		while(true) {		
			BufferedReader in;
			String str = null;
			try {
				in = new BufferedReader(new
						InputStreamReader(socket.getInputStream()));			
				str = in.readLine();
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}

			System.out.println(str + " str ");
			try {

				File f = new File("d:\\down\\", "sample.mp4");
				FileOutputStream output = new FileOutputStream(f);
				byte[] buf = new byte[4096];   
				//			System.out.println(count);
				while(socket.getInputStream().read(buf)>0)
				{				
					output.write(buf);
					output.flush();
				}
				//			in.close();
				output.close();
				//			System.out.println("sample.jpg 수신완료");
			}catch (IOException e) {
				e.printStackTrace();
			}
		}	
	}

	public static void main(String[] args) {
		new Client();
	}
}

 

익명사용자 님이 2014년 5월 14일 질문
비디오를 재생하지 않은 상태에서는 파일 전송이 되나요?

1개의 답변

0 추천
문제 해결 했습니다. 파일을 쪼개서 보내지 않고 보내기 통째로 버퍼에 넣어서 보내니 파일이 정상적으로 수신되네요.
익명사용자 님이 2014년 5월 14일 답변
한번에 어떻게 보내신거에요??
...