안드로이드가 서버가 되고 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();
}
}